资源描述
哈 尔 滨 理 工 大 学 荣 成 学 院
课程设计
步进电机单片机控制系统的设计
姓名: &&&&
专业: 电机与电器
班级: 0&&&&&&
学号: *********
日期: 2012年5月10日
一、设计题目的背景
1.步进电机的原理
步进电动机又称为脉冲电动机,是数字控制系统的一种执行元件,其功用是将脉冲信号变换为相应的角位移或直线位移,既给一个脉冲电信号,电动机就转动一个角度或前进一步。
步进电动机的控制原理是通过它每相线圈的电流的顺序切换来使电机作步进式旋转,驱动电路由脉冲控制,所以调节脉冲的频率便可改 变步进电机的转速,微控制器最适合控制步进电机。
此次设计步进电机共有四个相位(A、B、C、D),按转动步骤分为单四拍(A 、 B 、 C 、 D 、 A)
四相双四拍:电机正转 ( AB 、 BC 、 CD 、 DA 、AB)
电机反转 ( DA、AB 、 BC 、 CD、 DA)
单双8拍(A、 AB、 B、 BC、 C、CD 、 D、DA、 A)
2.应用领域
(1)应用领域相当广泛,只要是要有动力源的,而且对精度有要求的一般都可能涉及到伺服电机。如机床、印刷设备、包装设备、纺织设备、激光加工设备、机器人、自动化生产线等对工艺精度、加工效率和工作可靠性等要求相对较高的设备。
(2)广泛应用于ATM机、喷绘机、刻字机、写真机、喷涂设备、医疗仪器及设备、计算机外设及海量存储设备、精密仪器、工业控制系统、办公自动化、机器人等领域。特别适合要求运行平稳、低噪音、响应快、使用寿命长、高输出扭矩的应用场合。
(3)步进电机在电脑绣花机等纺织机械设备中有着广泛的应用,这类步进电机的特点是保持转矩不高,频繁启动反应速度快、运转噪音低、运行平稳、控制性能好、整机成本低。
二、设计原理
1、设计目的
(1)了解步进电机的基本原理,掌握步进电机的转动编程方法
(2)了解影响电机转速的因素有哪些
2、方案的比较
在于对步进电机的控制和驱动,设计中受控电机为四相六线制的的步进电机。
方案一:使用多个功率放大器驱动电机
通过使用不同的放大电路和不同参数的器件,可是达到不同的放大要求,放大后能够得到较大的功率,但是由于使用的是四相的步进电机,就需要对四路信号分别放大,而放大电路很难达到完全一致,当电机的功率较大时运行会不稳定,而电路的制作也比较复杂。
方案二:使用ULN2003芯片驱动电机
ULN2003可以驱动两个二相电机,也可以驱动一个四相电机,它工作电压高,工作电流大,并且能够在关太时承受50V的电压,输出还可以在高负载电流并行运行,可直接用单片机的I/O口提供信号;而且电路简单,使用比较方便。
通过比较,使用ULN2003芯片充分发挥了它的功能,能稳定地驱动步进电机,且价格不高,故选用ULN2003驱动电机。
三、电路设计
1.单片机型号的选择
80C51单片机属于MCS-51系列单片机,增加了如乘(MUL)、除(DIV)、减(SUBB)、比较(PUSH)、16位数据指针、布尔代数运算等指令,以及串行通信能力和5个中断源。采用40引脚双列直插式DIP(Dual In Line Package),内有128个RAM单元及4K的ROM。80C51有两个16位定时计数器,两个外中断,两个定时计数中断,及一个串行中断,并有4个8位并行输入口。80C51内部有时钟电路,但需要石英晶体和微调电容外接,本系统中采用12MHz的晶振频率。由于80C51的系统性能满足系统数据采集及时间精度的要求,而且产品产量丰富来源广,应用也很成熟,故采用来作为控制核心。
80C31单片机,它是8位高性能单片机结合了HMOS的高速和高密度技术及CHMOS的低功耗特征。80C31内置中央处理单元、128字节内部数据存储器RAM、32个双向输入/输出(I/O)口、2个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。但80C31片内并无程序存储器,需外接ROM。此外,80C31还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能。
综上,所以选择80C51单片机.
2.硬件电路设计
四、 软件设计
1、程序框图
N
Y
N
Y
N
N
N
N
0->需要刷新显示标志
1->步进电机未转动过标志
1->转动方向标志(1:表示顺时针方向)
33H->下次送给步进电机值
5->步进电机转速
初始化8255(PC口输出)
初始化8253(计数器T0设置在模式2状态,BCD码计数,CLK0/210)
初始化8259(允许8253中断)
初始化8253中断向量
初始化显示缓冲区:
(数码管第8位:0,顺时针方向;5、7位消隐;6位:转速;
1、2、3、4位:0,表示连续转动,其他值表示需要转动的步数)
调用显示子程序
有键按下
需要刷新显示标志=1
0->需要刷新显示标志
调用步数调整子程序
关中断(终止步进电机转动)
数码管的1、2、3位->2、3、4位
键值送给数码管的第一位
调用改变转向子程序
键值>9
键值=0AH
调用增速子程序
调用减速子程序
调用启动步进电机子程序
Y
键值=0BH
键值=0CH
键值=0DH
开始
Y
Y
Y
改变方向子程序:
Y
Y
N
N
Y
开始
转动方向标志=0
91H->下次送给步进电机值
下次送给步进电机值循环右移二次
1->转动方向标志
0->送给数码管的第7位
步进电机未转动过标志
33H->下次送给步进电机值
下次送给步进电机值循环左移二次
0->转动方向标志
1->送给数码管的第7位
步进电机未转动过标志
返回
启动步进电机子程序:
Y
N
Y
开始
0->步进电机未转动过标志
取转动步数
取转速对应的延时值(转速延时)
初始转速延时1=初始转速延时
转速延时< 50
初始转速延时=50
返回
开定时器0
初始转速延时=转速延时
增速子程序:
Y
N
开始
转速=11
转速+1
转速送给数码管第5位
返回
减速子程序:
N
Y
开始
转速=0
转速-1
转速送给数码管第5位
返回
N
N
Y
N
N
N
Y
Y
N
Y
初始转速延时1=转速延时
初始转速延时 -1=0
时
初始转速延时1 - 1
初始转速延时=初始转速延时1
1-1
转动方向标志=0
时
下次送给步进电机值循环右移一次
1-1
转动步数=0
时
1->需要刷新显示标志转动步数减一
1-1
转动步数=0
时
关中断
开始
下次送给步进电机值循环左移一次
1-1
返回
下次送给步进电机值->P1口(控制步进电机转动一步)
Y
2.完整程序
11
EXTRN CODE(INIT8279,SCAN_KEY,Display8)
MAIN_CODE SEGMENT CODE
MAIN_BIT SEGMENT BIT
MAIN_DATA SEGMENT DATA
STACK SEGMENT IDATA
;PUBLIC INIT8279,SCAN_KEY,Display8
CMD_8279 XDATA 0bF01H
DATA_8279 XDATA 0bF00H
RSEG MAIN_DATA
StepControl: DS 1
buffer: DS 8
SpeedNo: DS 1
StepDelay: DS 1
StartStepDelay: DS 1
StartStepDelay1: DS 1
RSEG MAIN_BIT
bFirst: DBIT 1
bClockwise: DBIT 1
bNeedDisplay: DBIT 1
RSEG STACK
DS 20H
CSEG AT 0000H
LJMP STAR
CSEG AT 000BH
LJMP TIMER0
RSEG MAIN_CODE
STAR: MOV SP,#STACK-1
ACALL INIT8279
SETB bFirst
SETB bClockwise
MOV StepControl,#33H
MOV SpeedNo,#5
MOV TMOD,#02H
MOV TH0,#55
MOV TL0,#55
MOV IE,#82H
MOV Buffer+7,#0
MOV buffer+6,#0
MOV buffer+5,#0
MOV buffer+4,#0
MOV buffer+3,#10H
MOV buffer+2,SpeedNo
MOV buffer+1,#10H
MOV buffer,#0
STAR2: MOV R0,#buffer
ACALL Display8
STAR3: ACALL Scan_Key
JC STAR5
JNB bNeedDisplay,STAR3
CLR bNeedDisplay
ACALL Step_SUB_1
SJMP STAR2
STAR5: CLR TR0
CJNE A,#10,$+3
JNC STAR1
MOV buffer+4,buffer+5
MOV buffer+5,buffer+6
MOV buffer+6,buffer+7
MOV Buffer+7,A
SJMP STAR2
STAR1: CJNE A,#14,$+3
JNC STAR3
MOV DPTR,#DriverTab
CLR C
SUBB A,#10
RL A
JMP @A+DPTR
DriverTab: SJMP Direction
SJMP Speed_up
SJMP Speed_Down
SJMP Exec
Direction: CPL bClockwise
JB bClockwise,Clockwise
MOV buffer,#1
AntiClockwise: JNB bFirst,AntiClockwise1
MOV StepControl,#91H
SJMP Direction1
AntiClockwise1: MOV A,StepControl
RR A
RR A
MOV StepControl,A
SJMP Direction1
Clockwise: MOV buffer,#0
JNB bFirst,Clockwise1
MOV StepControl,#33H
SJMP Direction1
Clockwise1: MOV A,StepControl
RL A
RL A
MOV StepControl,A
Direction1: SJMP STAR2
Speed_up: MOV A,SpeedNo
CJNE A,#11,Speed_up1
SJMP speed_up2
Speed_up1: INC SpeedNo
MOV buffer+2,SpeedNo
Speed_up2: SJMP STAR2
Speed_Down: MOV A,SpeedNo
JZ Speed_Down1
DEC SpeedNo
MOV buffer+2,SpeedNo
Speed_Down1: SJMP STAR2
Exec: CLR bFirst
ACALL TakeStepCount
MOV DPTR,#StepDelayTab
MOV A,SpeedNo
MOVC A,@A+DPTR
MOV StepDelay,A
CJNE A,#50,$+3
JNC Exec1
MOV A,#50
Exec1: MOV StartStepDelay,A
MOV StartStepDelay1,A
SETB TR0
AJMP STAR2
StepDelayTab: DB 250,125,83,62,50,42,36,32,28,25,22,21
TIMER0: PUSH ACC
DJNZ StartStepDelay,TIMER0_1
MOV A,StartStepDelay1
CJNE A,StepDelay,TIMER0_5
SJMP TIMER0_2
TIMER0_5: DEC A
MOV StartStepDelay1,A
TIMER0_2: MOV StartStepDelay,A
MOV A,StepControl
CPL A
MOV P1,A
CPL A
JB bClockwise,TIMER0_3
RR A
SJMP TIMER0_4
TIMER0_3: RL A
TIMER0_4: MOV StepControl,A
MOV A,R6
ORL A,R7
JZ TIMER0_1
SETB bNeedDisplay
DJNZ R7,TIMER0_1
DJNZ R6,TIMER0_1
CLR TR0
TIMER0_1: POP ACC
RETI
Step_SUB_1: MOV R5,#4
MOV R0,#buffer+7
Step_SUB_1_1: MOV A,@R0
DEC @R0
JNZ Step_SUB_1_2
MOV @R0,#9
DEC R0
DJNZ R5,Step_SUB_1_1
Step_SUB_1_2: RET
TakeStepCount: MOV A,buffer+4
MOV B,#10
MUL AB
ADD A,buffer+5
MOV B,#10
MUL AB
ADD A,buffer+6
MOV R7,A
MOV A,B
ADDC A,#0
MOV B,#10
MUL AB
XCH A,R7
MOV B,#10
MUL AB
XCH A,B
ADD A,R7
XCH A,B
ADD A,buffer+7
MOV R7,A
MOV A,B
ADDC A,#0
MOV R6,A
CJNE R7,#0,TakeStepCount1
RET
TakeStepCount1: INC R6
RET
INIT8279: MOV A,#34H
MOVX @DPTR,A
CLR A
MOV DPTR,#CMD_8279
MOVX @DPTR,A
INIT8279_1: CALL CLEAR
MOV A,#90H
MOVX @DPTR,A
RET
CLEAR: MOV A,#0DEH
MOV DPTR,#CMD_8279
MOVX @DPTR,A
WAIT1: MOVX A,@DPTR
JB ACC.7,WAIT1
RET
SCAN_KEY: MOV DPTR,#CMD_8279
MOVX A,@DPTR
READ_FIFO: ANL A,#7
JZ NO_KEY
READ: MOV A,#40H
MOVX @DPTR,A
MOV DPTR,#DATA_8279
MOVX A,@DPTR
ACALL KEY_NUM
SETB C
SCAN_KEY1: RET
NO_KEY: CLR C
SJMP SCAN_KEY1
KEY_NUM: ANL A,#3FH
RET
WRITE_DATA: MOV DPTR,#DATA_8279
MOVX @DPTR,A
RET
LED_TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 080H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH
RET
Display8: PUSH 07H
MOV DPTR,#LED_TAB
MOV P2,#HIGH(CMD_8279)
MOV R1,#LOW(CMD_8279)
MOV A,#90H
MOVX @R1,A
MOV R1,#LOW(DATA_8279)
MOV R7,#8
Display81: MOV A,@R0
MOVC A,@A+DPTR
MOVX @R1,A
INC R0
DJNZ R7,Display81
POP 07H
RET
END
五、结语
1、运行结果
首次运行时电机不会旋转,在加入子程序时,电机只能做单方向简单旋转,当加入子程序(INIT8279:到LED_TAB:)电机才能做正反转方向的转动,且能加减速。键盘上A表示正反转的切换并且定时,当LED灯显示为0使步进电机会不停地转下去,B表示加速,最高速度为12级,C表示减速,D表示输入的拍数,按下D键电机转动,按任意键电机停止转动。
2、评价和改进建议
设计的步进电机基本能实现预期目标,经过调试和修改,但还存在问题,比如按开关时会出现不稳定情况,有时高速启动不起来现象,显示有时也有些不理想。这些原因一般是硬件或是处理程序不完善造成的,还待进一步的完善。
六、参考文献
[1] 李全利.单片机原理及应用技术.高等教育出版社,北京.2009
[2] 张永枫.单片机应用实训教程.机械工业出版社,北京.2009
[3] 林春景.单片机原理与应用.机械工业出版社,北京.2009
[4] 杨居义.单片机课程设计指导.清华大学出版社,北京.2009
[5] 张小林、崔洗.51单片机常用模块设计查询手册.清华大学出版社,北京.2010
[6] 王君.单片机原理及控制技术.机械工业出版社,北京.2010
展开阅读全文