基于单片机控制的步进电机课程设计文档格式.docx
- 文档编号:22398266
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:32
- 大小:385.89KB
基于单片机控制的步进电机课程设计文档格式.docx
《基于单片机控制的步进电机课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机控制的步进电机课程设计文档格式.docx(32页珍藏版)》请在冰豆网上搜索。
随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。
1.1.2步进电机控制工作原理
步进电机实际上是一个数字\角度转换器,也是一个串行的数\模转换器。
步进电机的基本控制包括启停控制、转向控制、速度控制、换向控制4个方面。
从结构上看,步进电机分为三相、四相、五相等类型,常用的则以三相为主。
三相步进电机的工作方式有三相单三拍、三相双三拍和三相六拍3种。
1.1.3步进电机的启停控制
步进电机由于其电气特性,运转时会有步进感,即振动感。
为了使电机转动平滑,减小振动,可在步进电机控制脉冲的上升沿和下降沿采用细分的梯形波,可以减小步进电机的步进角,提高电机运行的平稳性。
在步进电机停转时,为了防止因惯性而使电机轴产生顺滑,则需采用合适的锁定波形,产生锁定磁力矩,锁定步进电机的转轴,使步进电机的转轴不能自由转动。
1.1.4步进电机的转向控制
如果给定工作方式正序换相通电,步进电机正转。
若步进电机的励磁方式为二六拍,即A-AB-B-BC-C-CA。
如果按反序通电换相,即则电机就反转。
其他方式情况类似。
1.1.5步进电机的速度控制
如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步。
2个脉冲的间隔越短,步进电机就转得越快。
调整送给步进电机的脉冲频率,就可以对步进电机进行调速。
1.1.6步进电机的换向控制
步进电机换向时,一定要在电机减速停止或降到突跳频率范围之内再换向,以免产生较大的冲击而损坏电机。
换向信号一定要在前一个方向的最后一个脉冲结束后以及下一个方向的第1个脉冲前发出。
对于脉冲的设计主要要求要有一定的脉冲宽度(一般不小于5μs)、脉冲序列的均匀度及高低电平方式。
在某一高速下的正、反向切换实质包含了减速→换向→加速3个过程。
1.2基本设计要求
此次我们所设计的是一个步进电机控制系统,可以通过按键来控制系统的启/停工作,当系统运转时,用按键来控制方向,同样由按键来选择工作模式。
最后根据思路所设计出来的硬件图设计相适应的软件。
详细的设计步骤将在下面说明。
二、系统的总体设计
主要由单片机AT89C51,步进电机驱动芯片ULN2003A,2相6线步进电机,按键及一些其他相关元件设计而成。
总体框图如下图2
(图2)
2.1.硬件设计
2.1.1.最小系统
单片机(如图3):
本次设计使用单片机芯片AT89C51
AT89C51的工作特性:
·
内含4KB的FLASH存储器檫写次数1000次;
内含128字节的RAM;
具有32根可编程I/O线;
具有2个16位编程定时器
具有6个中断源,5个中断矢量,2级优先权的中
断结构;
(图3)
具有1个全双工的可编程串行通信接口;
具有1个数据指针DPTR;
具有可编程3级程序锁定位;
AT89C51的工作电源为5(1±
0.2)V且典型值为5V;
AT89C51最高工作频率为24MHZ;
AT89C51的编程频率为3~24MHZ,编程启动电流和启动电压
分别为1mA、5或12V。
2.1.2按键电路设计
本系统利用按键分别接到p0口的,p0.0~p0.4分别控制电机的停止、正转、反转、加速、减速。
2.1.3ULN2003A芯片简介
LN2003也是一个7路反向器电路,即当输入端为高电平时ULN2003输出端为低电平,当输入端为低电平时ULN2003输出端为高电平。
如图4所示
功能特点:
高电压输出50V
输出钳位二极管
输入兼容各种类型的逻辑电路
应用继电器驱动器。
(图4)
2.1.4驱动电路的设计
在此系统中把单片机输出的信号加到ULN2003A,把ULN2003A的输出信号加到步进电机上。
以此通过改变单片机的输出信号来控制步进电机的启/停、正反转以及加速、减速。
2.2软件设计
2.2.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
2.2.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。
调用延时子程序DELAY,在延时值程序返回后分别把停止(NO)、正转(ZHENG)、反转(FAN)标志单元中的值送到A,把NO单元中值送到A后,如果ACC.0=1,则反转子程序执行结束,返回主程序,否则顺序执行。
当NO单元中值为0时,把ZEHNG单元中的值送给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 ;
MOVR5,A ;
LCALLDELAY ;
调用延时子程序
MOVA,NO ;
把NO单元中的内容送到A
JBACC.0,RETURN;
如果ACC.0=1(即NO单元中值为1)则RETURN
MOVA,ZHENG;
把ZHENG单元中的内容送到A
如果ACC.0=1(即ZHENG单元中值为1)则RETURN
把FAN单元中的内容送到A
如果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:
把反转标志位清零
DECR0;
R0中的值减1
把R0中的值送到A
CJNEA,#0EH,TT;
如果A中的值与立即数0E不相等则TT
MOVR0,#17H;
把立即数17H送给R0
SJMPBACK2;
跳转到BACK2
TT:
CJNEA,#0FH,BACK2;
如果A中的值与立即数0FH不相等则BACK2
把立即数17H送到R0
BACK2:
MOVP2,@R0;
通过间接寻址方式给P2口送值
通过R1间接寻址给A赋值
把R5中的值送给A
LCALLDELAY;
MOVA,NO;
把NO单元中的值送给A
如果ACC.0为1则RETURN
把FAN单元中的值送给A
JBACC.0,RETURN;
把AS单元中的值送给A
JNBACC.0,BACK3;
如果ACC.0为1则BACK3
调用加速子程序
BACK3:
把SS单元中的值送给A
JNBACC.0BACK4;
如果ACC.0为1则BACK4
调用减速子程序
BACK4:
AJMPBACK;
跳转到BACK
RETURN:
RET;
返回
2.2.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:
把加速标志AS清零
MOVA,R1;
把R1单元中的值送到A
CJNEA,#23H,JIA1;
如果A中值不等23H则JIA1
RET;
加速子程序返回
JIA1:
INCR1;
R1中的值加1
JIAN:
把减速标志SS清零
把R1中的值送给A
CJNEA,#20H,JIAN1;
如果A不等于20H则JIAN1
减速子程序返回
JIAN1:
DECR1;
R1中的值减1
2.2.4INT0中断程序
(a)流程图(图10)
当单片机复位后执行主程序,等待中断,当有按键被按下时,进入中断服务子程序,进入中断服务子程序后,读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,然后中断返回,继续执行中断前执行的程序。
SUB_INT0:
SCAN:
MOVA,P0;
读取P0口的值送给A
CPLA;
把A中的值取反
ANLA,#00011111B;
把A中的值与1FH相结果送到A
JNZSCAN1;
如果A中的值不为0则SCAN1
AJMPL;
跳转到L
SCAN1:
LCALLDELAY1;
JZL;
如果A中的值为0则L
LCALLRDKEY;
调用读按键子程序
L:
RETI;
中断返回
读按键子程序
RDKEY:
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
FOR:
ANLZHENG,#01H;
给ZHENG单元送入1
REV:
ANLFAN,#01H;
给FAN单元送入1
ADDSPEED:
ANLAS,#01H;
给AS单元送入1
SUBSPEED:
ANLSS,#01H;
给SS单元送入1
(图10)
2.2.4延时子程序
(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,返回。
MOVR6,#50;
给寄存器R6送50
D2:
MOVR7,#50;
给寄存器R7送50
D3:
DJNZR7,$;
当寄存器R7中的数不为0则继续执行此指令
DJNZR6,D2;
当寄存器R6中的数不为0则跳到D2
DJNZR5,D2;
当寄存器R5中的数不为0则跳到D2
子程序返回
DELAY1:
D4:
MOVR7,#250;
给寄存器R7送250
DJNZR6,D4;
当寄存器R6中的数不为0则跳到D4
三、调试与仿真
3.1Keil程序调试
3.2Proteues仿真调试
4、实物制作
4.1焊接电路及调试
焊接电路
参照原理图、芯片引脚图焊接电路,首先要按照焊接技术基本指导,按在电路板上从低到到高的顺序焊接。
第一步、将单片机的底座焊在电路板的左边,在对应P0口的几个引脚将上拉电阻(10K电阻)在焊板上固定并连接到P0口的0——4口进行焊接。
第二步、与门芯片DM74SL09N的底座焊接在焊板上,根据原理图剪取长短适中的导线连接P0口、上拉电阻和芯片底座的引脚。
在焊板的右上方放置五个按钮式开关(竖排),按键开关的左端依次对照原理图连接到P0口,右端全部连接到地线。
第三步、将步进电机的驱动芯片ULN2003A底座焊接到焊板上,对照芯片引脚图,将P2.0、P2.、P2.2、P2.3四端口连接到芯片的前四个输入端口。
第四步、对照晶振电路和手动复位电路,先焊接电阻和元片电阻,再焊接按键,接着把电解电容和晶振也焊到焊板上。
第五步、将电路中的VCC和GND连接到电源中。
输入程序调试
将单片机芯片放在实验箱的烧录器中将程序烧录到芯片中,首先把芯片引脚放在插槽内,按下锁紧开关、将所编写的程序在KEIL软件中生成hex的文件。
再开启烧录软件,将程序烧录到单片机内部。
把单片机芯片插入焊板芯片底座中,接入电源。
按下复位键,再按下正转、反转键,接着在按加速、减速键和停止键,看电机转动的方式是否符合预期要求的。
如果不符合,检查硬件电路和软件程序,若软件错误,修改后再次烧录,再次调试。
若硬件电路错误,对照电路图仔细检查每一个模块电路,直到
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 控制 步进 电机 课程设计