基于单片机的步进电机控制器设计.docx
《基于单片机的步进电机控制器设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的步进电机控制器设计.docx(40页珍藏版)》请在冰豆网上搜索。
基于单片机的步进电机控制器设计
设计题目:
基于MCS-51单片机的反应式步进电机控制器设计,要求能够控制其转速、正反转和运行步数。
摘要:
在中国这个发展中大国,单片机的出现意味着计算机分为通用计算机系统和嵌入式计算机系统。
单片机单芯片因它的体积微小和成本低廉的优点而广泛的应用到家电、仪表、汽车电子、工业控制单元、办公自动化设备、通信设备等这些产品中去,是现代电子系统中极其重要的智能化工具。
在未来,单片机将会进一步的走向低功耗、小体积、大容量、高性能、低价位和混合信号集成化。
本设计基于AT89S51单片机,利用反应式步进电机控原理,对其控制进行硬件和软件的设计。
以实现对反应式电机的控制器可对36BF003型步进电机进行正反转、启停、速度和步数控制。
关键字:
步进电机;单片机;拍数;控制器;反应式
一、控制原理分析
1.1三相步反应式进电机工作原理反应式步进电机又称可变磁阻式步进电机,它和普通的电机一样,也是有定子和转子组成,它利用磁阻转矩使转子转动。
三相反应式步进电机定机定子上有六个极,每个极上装有控制绕组,每相对的两极组成一相。
转子上有数个均匀分布的齿,其上没有绕组,当A相通电时,转子在磁场力的作用下与定子齿对齐,若切断A相电源,同时接通B相电源,在磁场力的作用下转子转过一个步距角(步距角由转子齿数、控制绕组相数和通电方式决定),如再使B相断电,同时使C相控制绕组通电,转子又转过一个步距角。
如此循环通电,并按A→
B→C→A顺序通电,步进电机便按一定的方向转动。
电机的转速取决于控制绕组接通的断开的变化频率。
若改变通电顺序,即按A→C→B→A方式通电,则电机反向转动。
上述通电方式称为三相单三拍通电方式;这里的“拍”是指定子控制绕组每改变一次通电方式,为一拍;“单”是指每次只有一相控制绕组通电;“三拍”是指经过三次切换控制绕组的通电状态为一个循环。
三相步反应式进电机除上述通电方式外,还有三相双三拍和三相单双六拍通电方式,三相双三拍通电顺序为AB→BC→CA→AB或AB→CA→BC→AB,三相单双六拍通电顺序为A→AB→B→BC→C→CA→A或A→AC→C→CB→B→BA→A,这里“AB”表示A、B两相同时通电,依此类推。
三相反应式步进电机的步距角θs的大小是由转子的齿数、控制绕组的相数和通电方式所决定的,其关系为θs=360/(mZrC)式中C为通电状态系数,当采用单拍方式时,C=1;而采用单双拍方式时,C=2;m为步进电机相数,当Zr为步进电机转子数。
若步进电机能电的脉冲频率为f(每秒的拍数),则步进电机的速度为
n=60f/(mZrC)
式中:
f为频率,单位为Hz;n为转速,单位为r/min
1.2基于单片机的步进电机驱动器控制原理步进电机驱动器控制系统的硬件设备由单片机、功率放大器、键盘输入设备和显示设备几个部分组成,其示意图如图1-1所示:
1、键盘:
键盘由0~9号数字健、正转启动键、反转启动键、停止键、转速+、转速-等
15个按键组成,通过键盘可以设置电机运行步数(电机转动角度)、转速、正/反转启动和停止。
2、单片机:
单片机是系统的控制单元,它通过对输入设置运算产生和分配控制电机的脉冲信号,同时也要产生步数和速度的显示信号。
3、功率放大器:
单片机输出的脉冲信号功率很小,不足以驱动电机转动,故需要功率放大器将信号放大以驱动电机转动。
二、硬件设计
2.1电机的选用及其电路
2.1.1确定步进电机型号及其参数本设计选择型号为36BF003反应式步进电机,其参数如表2-1所示:
表2-136BF003反应式步进电机技术数据
型号
相数
步距角
(/度)
电压
/V
相电流
/A
最大静转矩
(N.m
)
空载起动频率
/(步
/s)
绕组电阻/Ω
分配方式
外形尺寸/mm
重量/Kg
外径
长度
轴径
36BF003
3
1.5/3
27
1.5
0.078
3100
1.6
三相六拍
36
43
40.2
2
2.1.2电机驱动电路原理
由表2-1可知电机的额定电压是27V,本设计采用单电源功率放大电路驱动步进电机,电路原理图如图2-1所示。
电路中由单片机AT89S51分配的控制脉冲从P0口的P0.0~P0.7输出,经74LS125反相后控制光电开关,光电隔离后,由功率管TIP122将脉冲信号进行电压和电流放大,驱动步进电机的各相绕组。
使步进电机随着不同的脉冲信号分别作正转、反转、加速、减速和停止等动作。
W1、W2、W3分别为电机三相绕阻,RL为绕组内阻,阻值为1.6Ω,100Ω电阻(R1、R2、R3)是一外接电阻,起限流作用,也是一个改善回路时间常数的元件。
VD1、VD2、VD3为续流二极管,使电机绕组产生的反电动势通过续流二极管(VD1、VD2、VD3)而衰减掉,从而保护了功率管TIP122不受损坏。
在100Ω外接电阻(R1、R2、R3)上并联一个200μF电容,可以改善注入步进电机绕组的电流脉冲前沿,提高了步进电机的高频性能。
与续流二极管串联的200Ω电阻(R10、R11、R12)可减小回路的放电时间常数,使绕组中电流脉冲的后沿变陡,电流下降时间变小,也起到提高高频工作性能的作用。
2.3单片机选择及其电路设计
2.3.1单片机的选用
(1)本设计采用AT89S51,它是低功耗、高性能的单片机,其特性如下:
(2)4KB可编程的Flash存储器(可经受1000次的擦除/写入);
(3)全静态工作:
0Hz~24Hz;
(4)1288字节的内存RAM;
(5)32可编程I/O线;
(6)2个16位的定时/计数器;
(7)编程串行通道;
(8)片内振荡器。
2.3.2单片机工作电路设计
(1)电压选择
单片机的工作电压范围为2.7~5.5V,在本设计中的单片机的工作电压是5V。
(2)复位电路
AT89S52单片机的RESET引脚为复位信号输入端,高电平有效,,当振荡器工作时,在此引脚上出现两个机器周期以上的高电平,就可以使单片机复位。
本设计采用TPS3824处理
器监控电路复位,电路原理图如图2-2所示。
TPS3824是一个带有看门狗功能的监控器,在上电期间,监控器REST端向单片机复位引脚(RESET)发出一个复位信号,然后,其内部定时器每延时时间td向单片机发出一个复位信号,因此,在单片机正常工作期间,单片机P0.3口需要在时间t≤td时定期向监控器WDI引脚发出一个正跳变或负跳变以触发监控器定时器复位,以防止单片机被误复位。
当单片机死机无法正常工作时,P0.3无法输出触发监控器定时器复位信号,监控器则向单片机发出复位信号使系统复位,所以,使用TPS3824监控器复位电路具有系统死机自动复位功能。
(3)时钟电路
本系统运行程序不多,速度要求不高,采用外部时钟脉冲,选用ZPA(稳定度为1~9x10-4普通石英晶体振荡器)型12MHz石英晶体振荡器。
其电路原理图如图2-3所示。
如图2-3,时钟电路连接单片机引脚XTAL1和XTAL2向单片机提供时钟脉冲,电路中的电容C1和C2称为负载电容,也可以理解为谐振电容的一部分,两电容并串在电路中取值相同,一般为数pF至数十pF,这里选择30pF。
(4)键盘输入电路
键盘是一组按键的集合,它是最常用的单片机输入设备.操作人员可以通过键盘输入数据或者命令,实现简单的人机通信。
单片机的键盘设计方式有独立式和矩阵式两种,由于本系统键盘由0~9号数字键、正转控制键、反转控制键、停止控制键、加速键和减速键15个按键组
成,通过键盘可以输入电机运行步数、控制电机正转/反转/停止和速度。
系统按键数量较多,为节省I/O口,简化电路,降低成本,本设计采用标准的4*4矩阵式由P1号接入单片机。
电路原理如图2-4所示。
电路中四个电阻起上拉电阻作用。
(5)显示电路
本设计采用七个八段数码管显示电机步数,显示步数范围是0~9999999步,由步进电机
原理可知,步数x步距角为电机转角。
一个八段数码管显示速度,编程设定显示范围是1~9,
倍率是100,即实际转速为显示数x100,例如,速度显示1,则电机转速为100r/min。
为简化电路,降低成本,八个八段显示数码管的阳极位段选线并联在一起,由一个8位的P2口控制,形成段选线多路复用。
而各位的共阴极分别8位的P3口控制,实现各位的分时选通,构成一个动态显示器,如图2-5所示。
图中右七个数码管显示步数,左一个数码管显示转速,74LS125为集成四个非门的芯片。
三、软件设计
3.1控制地址分配为方便程序检查和修改,在设计程序之前应对所用到或使用较多数据存储地单元命名标号,本程序数据储存地址命名如表3-1所示。
表3-1数据储存地址命名标号表
名称
号标
地址单元
名称
号标
地址
单元
步数
B
G
H
0
步数
B
WB
B
H
6
步数
B
S
H
1
4
D
S
H
7
4
步数
B
B
H
2
K
H
8
步数
B
Q
H
3
Z
H
9
步数
B
WB
H
4
按
H
A
4
步数
B
WB
S
H
5
量变间中态状下按键
L
B
K
H
B
4
3.2主程序设计
为节省单片机程序扫描时间,使用定时器T0中断方式转入控制电机运行,定时器T0定时时间为电机运转“拍数”切换时间,即控制电机的脉冲切换时间,根据步进电机控制原理,改变此定时器定时时间可改变电机转速。
由此定时器定时时间未到时不断进行键盘扫描的输出显示。
时间初值查询表SD_TAB见程序所用到的查询表及其说明部分表4-1;主程序流程图如图3-1所示。
LOOP:
SB
EQU40H
;定义步数百位存储单元
BB
EQU
40H
;定义步数千位存储单元
QB
EQU
40H
;定义步数万位存储单元
WB
EQU
40H
;定义步数十万位存储单元
SWB
EQU
40H
;定义步数百万位存储单元
BWB
EQU
40H
;定义步数个位存储单元
SD
EQU
40H
;定义电机转速表查询偏移量存储单元
JK
EQU
40H
;定义电机控制表偏移量存储单元
KONZ
EQU
40H
;定义输入口按键按下状态暂存单元
KBL
EQU
40H
;定义输入口按键按下状态中间变量存储单元
SD_TAB:
DB72H,54H,05H,C5H,42H,95H,CEH,FDH,20H,3CH
DBF6H,FBH,FCH,FDH,FEH,FEH,FEH,FEH,FFH,FFH
3.2键盘录入子程序实现功能:
通过扫描键盘,判断是否有键按下,若有键按下则改变相应控制地址单元的内容,为后面的显示和电机控制做准备。
键盘数据录入子程序流程图如图3-2所示;输入键键号查询表IN_TAB见程序所用到的查询表及其说明部分表4-2;电机启/停控制和显示段选
码表SRDS_TAB见程序所用到的查询表及其说明部分表4-3;键盘扫描子程序流程图如图3-2所示。
键盘扫描方法:
由硬件设计可知,键盘是4*4的行、列结构设计,行由P1.0~P1.3口输入,列由P1.4~P1.7口输入,其中行线通过上拉电阻接+5V,平时无按键动作时,行线处于高电平状态,而当有按键按下时,则对应的行线和列线短接,行线电平状态将由与此行线相连的列线电平决定。
因此,其扫描方法是:
先令P1.4列线为低电平,其余三根列线为高电平,读行线状态。
如果行线都为高电平,则这一列线上没有键闭合,接着使下一列线P1.5为低电平,其余列线为高电平,用同样方法检查P1.5列上没无键闭合,依次类推,直到最后一列扫描完成。
KE_LOOP1:
LCALL
KUNM_SUB
;再次调用键盘扫描程序
ORL
A,#0FH
;键盘输入状态高四位置1
CJNE
A,#0FFH,KE_LOOP1
;若(A)=0FFH,键已释放,执行去抖动,否
;则转KE_LOOP1再次判断
MOV
R7,#10
;延时10ms去抖动
LCALL
DEL_SUB
;调用延时1ms程序
DJNZ
R7,KE_NEXT1
MOV
DPTR,#IN_TAB
;DPTR指向键号查询表首地址
MOV
R7,#0
;从0号键开始扫描
KE_LOOP2:
MOV
A,R7
;取键号
MOVC
A,@A+DPTR
;查表取出相应键号状态码
CJNE
A,KONZ,KE_NEXT2
;与输入状态相比较,若
LJMP
KE_NEXT3
;相等,则为该号键按下,转取键号
KE_NEXT2:
INC
R7
;否则取下一键号
LJMP
KE_LOOP2
;转再次扫描
KE_NEXT3:
MOV
A,R7
;取按下键键号
CJNE
A,#9,KE_NEXT4
;若键号=9,转设置步数
LJMP
B_SET
;否则转判断是否<9
KE_NEXT4:
JCB_SET
;若键号<9,转设置步数,否则顺序判断
CJNEA,#12,KE_NEXT5
;若键号≠12,
LJMPDJ_SET
KE_NEXT5:
;否则转电机控制设置
JCDJ_SET
;若键号<12,转电机控制设置,否则继续判断
CJNEA,#13,KE_NEXT7
;若键号≠13,转减速设置,
;则顺序设置加速
MOVA,SD
;取当前速度
CJNEA,#7,KE_NEXT6
;若当前速度≠7,转速度加1档
LJMPKE_NEXT
;否则当前速度为最大值,转子程序返回
KE_NEXT6:
INC
SD
;当前速度增加1档
LJMP
KE_NEXT
;转子程序返回
KE_NEXT7:
MOV
A,SD
;取当前速度
CJNE
A,#0,KE_NEXT8
;若当前速度≠0,转速度减1档
LJMP
KE_NEXT
;否则当前速度为最小值,转子程序返回
KE_NEXT8:
DEC
SD
;当前速度减1档
LJMP
KE_NEXT
;转子程序返回
B_SET:
MOV
BWB,SWB
;步数十万位移至百万位
MOV
SWB,WB
;步数万位移至十万位
MOV
WB,QB
;步数千位移至万位
MOV
QB,BB
;步数百位移至千位
MOV
BB,SB
;步数十位移至百位
SRDS_TAB:
DBC0H,F9H,A4H,B0H,99H,92H
DB82H,F8H,80H,90H,1,2,3;电机启/停控制和显示段选码表
键盘扫描程序代码:
KUNM_SUB:
MOV
P1,#0FFH
;键盘输入口置1
CLR
P1.4
;扫描第一列
MOV
A,P1
;读入输入状态
SETB
P1.4
;关闭扫描第一列
CLR
P1.5
;扫描第二列
MOV
A,P1
;读入输入状态
SETB
P1.5
;关闭扫描第二列
CLR
P1.6
;扫描第三列
MOV
A,P1
;读入输入状态
SETB
P1.6
;关闭扫描第三列
CLR
P1.6
;扫描第四列
MOV
A,P1
;读入输入状态
SETB
P1.6
;关闭扫描第四列
RET
;子程序返回
3.3显示程序
实现功能:
根据转速控制单元SD和步数控制单元GB(个位)、SB(十位)、BB(百位)、QB(千位)、WB(万位)、SWB(十万位)、BWB(百万位)的内容查询SRKS_TAB取相应显示段码送相应显示位显示。
电机启/停控制和显示段选码表SRDS_TAB见程序所用到的查询表及其说明部分表4-3;程序流程图如图3-4所示;
8位八段数码管显示方法:
由硬件结构可知,步数显示7位八段数码管和速度显示1位数码管的段选线并联在一起由单片机P2口控制,而各位的共阴极点分别由相应的P3口控制,实现各位的分时选通,构成8位的动态显示。
根据实际情况,每位显示的字符不同,因此软件设计必须采用扫描显示方式,即在每一个瞬间只使某一位显示相应字符。
在此瞬间,段选码由控制P2口输出需显示的段码,位选P3口输出位选码选通该位显示相应字符。
如此轮流,使每一位显示该应显示的字符,并延时一段时间,这里延时3ms,以造成视觉暂留效果。
显示代码如下:
DISP_SUB:
;显示子程序
MOV
P2,#0FFH
MOV
P3,#00H
;关显示
MOV
R7,#8
;设置显示位数
MOV
R0,GB
;取步数个位显示数字
MOV
DPTR,#SRDS_TAB
;DPTR指向控制与显示段码表首地址
MOV
A,#01H
;取步数位显示控制字
PUSH
ACC
;保护步数位显示控制字
MOV
A,@R0
;取步数显示数字
MOVC
A,@A+DPTR
;取显示段码
MOV
P2,A
;送显示
POP
ACC
;取出位显示控制字
MOV
P3,A
;打开位显示
DLOOP2:
MOV
R6,#3
;延时3ms
LCALLDEL_TAB;调用延时1ms程序
DJNZR6,DLOOP2;判断时是否到,未到刚返回延时,否则往下执行
RLA;取下一位显示控制字
INCR0;R0;指向下一位显示数字存储地址
DJNZR7,DLOOP1;若(R7)-1=0,八位显示完成,往下执行,否则转显示下一位MOVP2,#0FFH;
MOVP3,#00H;关显示
RET;子程序返回
SRDS_TAB:
DBC0H,F9H,A4H,B0H,99H,92HDB82H,F8H,80H,90H,1,2,3;电机启/停控制和显示段选码表
3.4电机控制程序
实现功能:
根据地址单元JK的内容控制电机的正转、反转和停止。
时间初值查询表SD_TAB见程序所用到的查询表及其说明部分表4-1;单片机输出控制字查询表MQ_TAB见程序所用到的查询表及其说明部分表4-4;程序流程图如图3-5所示:
电机控制程序代码如下:
KT0_INT:
;电机控制程序中断服务程序
MOV
DPTR,#SD_TAB
;DPRT指向转速查询表首地址
MOV
A,SD
;取转速查询表偏移量
MOVC
A,@A+DPTR
;取定时器低位初值
MOV
TL0,A
;装入定时器低位初值
MOV
A,SD
;取转速查询表偏移量
ADD
A,#10
;调整转速查询表偏移量,为取T0高位做准备
DA
A
;十进制数调整
MOVC
A,@A+DPTR
;取定时器高位初值
MOV
TH0,A
;装入定时器高位初值
MOV
R7,#7
;循环7次,分别判断7位步数是否为0
MOV
R0,#GB
;R0指向步数个位
KLOOP1:
MOV
A,@R0
;取位步数
CJNE
A,#0,KNEXT1
;若位步数=0,判断下一位,否则转判断电机控制状态
INC
R0
;R0指向步数下一位地址
DJNZ
R7,KLOOP1
;若(R7)-1=0,则步数每一位均为0,转
LJMP
KNEXT
;程序返回
KNEXT1:
MOV
A,JK
;取电机控制状态
CJNE
A,#1,KNEXT2
;若电机控制状态=1,电机正转,否则判断是否反转
LJMP
KNEXT2:
CJNE
MOV
CJNE
MOV
LJMP
ZZKZ
A,#2,KNEXT
A,KZ
A,#0,KNEXT3
A,#5
KNEXT6;
;转电机正转控制
;若电机控制状态≠2,电机处于停止状态,
;转返回,否则电机
;取上一次电机控制表偏移量;若上一次电机控制表偏移量为不;则电机控制表偏移量取5
0,转减1,若为0,
KNEXT3:
DEC
A
;电机控制表偏移量减1
LJMP
DNEXT5
;转取脉冲输出
ZZKZ:
MOV
A,KZ
;取上一次电机控制表偏移量
CJNE
A,#5,KNEXT4
;若上一次电机控制表偏移量为不
5,转加1,若为5,
MOV
A,#0
;则电机控制表偏移量取0
LJMP
KNEXT5
;转取脉冲输出
KNEXT4:
INC
A
;电机控制表偏移量加1
KNEXT5:
MOV
KZ,A
;保存当前电机控制表偏移量
MOV
DPTR,#MQ_TAB
;DPTR指向电机控制表首地址
MOVC
A,@A+DPTR
;取输出脉冲
MOV
P0,A
;输出脉冲
MOV
R7,#6
;步数减1循环6次
MOV
R0,#GB
;R0指向步数个位储存单元
KLOOP2:
MOV
A,@R0
;取位步数
CJNE
A,#0,KNEXT6
;若位步数≠0,转位步数-1,否则
MOV
@R0,#9
;往该位步数存9
INC
R0
;R0指向下一位
DJNZ
R7,DLOOP2
;若(R7)-1=0,六位判断完成,
百万位减1,否则继
;续判断
DEC
BWB
;百万位减1
LJMP
KNEXT
;转程序返回
KNEXT6:
DEC
A
;位步数