标题: 51单片机控制步进电机正反转及调速详解 附汇编语言程序 [打印本页]
作者: UNICORN~ 时间: 2019-12-28 16:15
标题: 51单片机控制步进电机正反转及调速详解 附汇编语言程序
一、设计内容与应用资源
1.设计内容:
单片机控制四相步进电机
速度可调,方向可调
速度采用定时器中断方式来实现
汇编语言编程
2.基本功能:
步进电机正转
步进电机反转
步进电机加、减速
定时器中断控速
3.应用资源:
一片AT89C52
一个四相电机
一片ULN2003A
单片机最小系统
1.设计要求
通过按键控制步进电机实现正、反转和加、减速,并且该实验实现了共五级调速,加速减速分别两级,原速自一级,具体计时时间及换速速度见下方第3小点计算可得。
2.设计思路
为实现步进电机速度可调,方向可调的目的,并要用到定时器定时中断来控制脉冲每变换一次的时间。此实验设计思路上采用一个定时器,两个外部中断,设置8个正反转控制字存到ROM以查表用,其分别代表步进电机的八拍。通过按键判别及定时器T0定时中断使步进电机按所设置时间依次循环取用数组并每次指针加一便赋给P1,以达到电机按相应速度正、反转起来的效果。外接外部中断0、1的按键分别控制加速和减速,开启外部中断INT0则定时次数减少以增速;开启外部中断INT1则定时次数增加以减速。
具体软硬件设置方面,在使用定时器前要先设定定时器T0的入口地址000BH,设置工作方式为方式1,并设置初值,对其进行初始化。设置外部中断器INT0的入口地址0003H,外部中断器INT1入口地址0013H,并对其进行初始化。控制步进电机转动速度与方向,我们在硬件电路中的AT89C52的P3口连接四个按钮,分别控制步进电机的加速、减速、正转、反转。
(1)正转
设置R3置1时步进电机正转,当按下第三个按钮P3.6时,R3=1,将正转的查表数值按顺序赋给P1口,步进电机正转。
(2)反转
按下第四个按钮P3.7时,R3=0,按反转查表数值顺序赋值给P1口,步进电机反转。
(3)加速
设置计时次数值R6=150,通过改变循环次数来实现控制步进电机的运转速度,当按下第一个按钮P3.2时,程序执行外部中断T0,R6每次加上30(最多加至210),并重新按新的计时次数循环查表,来实现步进电机的加速。
(4)减速
按下按钮P3.3时,R6每次减去30(最多减至90),重新按新的计时次数循环查表来实现减速。
3.相关计算过程:
即脉冲间隔时间(转速变换)计算,由初次间隔时间基础上对应的转速设定,TH0=0FEH,TL0=0C0H

一级转速:二级:
三级:
四级:
五级:
4.设计意义
步进电机是一种被广泛使用的感应电机,它的工作原理是当输入脉冲时,步进驱动器接收到一个脉冲信号,驱动步进电机按设定的方向转动一个固定的角度。
步进电机广泛应用在各种自动化控制系统中。随着现代技术的发展,对步进电机的功能也有了更多的需求,在简单步进电机的基础上,增加了改变步进电机转动方向与增加减少步进电机转速的功能,扩大了步进电机的使用场合范围。
三、硬件电路图
1.最小系统(基础)
本控制系统比较简单,不需要多余的外部扩展芯片,因此选用一片AT89C52作为CPU来实现系统控制,对开发设备的要求很低,开发时间也能大大缩短。在单片机外部接上时钟电路、复位电路和电源组成基本最小系统使其能够正常运行。
图1.1最小系统
2.ULN2003
在我们所学习的最小系统之上,我们进行了一定程度上的拓展,我们的目的是步进电机的调速,但是首先要驱动步进电机,但是单片机的管脚输出电流较小,只有零点几个毫安,吸纳电流也只有十几个毫安(大多数单片机只有几个毫安),输出最高电压也不会越过5V,由于这个原因很少用单片机直接驱动外设。ULN2003的作用就是把单片机的信号进行(7路)放大,吸纳电流可以达到500mA,耐压能力也提高很多,基本能满足微型步进电机的驱动电流和电压,所以大家经常会在单片机输出口上挂只ULN2003。ULN2003是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。
图1.2 ULN2003
3.电动机
由于没有在proteus软件中找到三相步进电机,因此经过了多次试验后我们选取了仿真效果最好的四相六线电机来进行仿真。
图1.3四相六线电动机
4.总电路图
图1.4 总电路图
四、数组的使用
用单片机的P1.0,P1.1,P1.2,P1.3分别控制步进电机的A,B,C,D相绕组。四相八拍的通电相依次为A-AB-B-BC-C-CD-D-DA,由此我们可以得到它的控制模型,以二进制和十六进制在表1中给出。
表1四相八拍的正反向运转数组
五、流程图




