步进电机课程设计.docx
- 文档编号:1873882
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:27
- 大小:373.81KB
步进电机课程设计.docx
《步进电机课程设计.docx》由会员分享,可在线阅读,更多相关《步进电机课程设计.docx(27页珍藏版)》请在冰点文库上搜索。
步进电机课程设计
单片机控制步进电机
摘要
步进电机将脉冲信号转换成的机械角位移和转速分别与输入电机绕组的脉冲个数和脉冲频率成比例,通过改变电脉冲频率,可在大范围内调速,同时,该电机还能快速起动、制动、反转.此外,步进电机易于实现与单片机机或其它数字元件接口,适用于数字控制系统,并可取得较高的控制精度,系统硬件实施比较简单。
步进电机是纯粹的数字控制电动机。
它将电脉冲信号转换成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。
近几十年来,数字技术、计算机技术和永磁材料的迅速发展,为步进电机的应用开辟了广阔的前景。
关键词:
步进电机,控制系统,脉冲信号,数字技术
1概述
1.1步进电机简介
步进电机是一种感应电机,它的工作原理是利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的,多相时序控制器。
虽然步进电机已被广泛地应用,但步进电机并不能象普通的直流电机,交流电机在常规下使用。
它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。
因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。
步进电机作为执行元件,是机电一体化的关键产品之一,广泛应用在各种自动化控制系统中。
随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。
1.2步进电机控制工作原理
步进电机实际上是一个数字\角度转换器,也是一个串行的数\模转换器。
步进电机的基本控制包括启停控制、转向控制、速度控制、换向控制4个方面。
从结构上看,步进电机分为三相、四相、五相等类型,常用的则以三相为主。
三相步进电机的工作方式有三相单三拍、三相双三拍和三相六拍3种。
1.3步进电机的启停控制
步进电机由于其电气特性,运转时会有步进感,即振动感。
为了使电机转动平滑,减小振动,可在步进电机控制脉冲的上升沿和下降沿采用细分的梯形波,可以减小步进电机的步进角,提高电机运行的平稳性。
在步进电机停转时,为了防止因惯性而使电机轴产生顺滑,则需采用合适的锁定波形,产生锁定磁力矩,锁定步进电机的转轴,使步进电机的转轴不能自由转动。
1.4步进电机的转向控制
如果给定工作方式正序换相通电,步进电机正转。
若步进电机的励磁方式为二六拍,即A-AB-B-BC-C-CA。
如果按反序通电换相,即则电机就反转。
其他方式情况类似。
1.5步进电机的速度控制
如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步。
2个脉冲的间隔越短,步进电机就转得越快。
调整送给步进电机的脉冲频率,就可以对步进电机进行调速。
1.6步进电机的换向控制
步进电机换向时,一定要在电机减速停止或降到突跳频率范围之内再换向,以免产生较大的冲击而损坏电机。
换向信号一定要在前一个方向的最后一个脉冲结束后以及下一个方向的第1个脉冲前发出。
对于脉冲的设计主要要求要有一定的脉冲宽度(一般不小于5μs)、脉冲序列的均匀度及高低电平方式。
在某一高速下的正、反向切换实质包含了减速→换向→加速3个过程。
2硬件设计
2.1系统的总体设计
主要由单片机AT89C51,步进电机驱动芯片ULN2003A,2相6线步进电机,按键及一些其他相关元件设计而成。
总体框图如图1所示。
图1总体框图
2.2最小系统
单片机(如图2所示):
本次设计使用单片机芯片AT89C51
AT89C51的工作特性:
·内含4KB的FLASH存储器檫写次数1000次;
·内含128字节的RAM;
·具有32根可编程I/O线;
·具有2个16位编程定时器
·具有6个中断源,5个中断矢量,2级优先权的中断结构;
·具有1个全双工的可编程串行通信接口;
·具有1个数据指针DPTR;
·具有可编程3级程序锁定位;
·AT89C51的工作电源为5(1±0.2)V且典型值为5V;
·AT89C51最高工作频率为24MHZ;
·AT89C51的编程频率为3~24MHZ,编程启动电流和启动电压分别为1mA、5或12V。
图2AT89C51引脚图
2.3按键电路设计
本系统利用按键分别接到p0口的,p0.0~p0.4分别控制电机的停止、正转、反转、加速、减速。
如图3所示:
图3p0接口图
2.4ULN2003A芯片简介
LN2003也是一个7路反向器电路,即当输入端为高电平时ULN2003输出端为低电平,当输入端为低电平时ULN2003输出端为高电平。
如图4所示
功能特点:
高电压输出50V
输出钳位二极管
输入兼容各种类型的逻辑电路
应用继电器驱动器。
2.5驱动电路的设计
在此系统中把单片机输出的信号加到ULN2003A,把ULN2003A的输出信号加到步进电机上。
以此通过改变单片机的输出信号来控制步进电机的启/停、正反转以及加速、减速。
2.6总电路图
如图4所示:
图4总体电路原理图
3软件设计
3.1主程序
(a)流程图如图5所示。
图5总体流程图
(b)分析
本系统采用1-2相驱动,1-2相驱动的方式又称为“半步驱动”,每个驱动信号只驱动半步。
采用单相双八拍其驱动信号依次:
1001——1000——1100——0100——0110——0010——0011——0001(正转)
1001——0001——0011——0010——0110——0100——1100——1000(反转)
给单片机从10H开始的8个单元内送入其驱动信号序列,同时把加速、减速不同的时间值赋给指定单元。
把判断停止、正转、反转、加速、减速各个标志位置零,开外部中断INT0,且外部中断为下降沿触发方式。
开始等待中断,当有按键按下时进入中断,然后读P0端口数据送到A,根据A中的的判断要执行什么操作。
当ACC.0=0时,给停止标志NO赋值1,电机停止;当ACC.1=0时,给正转标志ZHENG赋值1,电机在中断返回后开始正转;当ACC.2=0时,给反转标志FAN赋值1,电机在中断返回后开始反转;当ACC.3=0时,给加速标志JIA赋值为1,电机在中断返回后开始加速;当ACC.4=0时,给加速标志JIAN赋值为1,电机在中断返回后开始减速。
(c)程序及注释
ZHENGEQU30H;利用等值伪指令把30H赋值给ZHENG
FANEQU31H;利用等值伪指令把31H赋值给FAN
NOEQU32H;利用等值伪指令把32H赋值给NO
ASEQU33H;利用等值伪指令把33H赋值给AS
SSEQU34H;利用等值伪指令把34H赋值给SS
ORG00H;机器指令起始存储地址
AJMPMAIN;跳转到主程序
ORG03H;外部中断INT0起始地址
AJMPSUB_INT0;跳转到外部中断服务子程序
MAIN:
MOV10H,#01H;给10H送立即数01H
MOV11H,#03H;给11H送立即数03H
MOV12H,#02H;给12H送立即数02H
MOV13H,#06H;给13H送立即数06H
MOV14H,#04H;给14H送立即数04H
MOV15H,#0CH;给15H送立即数0CH
MOV16H,#08H;给16H送立即数08H
MOV17H,#09H;给17H送立即数09H
MOV20H,#50;给20H送立即数50
MOV21H,#25;给21H送立即数25
MOV22H,#10;给22H送立即数10
MOV23H,#05;给23H送立即数05
ANLZHENG,#00H;把正转标志位清零
ANLFAN,#00H;把反标志位清零
ANLNO,#00H;把停止位清零
ANLAS,#00H;把加速位清零
ANLSS,#00H;把减速位清零
MOVR1,#20H;把立即数20送给寄存器R1
MOVP0,#0FFH;给P0口送值FFH
MOVA,@R1;通过间接寻址给A赋值
MOVR5,A;把A得到的值送到寄存器R5
MOVIE,#10000001B;开总中断以及外部中断0
SETBIT0;设外部中断为下降沿触发方式
MOVR0,#0FH;把立即数0FH送给R0
LOOP:
MOVA,ZHENG;把ZHENG单元中的值送给A
JNBACC.0,LP;如果ACC.0为0则LP,否则顺序执行
LCALLGO;调用正转子程序
LP:
MOVA,FAN;把FAN单元中的值赋给A
JNBACC.0,LOOP;如果ACC.0为0则LOOP,否则顺序执行
LCALLBACK;调用反转子程序
AJMPLOOP;跳转到LOOP
3.2步进电机正、反转子程序
(a)流程图如图6、图7所示。
(b)分析
当中断返回后ZHENG单元中的值为1时,主程序就会调用正转子程序,此时电机开始正转。
进入正转子程序后,寄存器R0中的值被加1,如果R0中的值不等于18H(如果等于则把R0中的值置为10H。
因为驱动电机转动的序列存储在10H到17H八个单元中),则把以R0中值为地址的单元中的值通过P2口低4位输出,把其高低电平信号送到步进电机驱动芯片ULN2003A,通过ULN2003A的输出信号去推动步进电机转动。
同时把以R1中值为地址的单元中的值通过间接寻址方式送给R5。
调用延时子程序DELAY,在延时值程序返回后分别把停止(NO)、正转(ZHENG)、反转(FAN)标志单元中的值送到A,把NO单元中值送到A后,如果ACC.0=1,则正转子程序执行结束,返回主程序,否则顺序执行。
当NO单元中值为0时,把ZEHNG单元中的值送给A,如果ACC.0=1时,正转子程序执行结束,返回主程序。
否则顺序执行。
当ZHENG单元中的值为0时,把FAN单元中的值送到A,如果ACC.0=1,则返回主程序,否则顺序执行。
把AS单元中的值送到A,如果ACC.0=1,则调用加速子程序,否则把SS单元中的值送到A,如果ACC.0=1,则调用减速子程序,否则跳转到正转子程序的开始程序继续执行,电机一直正转。
图6正转子程序流程图
图7电机反转流程图
当中断返回后FAN单元中的值为1时,主程序就会调用反转子程序,此时电机开始反转。
进入反转子程序后,寄存器R0中的值被减1,如果R0中的值不等于0EH且不等与0FH时(如果和其中的任何一个值相等,则把R0中的值置为17H。
因为驱动电机转动的序列存储在10H到17H八个单元中),则把以R0中值为地址的单元中的值通过P2口低4位输出,把其高低电平信号送到步进电机驱动芯片ULN2003A,通过ULN2003A的输出信号去推动步进电机转动。
同时把以R1中值为地址的单元中的值通过间接寻址方式送给R5。
调用延时子程序DELAY,在延时值程序返回后分别把停止(NO)、正转(ZHENG)、反转(FAN)标志单元中的值送到A,把NO单元中值送到A后,如果ACC.0=1,则反转子程序执行结束,返回主程序,否则顺序执行。
当NO单元中值为0时,把ZEHNG单元中的值送给A,如果ACC.0=1时,反转子程序执行结束,返回主程序。
否则顺序执行。
当ZHENG单元中的值为0时,把FAN单元中的值送到A,如果ACC.0=1,则返回主程序,否则顺序执行。
把AS单元中的值送到A,如果ACC.0=1,则调用加速子程序,否则把SS单元中的值送到A,如果ACC.0=1,则调用减速子程序,否则跳转到反转子程序的开始程序继续执行,电机一直反转。
(c)程序及注释
正转子程序:
GO:
ANLZHENG,#00H;把正转标志位清零
INCR0;R0中的值加1
MOVA,R0;把R0中的值赋给A
CJNEA,#18H,GO2;如果A中值和18H不相等则GO2,否则顺序执行
MOVR0,#10H ;给R0送10H
GO2:
MOVP2,@R0 ;通过间接寻址方式给P2口赋值
MOVA,@R1 ;通过间接寻址给A赋值
MOVR5,A ;把A得到的值送到寄存器R5
LCALLDELAY ;调用延时子程序
MOVA,NO ;把NO单元中的内容送到A
JBACC.0,RETURN;如果ACC.0=1(即NO单元中值为1)则RETURN
MOVA,ZHENG;把ZHENG单元中的内容送到A
JBACC.0,RETURN;如果ACC.0=1(即ZHENG单元中值为1)则RETURN
MOVA,FAN;把FAN单元中的内容送到A
JBACC.0,RETURN;如果ACC.0=1(即FAN单元中值为1)则RETURN
MOVA,SS;把SS单元中的内容送到A
JNBACC.0,GO3;如果ACC.0=0(即SS单元中值为0)则GO3
LCALLJIAN;调用JIAN(减速)子程序
GO3:
MOVA,AS;把AS单元中的内容送到A
JNBACC.0,GO4;如果ACC.0=0(即AS单元中值为0)则GO4
LCALLJIA;调用JIA(加速)子程序
GO4:
AJMPGO;跳转到GO
反转子程序:
BACK:
ANLFAN,#00H;把反转标志位清零
DECR0;R0中的值减1
MOVA,R0;把R0中的值送到A
CJNEA,#0EH,TT;如果A中的值与立即数0E不相等则TT
MOVR0,#17H;把立即数17H送给R0
SJMPBACK2;跳转到BACK2
TT:
CJNEA,#0FH,BACK2;如果A中的值与立即数0FH不相等则BACK2
MOVR0,#17H;把立即数17H送到R0
BACK2:
MOVP2,@R0;通过间接寻址方式给P2口送值
MOVA,@R1;通过R1间接寻址给A赋值
MOVR5,A;把R5中的值送给A
LCALLDELAY;调用延时子程序
MOVA,NO;把NO单元中的值送给A
JBACC.0,RETURN;如果ACC.0为1则RETURN
MOVA,ZHENG;把ZHENG单元中的值送给A
JBACC.0,RETURN;如果ACC.0为1则RETURN
MOVA,FAN;把FAN单元中的值送给A
JBACC.0,RETURN;如果ACC.0为1则RETURN
MOVA,AS;把AS单元中的值送给A
JNBACC.0,BACK3;如果ACC.0为1则BACK3
LCALLJIA;调用加速子程序
BACK3:
MOVA,SS;把SS单元中的值送给A
JNBACC.0BACK4;如果ACC.0为1则BACK4
LCALLJIAN;调用减速子程序
BACK4:
AJMPBACK;跳转到BACK
RETURN:
RET;返回
3.3步进电机加、减速子程序
(a)
流程图如图8、如图9所示。
图8加速子程序流程图图9减速子程序流程图
(b)分析
当加速按键被按下后程序进入中断把加速标志单元AS中送入1,中断返回后,程序会进入加速子程序。
进入加速子程序后,先把加速标志单元中的值清零,同时把R1单元中的值送到A中,用来判断R1中的值是否等于23H,如果A中的值不等于23H,则R1中的值加1,然后返回,如果A中值等于23H表明以经加速到最大值,然后直接返回。
当减速按键被按下后程序进入中断把减速标志单元SS中送入1,中断返回后,程序会进入减速子程序。
进入减速子程序后,先把减速标志单元中的值清零,同时把R1单元中的值送到A中,用来判断R1中的值是否等于20H,如果A中的值不等于20H,则R1中的值减1,然后返回,如果A中值等于20H表明以经减速到最小值,然后直接返回。
(c)程序及注释
JIA:
ANLAS,#00H;把加速标志AS清零
MOVA,R1;把R1单元中的值送到A
CJNEA,#23H,JIA1;如果A中值不等23H则JIA1
RET;加速子程序返回
JIA1:
INCR1;R1中的值加1
RET;加速子程序返回
JIAN:
ANLSS,#00H;把减速标志SS清零
MOVA,R1;把R1中的值送给A
CJNEA,#20H,JIAN1;如果A不等于20H则JIAN1
RET;减速子程序返回
JIAN1:
DECR1;R1中的值减1
RET;减速子程序返回
3.5INT0中断程序
(a)流程图如图10所示。
图10
(b)分析
当单片机复位后执行主程序,等待中断,当有按键被按下时,进入中断服务子程序,进入中断服务子程序后,读P0口的值给A,A中值取反和1FH相与,把其得到的值送到A,如果A=0,则中断返回,如果A中值不为0则调用延时DELEAY1。
读取p0口值给A,把A中值取反,与1FH相与,结果送到A,如果A=0则中断返回,否则调用读按键子程序。
即把p0口值送到A,如果ACC..0=0,则把停止标志单元STOP中送1,如果ACC.1=1,则把正转标志单元ZHENG中送1,如果ACC.2=0,则把反转单元FAN中送1,如果ACC.3=0,则把加速单元JIA中送1,如果ACC.4=0,则把减速单元JIAN中送1,然后中断返回,继续执行中断前执行的程序。
(c)程序及注释
SUB_INT0:
SCAN:
MOVA,P0;读取P0口的值送给A
CPLA;把A中的值取反
ANLA,#00011111B;把A中的值与1FH相结果送到A
JNZSCAN1;如果A中的值不为0则SCAN1
AJMPL;跳转到L
SCAN1:
LCALLDELAY1;调用延时子程序
MOVA,P0;读取P0口的值送给A
CPLA;把A中的值取反
ANLA,#00011111B;把A中的值与1FH相结果送到A
JZL;如果A中的值为0则L
LCALLRDKEY;调用读按键子程序
L:
RETI;中断返回
读按键子程序
RDKEY:
MOVA,P0;读取P0口的值送给A
JNBACC.0,STOP;如果ACC.0为0则STOP
JNBACC.2,REV;如果ACC.2为0则REV
JNBACC.1,FOR;如果ACC.1为0则FOR
JNBACC.3,ADDSPEED;如果ACC.3为0则ADDSPEED
JNBACC.4,SUBSPEED;如果ACC.4为0则SUBSPEED
STOP:
ANLNO,#01H;给NO单元送入1
RET;返回
FOR:
ANLZHENG,#01H;给ZHENG单元送入1
RET;返回
REV:
ANLFAN,#01H;给FAN单元送入1
RET;返回
ADDSPEED:
ANLAS,#01H;给AS单元送入1
RET;返回
SUBSPEED:
ANLSS,#01H;给SS单元送入1
RET;返回
3.6延时子程序
(a)流程图如图11所示:
图11流程图
延时程序采用反复执行指令,消耗时间来达到延时的目的。
DELAY:
先给寄存器R6、R7中送入数值50,然后让R7中的值减1,结果送到R7,如果R7中的值不为0则继续执行此指令,直到R7中的值为0,然后使R6中的值减1,结果送到R6,如果R6中的值不为0则继续执行此指令,直到R6中的值为0,接下来使R5中的值减1,结果送到R5,如果R5中的值不为0则给R7重新赋值,继续执行,直到R5中的值为0,返回。
DELAY1:
先给寄存器R6、R7中送入数值50、250,然后让R7中的值减1,结果送到R7,如果R7中的值不为0则继续执行此指令,直到R7中的值为0,然后使R6中的值减1,结果送到R6,如果R6中的值不为0给R7重新赋值,直到R6中的值为0,返回。
程序及注释
DELAY:
MOVR6,#50;给寄存器R6送50
D2:
MOVR7,#50;给寄存器R7送50
D3:
DJNZR7,$;当寄存器R7中的数不为0则继续执行此指令
DJNZR6,D2;当寄存器R6中的数不为0则跳到D2
DJNZR5,D2;当寄存器R5中的数不为0则跳到D2
RET;子程序返回
DELAY1:
MOVR6,#50;给寄存器R6送50
D4:
MOVR7,#250;给寄存器R7送250
DJNZR7,$;当寄存器R7中的数不为0则继续执行此指令
DJNZR6,D4;当寄存器R6中的数不为0则跳到D4
RET;返回
3.7程序清单
ZHENGEQU30H
FANEQU31H
NOEQU32H
ASEQU33H
SSEQU34H
ORG00H
AJMPMAIN
ORG03H
AJMPSUB_INT0
MAIN:
MOV10H,#01H
MOV11H,#03H
MOV12H,#02H
MOV13H,#06H
MOV14H,#04H
MOV15H,#0CH
MOV16H,#08H
MOV17H,#09H
MOV20H,#50
MOV21H,#25
MOV22H,#10
MOV23H,#05
ANLZHENG,#00H
ANLFAN,#00H
ANLNO,#00H
ANLAS,#00H
ANLSS,#00H
MOVR1,#20H
MOVP0,#0FFH
MOVA,@R1
MOVR5,A
MOVIE,#10000001B
SETBIT0
MOVR0,#0FH
LOOP:
MOVA,ZHENG
JNBACC.0,LP
LCALLGO
LP:
MOVA,FAN
JNBACC.0,LOOP
LCALLBACK
AJMPLOOP
SUB_INT0:
SCAN:
MOVA,P0
CPLA
ANLA,#00011111B
JNZSCAN1
AJMPL
SCAN1:
LCALLDELAY1
MOVA,P0
CPLA
ANLA,#00011111B
JZL
LCALLRDKEY
L:
RETI
RDKEY:
MOVA,P0
JNBACC.0,STOP
JNBACC.2,REV
JNBACC.1,FOR
JNBACC.3,ADDSPEED
JNBACC.4,SUBSPEED
STOP:
ANLNO,#01H
RET
FOR:
ANLZHENG,#01H
RET
REV:
ANLFAN,#01H
RET
ADDSPEED:
ANLAS,#01H
RET
SUBSPEED:
ANLSS,#01H
RET
GO:
ANLZHENG,#00H
INCR0
MOVA,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 步进 电机 课程设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)