步进电机驱动模块设计
电机驱动模块设计
步进电机驱动模块设计
内容:
1步进电机及其控制原理
2步进电机驱动电路设计(经Proteus测试)
3 步进电机驱动程序设计
附录步进电机驱动程序
1 步进电机及其控制原理
步进电机是一种将电脉冲转化为角位移的数字控制执行机构。当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度逐步运行的【19】。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的,同时可以通过控制脉冲频率来控制电机转动速度和加速度,从而达到调速的目的。步进电机由于没有误差累积的特点而广泛应用于各种开环控制。
目前比较常用的步进电机包括反应式步进电机(VR)、永磁式步进电机(PM)、混合式步进电机(HB)等【20】。反应式步进电机一般为三相,可实现大转矩输出,步进角一般为1.5?,但噪声和振动都很大。永磁式步进电机一般为两相,转矩和体积较小,步进角一般为7.5?或15?。混合式步进电机是混合了永磁式和反应式的优点。它又分为两相和五相,两相步进角一般为1.8?而五相步进角一般为0.72?。这种步进电机的应用最为广泛。
步进电机必须使用步进电机驱动器才能工作。驱动器针对每一个步进脉冲,按一定的规律向电机各相绕组通电(励磁),以产生必要的转矩,驱动转子运动。步进电机系统的性能除与电机自身的性能有关外,还与驱动器的性能有很大关系
【21】。步进电机、驱动器和控制器构成了步进电机控制系统不可分割的三大部分,典型的步进电机控制系统如图4-1所示。
电机驱动模块设计
图4-1 步进电机控制系统
微控制器产生控制信号和脉冲信号,脉冲分配器将微控制器产生的信号脉冲转换成有一定逻辑关系的环形脉冲,功率放大器将脉冲分配器输出的环形脉冲放大,用于控制步进电机的转动。
步进电机的控制
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
常用的有以下三种【22】:
(1)分立控制方案
所谓分立控制就是用电阻、电容、电感等一些元件的组合实现一定的控制功能。传统的控制方法采用电阻、电容等这些分立元件与单片机的直接相连接,而这样就有如下弊端:
a.整个开关系统的可靠性得不到保证,不利于长期反复使用。
b.由分立元件设计的开关触点容易发生氧化,缩短了开关的使用寿命。
c.过多使用分立元件,浪费大量的单片机I/O资源,降低了CPU的利用率。 d.大量的使用分立元件,将影响整个系统的读取速度,不利于实时控制。
(2)单个集成芯片控制方案
随着制作工艺的发展,驱动电路部分已经做了很大的改进,开始由集成芯片代替分立元件的控制方案,较分立元件控制方案而言单个集成芯片的可靠性、读取速度、CPU的利用率都有了很大的提高,但是对于程序编写并没有太大方便性可言。
(3)联合集成芯片控制方案
使用联合集成电路芯片不仅可以避免分立元件控制方案的弊端,又可以大大减
化程序。
经过以上的比较,本轮椅床的步进电机控制方案选择联合集成芯片控制。 2步进电机驱动电路设计
由1节步进电机驱动选择联合集成芯片控制方案,其抗干扰性强,非常适合作为小功率步进电机的专用驱动芯片。在本设计中,选用了L297和L298集成电路作为步进电机的驱动芯片。
L297和L298可以方便的组成步进电机驱动控制器,其中L297是步进电机控制
电机驱动模块设计
【23】
器(包括环形分配器)。L297适用于双极性两相步进电机或单极性四相步进
电机的控制。此器件的特性是只需要时钟、方向和模式输入信号,相位是由内部产生的,因此可以减轻微处理器和程序设计的负担。L298是一种专用的步进电机驱动芯片,内部为双H桥结构,L298的H桥驱动器包含四个各自独立的推挽式驱动器(即四个半桥),可单独使用。用L297输出的信号可控制L298双H桥驱动集成电路,用来驱动电压为56V,每相电流为4A以下的步进电机。L297和L298组成的步进电机控制电路具有可靠性高、体积小、成本低和节约微处理器资源等优点。本设计的步进电机驱动原理图如图4-2所示。
图4-2 步进电机驱动电路图
L297是具有20个引脚的双列直插式塑胶封装的器件,采用固定斩波频率的PWM恒流斩波方式工作。L297主要由译码器、两个固定斩波频率的PWM恒流斩波器及输出逻辑控制组成。L297的核心是脉冲分配器,它可产生三种相序,对应三种不同的工作方式,即半步方式(HALFSTEP);基本步距(FULLSTEP,整步)一相激励方式;基本步距两相激励方式。译码器受L297的方向输入引脚信号CW/CCW和半步方式/整部方式输入引脚信号HALF/FULL所控制。译码器内部是一个3bit的计数器,加上一些组合逻辑,可产生每周期8步的格雷码时序
信号,三种方式的驱动相序都可以根据译码器输出的格雷码的顺序产生。格雷码的顺序直接与四相八拍(半步方式)相符,只要在19脚输入一个高电平即可得到半步方式相序。通过交替跳过八步顺序中的状态就可得到全步工作方式,此时在19脚输入一个低电平,即可根据译码器的状态得到单四拍或双四拍工作方式。
电机驱动模块设计
-3 半步方式相序图 图4
步进电机驱动器与ARM微处理器的接口如图4-2所示,采用ARM处理器的I/O口控制电机驱动器。GPG5端口接CW/CCW引脚,控制电机的旋转方向。GPG6端口接CLOCK引脚,控制步进时钟脉冲。GPG7端口接HALF/FULL引脚,当GPG7为高电平时,HALF有效,四相八拍;为低电平时,FULL有效,四相四拍。GPG8端口接RESET引脚,当GPG8端口输出为低电平时,译码器恢复初始状态。在本设计中,轮椅床采用步进电机的型号为35BYJ46,为四相步进电机,并采用四相八拍的工作方式。
利用Proteus对步进电机驱动电路进行测试,由于Proteus只支持ARM7系列的少数芯片(如LPC2124等),在这里利用时钟激励源代替S3C2410的I/O口输出时钟控制信号CLOCK,其他控制信号的输入由按键完成,旨在测试该驱动电路设计的正确性。步进电机驱动电路仿真原理图4-4如所示,在半步工作模态下电机每周期完成8个动作如图4-5所示。
电机驱动模块设计
图4-4 步进电机驱动电路仿真原理图
3 步进电机驱动程序设计
轮椅床的程序采用C语言编写,相对汇编语言编写具有程序清晰、可读性强、更易于模块化编写。整个轮椅床的程序分为主程序、步进电机驱动程序和传感器驱动程序三部分。其中主程序非常简单,只需调用目标板初始化程序sys_init(void)
即可完成目标板的初始化,并使用一个while循环语句等待。主程序流程图如图
4-6所示。
电机驱动模块设计
图4-6 主程序流程图
目标板初始化程序:
voidsys_init(void)
{
MMU_Init( ); // 存储器管理单元初始化
ChangeClockDivider(1,1); // FCLK:HCLK:PCLK=1:2:4
ChangeMpllValue(0xa1,0x3,0x1); // FCLK=202.8MHz
Port_Init( );
Timer1_init( );
Timer1INT_Init( );
ENT0_init( );
ENT0INT_Init( );
}
由4.2节步进电机驱动芯片与S3C2410的I/O口连接,可知GPG6须发送步进控制脉冲。方案采用定时中断的方法,即每半个周期产生一次中断,在中断服务子程序中使GPG6取反。定时器中断流程图如图4-7所示。在目标板初始化程序中已设定PCLK=1/4FCLK=50MHz,半个周期为1s.
分割PCLK :
rTCFK0=255;
rTCFK1=0<<4;
rTCMPB1=0x00; // 定时器比较寄存器设置
电机驱动模块设计
rTCNTB1=48828; // 定时器计数值缓冲寄存器设置,rTCNTB1=(50000000/4/256)
图4-7 定时器中断程序流程图
步进电机的控制通过外部中断0服务子程序完成。步进电机运行控制程序流程图如图4-8所示。
图4-8 步进电机运行控制程序流程图
电机驱动模块设计
附录
步进电机驱动程序:
//引入头文件
#include"2410 ADDR.h"
#include"2410 LIB.h"
#include"def.h"
#include<string.h>
//主程序
voidMain(void)
{
sys_init();
while(1);
}
//定时器1初始化
void Timer1_init(void)
{
rGPGCON=rGPGCON& 0xfff0ffff | 0x00050000;//配置GPG口为信号输出 rGPGDAT=rGPFDAT | 0x300;
rTCFG0=255;
rTCFG1=0<<4;
rTCNTB1=4883;//定时器计数值缓冲寄存器
rTCMPB1=0x00;//定时比较缓冲寄存器
rTCON=(1<<11)|(1<<9)|(0<<8);
rTCON=(1<<11)|(0<<9)|(1<<8);
}
//定时器1中断服务子程序
int flag;
void_irq Timer1_ISR(void)
电机驱动模块设计
{
if(flag==0)
{
rGPGDAT=rGPGDAT& 0xeff | 0x200;//GPG6输出一个高电平
flag=1;
}
else
{
rGPGDAT=rGPGDAT& 0xdff | Ox100;//GPG输出一个低电平
flag=0;
}
rSRCPND |=BIT_TIMER1;
rINTPND |=BIT_TIMER1;
}
//定时器1中断初始化程序
void Timer1INT_Init(void)
{
if((rINTPND& BIT_TIMER1))
{
rSRCPND |=BIT_TIMER1;
}
pISR_TIMER1=(int)Timer_ISR;
rINTMSK&=BIT_TIMER1;//开中断
}
//外部中断0中断服务子程序
void_irq Eint0_ISR(void)
{
int status;
rGPGCON=rGPGCON& 0xfff0ffff | 0x00050000;//配置GPG口为信号输出
if(GPF1==0) status=1;//开启
if(GPF2==0) status=2;//停止
电机驱动模块设计
if(GPF3==0) status=3;//换向
switch(status)//判断步进电机控制状态
{
case’1’://启动
Timer1_init();//定时器1初始化
Timer1INT_Init();//定时器1中断开启
break;
case’2’://停止
rGPGDAT=rGPGDAT& 0xf7f | 0x080;
break;
case’3’://换向
rGPGDAT=rGPGDAT& 0xfef | 0x010;
break;
}
//初始化程序
voidsys_init(void)
{
ChangeClockDivider(1,1);//FCLK:HCLK:PCLK=4:2:1
ChangeMPllValue(0xa1,0x2,0x1);//FCLK=202.8MHz Timer1_init( );
Timer1INT_Init( );
ENT0_init( );
ENT0INT_Init( );
}
电机驱动模块设计