- ORG 0000H
- LJMP MAIN
- ORG 0003H ;外部中断0入口
- LJMP TIME0
- ORG 000BH ;定时器中断入口
- LJMP T0_INT0
- ORG 0013H ;外部中断1入口
- LJMP TIME1
- ORG 0030H
-
- MAIN:
- MOV TMOD,#01H ;设置T0工作方式为方式1
- MOV TH0,#0FEH ;设置T0初值
- MOV TL0,#0CH
- SETB ET0
- SETB EA
- SETB TR0
-
- SETB EX0
- SETB EX1
- SETB IT0
- SETB IT1
- MOV R0,#10 ;设定计数初值
- MOV R1,#0 ;查表值初始化
- MOV R3,#0 ;正反标志判别位
- MOV R6,#150 ;设定变量计数(次数)值
-
- LOOP: JB P3.6,AAA ;判断正转按键是否按下
- MOV R3,#0
- AAA:
- JB P3.7,LOOP ;判断反转按键是否按下
- MOV R3,#1
- SJMP LOOP
-
-
-
- T0_INT0:
- MOV TH0,#0FEH
- MOV TL0,#0CH
- DJNZ R0,RETURN ;判断计时次数有无到所设定次数值
- MOV A,R6 ;修改计时次数所赋值,达到加减档效果
- MOV R0,A
- MOV A,R1 ;加减速后重新将表中数值赋给A
- CJNE R3,#1,BBB ;若(R3)不等于1则跳转到子程序BBB
- MOV DPTR,#Vn_step1 ;若(R3)等于1则向下运行对Vn_step1
- 查询,指向表首地址
- SJMP CCC
- BBB: MOV DPTR,#Vn_step2 ;对 Vn_step2査询,指向表首
- 地址
- CCC: MOVC A,@A+DPTR ;取表内数值赋值
- MOV P1,A ;将值通过累加器赋值给P1口
- MOV A,R1 ;初始化累加器
- INC A ;查询地址加1
- CJNE A,#8,DDD ;若将表内数值査询到了八次即八拍
- 则向下运行,否则跳转到DDD子程序
- CLR A ;将累加器清零
-
- DDD: MOV R1,A ;将A中加1后的表内对应数值赋到R1或
- 到达8位后清零的值赋给R1
- RETURN:RETI ;定时器中断返回
-
- TIME0: ;外部中断0中断服务程序——加速按键
- CJNE R6,#90,JJJ ;若计时次数没有减至90,则跳转
- 到JJJ
- SJMP KKK ;若已经减至90,则中断返回
- JJJ:
- MOV A,R6 ;将此时计数次数值赋给A
- SUBB A,#30 ;将A中数值减30再赋给
- MOV R6,A ;将A中数值赋给R6当新的计时次数
- KKK: RETI
-
- TIME1: ;外部中断1中断服务程序——减速按键
- CJNE R6,#210,NNN ;若计时次数没有增至210,则跳
- 转到NNN
- SJMP MMM ;若已经增至210,则中断返回
- NNN:
- MOV A,R6
- ADD A,#30
- MOV R6,A
- MMM: RETI
- Vn_step1: DB 01H,03H,02H,06H,04H,0CH,08H,09H
- Vn_step2: DB 09H,08H,0CH,04H,06H,02H,03H,01H
-
- END
复制代码
本次对四相(代替三相以达更好效果)步进电机控制系统的设计,要求通过按键控制步进电机实现正反转以及用定时器中断的方式调节转速并且使用汇编语言编程。
在编译的过程中遇到了各种各样的困难,首先是选择步进电机,由于软件中没有我们需要的三相电动机,所以我们开始了漫长的尝试道路,最终发现了一个效果最好的四相六线步进电机。其次就是在面对只能正反转45度的步进电机我们对程序不断审查,反复查找仿真运行之后发现了一处不妥,改正了之后也只能正反转85-90度。我们陷入了思维定势,无法对自己的程序进行纠错,要是全部推翻重新建立一种思路未尝不可,但尝试改变就预示着前功尽弃。在软件和硬件的无数次联调修改的情况下都没有用,所以后面问队友,经过多次探讨和改进,推翻了之前的思路,重新构建了上述设计思路和程序设计。
以上的Word格式文档51黑下载地址:
02 步进电机说明书.docx
(224.8 KB, 下载次数: 190)
作者: danpianji22 时间: 2020-9-27 12:47
这个程序我那个单片机板子用不了啊
作者: windone 时间: 2021-12-15 15:03
感觉有用,但是我是两相四线
作者: 莫攸 时间: 2022-11-5 16:25
太棒了,有原理图就更好了
作者: 馒头宝宝 时间: 2023-3-17 02:59
太好了,正好用得上
作者: woshitomge 时间: 2023-3-18 22:41
不错的资料,谢谢楼主分享!
作者: dbkdz 时间: 2023-4-29 23:52
ULN2003发热量大,建议用几分钱一个的MOS FET,型号2N10 用四只即可。控制效果比ULN2003好。尤其是控制DC24V的四相步进电机,2003不行的。太烫了。 楼主什么时候可写编控制2相的步进电机文章来呢?我想学习。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |