步进电机工作原理模拟程序设计
摘 要
本次设计通过汇编程序,模拟混合两相步进电机工作原理。通过按键控制步进电机的启动、停止与电机工作方式的选择,并且在PC显示器上模拟显示电机按指定转速周而复始的转动。本程序是基于8086系统,采用汇编语言实现,通过键盘扫描读取键盘值,选择步进电机的工作方式,实现控制四相步进电机的停转、快慢及正反转并在显示器上模拟显示电机按某转速周而复始的转动。
1设计任务分析与方案选择
本设计运用汇编语言编写程序实现对8255A的控制,实现四相步进电机按双八拍和双四拍的运行方式运行。通过键盘按键功能,实现电机的启动和停止,并在显示器上模拟显示电机按某转速周而复始的转动。由于本设计是在PC机上模拟电机的转动,所以不涉及硬件电路的设计。
1.1 方案选择
本设计涉及的主要硬件有:8086、8255、按键(模拟电脑键盘按键)、显示屏(模拟电脑显示屏)。
(1) 8086芯片结构:
(2)8255芯片结构及引脚:
1.1.2 设计原理分析
使步进电机按照一定的方式运转,则要控制步进电机的电流的输出顺序。将步进电机相序表存放于内存区,设置指针地址,从表中取出通电码,再输出到步进电机,产生一定的运行方式。四相步进电机双四拍正向加电码:AB-BC-CD-DA(03H,06H,0CH,09H),双八拍正向加电码:AB→ABC→BC→BCD→CD→CDA→DA→DAB(03H,07H,06H,0EH,0CH,0DH,09H,0BH)。
选择不同的工作方式可调用DOS系统功能,使用09H中断号显示提示信息。然后,使用25H中断号设置中断向量,然后使用21H功能号读取键盘值,存入设置的堆栈中。再从堆栈中取出键盘值,判断后执行对应功能。
模拟电机转动则需要显示程序。可调用BIOS,使用10H中断,设置功能号选择不同的功能,绘制简易图形。每取出一个加电码则需要调用不同的图形。
步进电机的转速与输入脉冲频率成正比,频率越高,转速越高。调节步进电机电机绕组通电时间,即可调整速度。模拟显示时可通过不同的延迟程序实现不同的转速。延时程序可使用8086系统BIOS功能,调用1AH中断号,设置延迟时长。
2详细设计
2.1 步进电机工作设计原理及实现方法
步进电机是将电脉冲信号转换成角位移的一种机电式数模转换器。其旋转的角位移与输入脉冲的个数成正比;转速与输入脉冲的频率成正比;转动方向和输入脉冲对绕组加电的顺序有关。因此,步进电机旋转的角度位移、转速以及方向均受输入脉冲的控制。
步进电机接口的硬件部分主要是提供输送相序代码的并行数据线(8根),以及保护电机绕组的器件,所以接口电路以8255A为主芯片,由8086传送加电代码.
步进电机的运行方式是指各相绕组循环轮流通电的方式。本次设计采用的是双八拍 即AB→ABC→BC→BCD→CD→CDA→DA→DAB步进电机的运行方式及方向控制
采用循环查表法。循环查表法是将各绕组加电顺序的控制代码编制成一张步进电机相序表(如表2.1所示),存放在内存区,在设置一个地址指针。
表2.1 步进电机相序表
绕组与数据线的连接 |
运行方式 |
相序表 |
查表方向 |
||||||||
D |
C |
B |
A |
双八拍 |
加电代码 |
正转 |
反转 |
||||
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
||||
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
AB |
03H |
||
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
ABC |
07H |
||
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
BC |
06H |
||
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
BCD |
0EH |
||
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
CD |
0CH |
||
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
CDA |
0DH |
||
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
DA |
09H |
||
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
DAB |
0BH |
8086是本次实验的核心部分,完成指令预取与执行。
2.3.2 模拟显示模块
8086按照相序表,取出加电码后,显示相应图形。图形的绘制使用8086BIOS功能设置中断号为10H,选择00H功能号,设置显示模式。设置图形颜色为0CH,设置起始、终点像素行和列,从而实现简单矩形的绘制。本设计中,取出03H显示SHOW1,取07H显示SHOW5,取出06H显示SHOW2,取出0EH显示SHOW6,取出0CH显示SHOW3,取出0DH显示SHOW7,取出09H显示SHOW4,取出0BH显示SHOW8。
实现步进电机运行方式、方向和速度以及启/停的控制,是接口软件设计的主要任务。为此,在编写程序之前,要建立一个相序表。相序表的建立应根据步进电机运行方式的要求及各绕组与8255A端口连接情况来确定加电代码。由表2.1,可以写出相序表中双八拍运行方式的加电代码为:03H,07H,06H,0EH,0CH,0DH,09H,0BH。
;仅开放键盘中断
IN AL,21H
AND AL,11111101B;设置屏蔽字,允许IR1键盘中断
OUT 21H,AL
STI ;CPU开中断,IF=1
MOV AH,09H ;显示提示
MOV DX,OFFSET WELCOM
INT 21H
;等待中断并测试是否结束
DELAY:MOV AL,KEYCODE ;从数据区读取按键的扫描码
CMP AL,4FH ;是END键扫描码4FH?
JNE DELAY ;不是继续
;显示退出本测试程序的提示
LEA DX,ENDTEST
MOV AH,09H
INT 21H
程序中先取原键盘中断向量保存,再设置新键盘中断向量。CPU开放中断,函数DELAY等待中断,从数据区读取按键的扫描码,如果是END键退出程序,不是则继续扫描。
2.4.2中断服务
CALL INIT
IN AL,60H ;读入字符扫描码
TEST AL,80H ;判断是否有按键按下
JNZ EXIT ;否,退出
AND AL,7FH
MOV KEYCODE,AL ;存键扫描码
CMP AL,1CH ;是否为ENTER?
JNZ EXIT ;否,退出中断
CALL BUJIN ;是,调用BUJIN子程序
程序中首先将AX、BX压栈,在子程序结尾弹出栈。子程序首先调用INIT子程序初始化8255,再按enter键,启动电机(即调用BUJIN子程序)。最后将AX,BX弹出。
2.4.3BUJIN子程序
MOV KEYCODE,AL;是,存键扫描码
CMP AL,02H ;按键1?
JZ A1 ;是,转A1,实现双四拍正向慢转
CMP AL,03H ;按键2?
JZ A2 ;是,转A2,实现双四拍正向快转
CMP AL,04H ;按键3?
JZ A3 ;是,转A3,实现双四拍反向慢转
CMP AL,05H ;按键4?
JZ A4 ;是,转A4,实现双四拍反向快转
CMP AL,06H ;按键5?
JZ A5 ;是,转A5,实现双八拍正向慢转
CMP AL,07H ;按键6?
JZ A6 ;是,转A6,实现双八拍正向快转
CMP AL,08H ;按键7?
JZ A7 ;是,转A7,实现双八拍反向慢转
CMP AL,09H ;按键8?
JZ A8 ;是,转A8,实现双八拍反向快转
CMP AL,1AH ;按键ESC?
MOV AL,[SI]
OUT 0EAH,AL
INC SI
CMP AL,03H
JZ S1
代码数据段定义双四拍和双八拍正反转对应的相序表。该子程序首先使用指针指向内容,然后将指针内容传AL,再将AL送至输出端口。最后判断所取内容,调用所对应的图形显示到显示屏,显示完成后,调用相应的延迟子程序实现电机的快慢转动。
2.4.5 延时子程序
MOV DX,10
DL1:
MOV CX,33144
DL2:
LOOP DL2
DEC DX
JNZ DL1
延时子程序,首先将CX,DX压栈,然后设置外循环次数,再设置内循环次数,调整外循环DX,实现不同的延时。
2.4.6显示子程序[2]
mov dx,50
backa:
mov cx,360
backb:
mov ah,0ch
mov al,0Ch ;
mov bh,0
int 10h
inc cx
cmp cx,380
jne backb
inc dx
cmp dx,80
jne backa
显示子程序,将AX,CX,DX压栈,然后调用BIOS功能[3],设置显示模式为彩色图像模式。如上代码,设置为粉底粉色图,设置起始行数为第50行,终点为第80行。设置起始列为第360列,终止列为380列,以此构建一个简单的粉色矩形。
2 系统调试与效果分析
4 问题解决
1.写几个子函数的时候,刚开始时都没有加通用寄存器的入栈出栈,没有将其保护起来,以至于一直认为是自己写的程序有问题,没有达到自己想要的效果。后来通过调试才发现这个问题。
2.模拟电机简单旋转时,由于延时以及指针送加电码时的代码顺序有错,使得图形快速显示完,并且最终停止第一图形。同时,后来改过代码之后,由于调用中断服务使用新键盘,由于不够仔细,致使双四拍正向慢转子程序无法调用,即按按键1时,执行了按键2的功能。
[1] 黄玉清, 刘双虎, 杨胜波. 微机原理与接口技术[M]. 电子工业出版社, 2015.
[2] 蒲江, 姚志强, 唐金艺. 用汇编语言创建图形界面[J].电脑开发与应用, 2006, 19(8):49-51.
[3]安布拉等. DOS/BIOS使用详解[M]. 电子工业出版社, 1989