单片机控制步进电机.docx
《单片机控制步进电机.docx》由会员分享,可在线阅读,更多相关《单片机控制步进电机.docx(17页珍藏版)》请在冰豆网上搜索。
单片机控制步进电机
单片机控制步进电机
步进电机是机电控制中一种常用的执行机构,它的用途是将电脉冲转化为角位移,通俗地说:
当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。
通过控制脉冲个数即可以控制角位移量,从而达到准确定位的目的;同时通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
T89C2051单片机驱动步进电机的电路和源码
程序
stepper.cstepper.hex
/**STEPPER.C*sweepingstepper''srotorcwandcww400steps*Copyright(c)1999byW.Sirichote*/
#includec:
\mc51\8051io.h/*includei/oheaderfile*/#includec:
\mc51\8051reg.h
registerunsignedcharj,flag1,temp;registerunsignedintcw_n,ccw_n;
unsignedcharstep[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90}#definen400
/*flag1maskbyte0x01runcw()0x02runccw()*/
main()
{flag1=0;serinit(9600);dISAble();/*noneedtimerinterrupt*/cw_n=n;/*initialstepnumberforcw*/flag1|=0x01;/*initialenablecw()*/
while
(1){{tick_wait();/*waitfor10mselapsed*/
energize();/*round-robinexecutionthefollowingtasksevery10ms*/cw();ccw();}}
}
cw(){if((flag1&0x01)!
=0){cw_n--;/*decrementcwstepnumber*/if(cw_n!
=0)j++;/*ifnotzeroincrementindexj*/else{flag1&=~0x01;/*dISAblecw()execution*/ccw_n=n;/*reloadstepnumbertoccwcounter*/flag1|=0x02;/*enablecww()execution*/}}
}
ccw(){if((flag1&0x02)!
=0){ccw_n--;/*decremnentccwstepnumber*/if(ccw_n!
=0)j--;/*ifnotzerodecrementindexj*/else{flag1&=~0x02;/*dISAbleccw()execution*/cw_n=n;/*reloadstepnumbertocwcounter*/flag1|=0x01;/*enablecw()execution*/}}
}
tick_wait(){/*cputickwasreplacedbysimplerASMcode10mswait*/
asm"JNBTCON.5,*";/*waitforTF0set*/asm"CLRTCON.5";/*clearTF0forfurtherset*/asm"ORLTH0,#$DC";/*reloadTH0with$DC,TL0=0*/}
energize(){
P1=step[(j&0x07)];/*onlystep0-7needed*/}
一、步进电机常识
常见的步进电机分三种:
永磁式(PM),反应式(VR)和混合式(HB),永磁式步进一般为两相,转矩和体积较小,步进角一般为7.5度或15度;反应式步进一般为三相,可实现大转矩输出,步进角一般为1.5度,但噪声和振动都很大。
在欧美等发达国家80年代已被淘汰;混合式步进是指混合了永磁式和反应式的优点。
它又分为两相和五相:
两相步进角一般为1.8度而五相步进角一般为
0.72度。
这种步进电机的应用最为广泛。
二、永磁式步进电机的控制
下面以电子爱好者业余制作中常用的永磁式步进电机为例,来介绍如何用单片机控制步进电机。
图1是35BY型永磁步进电机的外形图,图2是该电机的接线图,从图中可以看出,电机共有四组线圈,四组线圈的一个端点连在一起引出,这样一共有5根引出线。
要使用步进电机转动,只要轮流给各引出端通电即可。
将COM端标识为C,只要AC、C、BC、C,轮流加电就能驱动步进电机运转,加电的方式可以有多种,如果将COM端接正电源,那么只要用开关元件(如三极管),将A、、B、轮流接地。
下表列出了该电机的一些典型参数:
表1 35BY48S03型步机电机参数型号步距角相数电压电流电阻最大静转距定位转距转动惯量35BY48S037.54120.2647180652.5
有了这些参数,不难设计出控制电路,因其工作电压为12V,最大电流为0.26A,因此用一块开路输出达林顿驱动器(ULN2003)来作为驱动,通过P1.4~P1.7来控制各线圈的接通与切断,电路如图3所示。
开机时,P1.4~P1.7均为高电平,依次将P1.4~P1.7切换为低电平即可驱动步进电机运行,注意在切换之前将前一个输出引脚变为高电平。
如果要改变电机的转动速度只要改变两次接通之间的时间,而要改变电机的转动方向,只要改变各线圈接通的顺序。
图1 35BY48S03型步进电机外形图
图2 35BY48S03型步进电机的接线图
图3 单片机控制35BY48S03型步进电机的电路原理图
三、步进电机的驱动实例
要求:
控制电路如图3所示,开机后,电机不转,按下启动键,电机旋转,速度为25转/分,按下加1键,速度增加,按下减1键,速度降低,最高速度为100转/分,最低转带为25转/分,按下停止键,电机停转。
速度值要求在数码管上显示出来。
1.要求分析
按上面的分析,改变转速,只要改变P1.0~P1.3轮流变低电平的时间即可达到要求,这个时间不应采用延时来实现,因为会影响到其他功能的实现。
这里以定时的方式来实现。
下面首先计算一下定时时间。
按要求,最低转速为25转/分,而上述步进电机的步距角为7.5,即每48个脉冲为1周,即在最低转速时,要求为1200脉冲/分,相当于50ms/脉冲。
而在最高转速时,要求为100转/分,即48000脉冲/分,相当于12.5ms/脉冲。
可以列出下表表1 步进电机转速与定时器定时常数关系速度单步时间(us)TH1TL1实际定时(us)255000076049996.826480778223648074.182746296898646292.612844643957344640.155……………10012500211012499.2
表中不仅计算出了TH1和TL1,而且还计算出了在这个定时常数下,真实的定时时间,可以根据这个计算值来估算真实速度与理论速度的误差值。
表中TH1和TL1是根据定时时间算出来的定时初值,这里用到的晶振是11.0592M。
有了上述表格,程序就不难实现了,使用定时/计数器T1为定时器,定时时间到后切换输出脚即可。
2.程序实现
定义DSB-1A实验板的S1为启动键,S2为停止键,S3为加1键,S4为减1键,程序如下:
StartEndbit
01H;起动及停止标志MinSpd
EQU25
;起始转动速度MaxSpd
EQU100;最高转动速度Speed
DATA23H;流动速度计数DjCount
DATA24H;控制电机输出的一个值,初始为11110111HiddenEQU10H;消隐码CounterDATA57H;显示计数器DISPBUFDATA58H;显示缓冲区
ORG
0000H
AJMP
MAINORG000BHJMPDISPORG001BHJMPDJZD
ORG
30HMAIN:
MOV
SP,#5FH
MOV
P1,#0FFHMOVA,#HiddenMOVDispBuf,AMOVDispBuf+1,AMOVDispBuf+2,A
MOVDjCount,#11110111B
MOV
SPEED,#MinSpd;起始转动速度送入计数器
CLR
StartEnd;停转状态MOVTMOD,#00010001B;MOVTH0,#HIGH(65536-3000)MOVTL0,#LOW(65536-3000)MOVTH1,#0FFH;MOVTL1,#0FFHSETBTR0SETBEASETBET0SETBET1
LOOP:
ACALL
KEY
;键盘程序
JNB
F0,m_NEXT1;无键继续
ACALL
KEYPROC
;否则调用键盘处理程序m_NEXT1:
MOVA,SpeedMOVB,#10DIVABMOVDispBuf+5,B;最低位MOVB,#10DIVABMOVDispBuf+4,BMOVDispBuf+3,AJBStartEnd,m_Next2CLRTR1;关闭电机JMPLOOPORLP1,#11110000Bm_Next2:
SETBTR1;启动电机
AJMP
LOOP
;主程序结束;---------------------------------------D10ms:
……;---------延时程序,键盘处理中调用KEYPROC:
MOV
A,B
;获取键值
JB
ACC.2,StartStop
;分析键的代码,某位被按下,则该位为1
JB
ACC.3,KeySty
JB
ACC.4,UpSpd
JB
ACC.5,DowSpd
AJMP
KEY_RETStartStop:
SETBStartEnd
;启动
AJMP
KEY_RETKeySty:
CLRStartEnd;;停止
AJMP
KEY_RETUpSpd:
INC
SPEED;
MOV
A,SPEED
CJNE
A,#MaxSpd,K1;到了最多的次数?
DEC
SPEED;是则减去1,保证下次仍为该值K1:
AJMP
KEY_RETDowSpd:
DEC
SPEED
MOV
A,SPEED
CJNE
A,#MAXSPD,KEY_RET;不等(未到最大值),返回MOVSPEED,#MinSpd;KEY_RET:
RET
KEY:
……获取键值的程序
RET
DjZd:
;定时器T1用于电机转速控制PUSHACCPUSHPSWMOVA,SpeedSUBBA,#MinSpd;减基准数MOVDPTR,#DjHMOVCA,@A+DPTRMOVTH1,AMOVA,SpeedSUBBA,#MinSpdMOVDPTR,#DjLMOVCA,@A+DPTRMOVTL1,AMOVA,DjCountCPLAORLP1,AMOVA,DjCountJNBACC.7,d_Next1JMPd_Next2d_Next1:
MOVDjCount,#11110111Bd_Next2:
MOVA,DjCountRLAMOVDjCount,A;回存ANLP1,APOPPSWPOPACCRETI
DjH:
DB76,82,89,95,100,106,110,115,119,123,12……DjL:
DB0,236,86,73,212,0,214,96,163,165……
DISP:
;显示程序POPPSWPOPACC……RETIBitTab:
DB7Fh,0BFH,0DFH,0EFH,0F7H,0FBHDISPTAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFHEND
3.程序分析
本程序主要由键盘程序、显示器程序、步进电机驱动程序三部份组成,主程序首先初始化各变量,将显示器的高3位消隐,步进电机驱动的各引脚均输出高电平,然后调用键盘程序,并作判断,如果有键按下,则调用键盘处理程序,否则直接转下一步。
下一步是将当前的转速值转换为BCD码,送入显示缓冲区;接着判断StartEnd这个位变量,是“1”还是“0”,如果是“1”,则开启定时器T1,否则关闭定时器T1,为防止关闭时某一相线圈长期通电,因此,在关闭定时器T1时,将P1.0~P1.3均置高。
至此,主程序的工作即结束。
这里为简便起见,这里没有做高位“0”消隐的工作,即如果速度为10转/分,则显示值“010”,读者可以自行加入相关的代码来处理这一工作。
步进电机的驱动工作是在定时器T1的中断服务程序中实现的,由前述分析,每次的定时时间到达以后,需要将P1.0~P1.3依次接通,程度中用了一个变量DjCntr来实现这一功能,在主程序初始化时,该变量被赋予初值11110111B,进入到定时中断以后,将该变量取出送ACC累加器,并在累加器中进行左移,这样,该数值就变为11101111,然后将该数与P1相“与”,此时,P1.4即输出低电平,第二次进入中断时,先将该数取反,成为0001 0000,然后将该数与P1相“或”,这样,P1.4即输出高电平,关断了相应的线圈,然后将该数重新取出,并作左移,即 1110,1111右移成为1101 1111,将该数与P1相“与”,这样P1.5即输出低电平,依次类推,P1.7~P1.4即循环输出低电平。
当这一数据变为01111111后,需要作适当的改动,将数据重新变回 1111 0111,进行第二次循环,相关代码,请读者自行分析。
定时时间又是如何确定的呢?
这里用的是查表的方法,首先用Excel计算得出在每一种转速下的TH值和TL值,然后,分别放入DjH和DjL表中,在进入T1中断程序之后,将速度值变量Speed送入累加器ACC,然后减去基数25,使其基数从0开始计数,然后分别查表,送入TH1和TL1,实现重置定时初值的目的。
看完这一部份内容以后,请读者自行完成以下工作:
1.更改程序,将S1定义为“启动/停止”,而S2定义为“方向”,按下S2,切换电机旋转方向。
2.更改程序,要求转速从1到100。
3.更改程序,实现首位无效零消隐
-----------------------------------------------3--------------------------------------------
步进电机的单片机控制
作者:
李通刘志垠
摘要:
本设计采用凌阳16位单片机SPCE061A对步进电机进行控制,通过IO口输出的具有时序的方波作为步进电机的控制信号,信号经过芯片L298N驱动步进电机;同时,用4X4的键盘来对电机的状态进行控制,并用数码管显示电机的转速,采用74LS164作为4位单个数码管的显示驱动,从单片机输入信号;利用凌阳单片机的语音功能播报电机的转速。
关键词:
步进电机单片机数码管
一、方案论证与比较
1、本设计的重点在于对步进电机的控制和驱动,设计中受控电机为四相六线制的步进电机(内阻33欧,步进1.8度,额定电压12V)
方案一:
使用多个功率放大器件驱动电机
通过使用不同的放大电路和不同参数的器件,可以达到不同的放大的要求,放大后能够得到较大的功率。
但是由于使用的是四相的步进电机,就需要对四路信号分别进行放大,由于放大电路很难做到完全一致,当电机的功率较大时运行起来会不稳定,而且电路的制作也比较复杂。
方案二:
使用L298N芯片驱动电机
L298N芯片可以驱动两个二相电机(如图1-1),也可以驱动一个四相电机,输出电压最高可达50V,可以直接通过电源来调节输出电压;可以直接用单片机的IO口提供信号;而且电路简单,使用比较方便。
图1-1
通过比较,使用L298N芯片充分发挥了它的功能,能稳定地驱动步进电机,且价格不高,故选用L298N驱动电机。
而使用L298N时,可以用L297来提供时序信号,可以节省单片机IO口的使用;也可以直接用单片机模拟出时序信号,由于控制并不复杂,故选用后者。
2、数码管显示电路的设计
方案一:
串行接法
设计中要显示4位数字,用74LS164作为显示驱动,其中带锁存,使用串行接法可以节约IO口资源,但要使用SIO,发送数据时容易控制。
方案二:
并行接法
使用并行接法时要对每个数码管用IO口单独输入数据,占用资源较多。
由于设计中用一块单片机进行控制,资源有限,选择了方案一。
另外,使用锁存也起到节约资源的作用。
二、步进电机控制原理
步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。
步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB)。
步进电机区别于其他控制电机的最大特点是,它是通过输入脉冲信号来进行控制的,即电机的总转动角度由输入脉冲数决定,而电机的转速由脉冲信号频率决定。
步进电机的驱动电路根据控制信号工作,控制信号由单片机产生。
其基本原理作用如下:
(1)控制换相顺序
通电换相这一过程称为脉冲分配。
例如:
三相步进电机的三拍工作方式,其各相通电顺序为A-B-C-D,通电控制脉冲必须严格按照这一顺序分别控制A,B,C,D相的通断。
(2)控制步进电机的转向
如果给定工作方式正序换相通电,步进电机正转,如果按反序通电换相,则电机就反转。
(3)控制步进电机的速度
如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步。
两个脉冲的间隔越短,步进电机就转得越快。
调整单片机发出的脉冲频率,就可以对步进电机进行调速。
三、理论设计
综和以上选取的方案,总的流程如图3-2所示。
图3-1
1、步进电机驱动电路
通过L298N构成步进电机的驱动电路,电路图如图3-2所示。
通过单片机SPCE061A的IOB8~IOB13对L298N的IN1~IN4口和ENA、ENB口发送方波脉冲信号,起时序图如图3-3所示。
图3-2
图3-3
2、数码管显示电路的设计
数码管的显示驱动使用74LS164,通过SPCE061A的IOB0和IOB1口对DATA和CLK发送数据。
图3-4
3、4x4键盘电路
在设计中,使用了标准的4x4键盘,其电路图如图3-5所示。
单片机的A口低8位为键盘的接口。
尽管设计要求中只需要4个键对步进电机的状态进行控制,但考虑到对控制功能的扩展,我们使用了4x4的键盘。
图3-5
四、程序设计
在进行程序设计的过程中,主要分为五个部分:
双机通讯、语音报数、数字显示、步进电机驱动、键盘;其中双机通讯的实现和语音报时比较有特点,将其流程简要介绍如下,其他部分见附的程序。
1、双机通讯
图4-1
我们在实现双机通讯的过程中使用了“三次握手”的方式,这是Intle网中成用的数据通讯确认协议,其流程图如图4-1所示。
2、语音报数
程序设计中语音报数使用的是SACM-A2000,考虑到程序比较简单,首先使用了自动报数方式,但发现不能进行连续报数,于是使用了非自动方式,流程图如图4-2所示。
图4-2
五、结果分析与总结
应该说这次课程设计还是基本达到了设计的要求,但是也存在着未能解决的问题,由于在执行语音程序时对资源的消耗比较大,在语音报数的时候会中断步进电机驱动信号的输出,导致电机停转。
为此,我们修改了方案,使用了两块单片机,通过双机通讯来传递信号,遗憾的是问题仍然没有得到解决。
这次步进电机的综合实验我们学到了步进电机、数码管、4*4键盘、语音报数和双机通讯的使用,更重要的是学会了程序出问题时调试的方法,并养成了Debug的习惯,学到了程序出问题后怎样去解决的基本方法。