资源描述
-/
大连理工大学本科设计报告
(计算机原理接口实验综合设计)
题目: 步进电机控制系统设计
课程名称: 计算机原理实验
学院(系): 电信
专 业: 自动化
班 级: 电自1301
学 号: 201382062
学生姓名: 宁博
成 绩:
2015年12月26 日
题目:步进电机
1. 设计要求
利用实验台上的开关K7控制步进电机的转向,利用电位器控制步进电机的转速。具体要求如下:
1. 利用D8255A的PA0-PA3做输出,输出步进电机的相序、驱动步进电机工作,相序之间的时间决定着步进电机的转速,而间隔时间由延时程序中的CX寄存器的初值决定。
2. 利用D8255A的PB7做输入控制转向,与K7连接。其中K7做步进电机的转向控制,用ADC0809实现AD转换,利用电位器控制转速,程序运行时通过K7和电位器对步进电机实施动态控制;
3. 利用8253做秒脉冲发生器,产生约2秒的周期性方波信号。其中CNT0做分频器:将1MHZ信号分频为100HZ;CNT1做秒脉冲输出(0.5HZ);
4. 利用386模块的主8259的MIR5做中断请求输入,将CNT1的OUT1秒信号方波作为中断请求信号,引发中断服务ISR;
5. 在中断服务程序中实现对步进电机的转速、转向实时控制。方法如下:在ISR中,对D8255A的PB口进行一次输入操作,并根据输入的数据:
1) 对D7(与K7对应)位的数据为步进电机的转向控制;
2) ADC0809读入的数据为步进电机的转速控制。
2 .设计分析及系统方案设计
1. 使用“寄存器间接寻址”的方式输出相序信号:将步进电机的相序数据定义在数据段当中,使用SI查表(间接寻址)获取相序数据。其中查表顺序决定着电机转动方向;
2. 对8253进行编程,使OUT1输出2秒周期的脉冲方波信号。为了便于调试,建议使用逻辑笔监测OUT1的输出;
3. 编制与中断相关的程序。包括中断屏蔽字的设定、中断向量表的创建以及开中断的操作。上述这些操作都应当加到程序的初始化中;
4. 编写中断服务程序ISR。在ISR中读取D8255A的PB口数据和AD转换的数据,然后进行数据分析、根据数据来调整CX寄存器中的数据,因而改变步进电机的转速和转向。
3.系统电路图
8253
OUT1
CLK1
GATE1
/CS
OUT0
CLK0
GATE0
1MHZ脉冲
K7输入
K6输入
……
K0输入
Vcc
210H
MIR5
8255A
PA3
PA2
PA1
PA0
D7
D0
A1
A0
/CS
PB7
PB6
....
PB0
LED3
LED2
LED1
LED0
200H
步进
电机
5~12V
BJ_IN4
BJ_IN3
BJ_IN2
BJ_IN1
系统总线
K7
…
…
…
K0
0.5HZ方波
+5V
ADC0809模块
IN7
…
IN0
/IOW
A0
A0
/IOR
A1
A1
500KH
ADDA
ADDB
CLOCK
ADDC
D7
..
D0
220H
总线区
/CS
VCC
VREF(-)
VREF(+)
图 1 .1 实验参考逻辑电路
4 .外围接口模块硬件电路功能描述
8253具有三个独立的16位减法计数器,每个计数器可按照二进制或十进制计数,每个通道都有六种不同的工作方式。
8255有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。 其各口功能可由软件选择,使用灵活,通用性强。8255可作为主机与多种外设连接时的中间接口电路。
ADC0809 是8位逐次逼近式A/D模数转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换,具有转换起停控制端。模拟输入电压范围0~+5V,不需零点和满刻度校准。
5 主程序中主要变量说明
变量名称
内存单元
功能
FLAG
AX
转向标志
SPEED
SI
可调转速
SD
AL
默认转速
6.系统软件中各个子程序的功能描述
子程序名称
入口参数
出口参数
功能 描述
service
io8255_B ADC0809
SD
中断服务
DELAY
无
无
延时
speedin
无
无
电机按照一定参数转起来
7.主程序程序流程图
从8255的B口
输入数据
中断结束命令
PB7=1?
N
修改方向标志
Flag=1
Y
从0809读数据
设定CX值
ISR
D8255A 的初始化
PA、PB输出
8253 初始化
CNT0方式3、初值
CNT1方式2、初值
主片8259初始化
设置屏蔽字
创建35H的中断向量表
开中断
开始
(a)主程序流程图
IRET
修改方向标志
Flag=0
Flag=1?
顺时驱动
(等待中断)
逆时驱动
(等待中断)
(b)中断服务程序流程图
图 1.2 程序流程图
建立方向标志
Flag=1
Y
N
8.程序清单
IO_ADDRESS equ 200h
time equ 210h
ad_io equ 220h
data segment
order1 db 01h,03h,02h,06h,04h,0ch,08h,09h
order2 db 09h,08h.0ch,04h,06h,02h,03h,01h
FLAG db ?
speed dw 0300h,0380h,0480h,0580h,0680h,0780h,0880h
SD dw 0280h ;默认转速
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx,IO_ADDRESS
add dx,03
mov al,82h ;B端口输入,A、C输出,方式0
out dx,al
cli
mov FLAG,00h ;标志位置0
in al,021h ;设置中断屏蔽字
and al,11011111b ;IR5
out 021h,al
push ds ;设置中断向量表
mov ax,0
mov ds,ax
mov si,35h
add si,si
add si,si
mov ax,offset service
mov [si],ax
push cs
pop ax
mov [si+2],ax
pop ds
mov dx,time ;分频得到0,5s脉冲
add dx,03
mov al,37h ;计数器0,方式3,BCD码计数,先低后高
out dx,al
mov dx,time ;计数器0设初值
mov al,0
out dx,al
out dx,al ;写初值10000
mov dx,time
add dx,03
mov al,56h ;计数器1,方式3,二进制计数,低8位
out dx,al
mov dx,time ;设计数器1初值为200
inc dx
mov al,200 ;产生0.5s脉冲
out dx,al
sti
speedin:
cmp FLAG,01h ;转向,转速
jz ccc
mov dx,IO_ADDRESS
mov cx,08
lea si,order1
aaa: mov al,[si]
out dx,al
call delay
inc si
loop aaa
jmp speedin
ccc: mov dx,IO_ADDRESS
mov cx,08
lea si,order2
ddd: mov al,[si]
out dx,al
call delay
inc si
loop ddd
jmp speedin
service proc far ;中断服务子程序
push ax
push dx
push si
push bx
mov dx,IO_ADDRESS
inc dx
in al,dx
mov bl,al
shl bl,1
jnc mmm ;CF=0,则跳转
mov FLAG,01H
mov dx,ad_io ;ADC启动转换地址
out dx,al ;启动ADC
mov dx,ad_io ;获取ADC EOC状态地址
add dx,2
L1: in al,dx
test al,01h ;测试EOC=1?
jz L1
mov dx,ad_io ;读数据地址
inc dx
in al,dx
cmp al,00H
jnz cmp11
mov SD,0280h
jmp endser
cmp11:
cmp al,10H
jnc cmp12
mov si,WORD PTR speed[0]
mov SD,si
jmp endser
cmp12:
cmp al,20H
jnc cmp13
mov si,WORD PTR speed[2]
mov SD,si
jmp endser
cmp13:
cmp al,30H
jnc cmp14
mov si,WORD PTR speed[4]
mov SD,si
jmp endser
cmp14:
cmp al,40H
jnc cmp15
mov si,WORD PTR speed[6]
mov SD,si
jmp endser
mmm: jmp cmp20
cmp15:
cmp al,50H
jnc cmp16
mov si,WORD PTR speed[8]
mov SD,si
jmp endser
cmp16: cmp al,60H
jnc cmp17
mov si,WORD PTR speed[10]
mov SD,si
jmp endser
cmp17:
mov si,WORD PTR speed[12]
mov SD,si
jmp endser
cmp20: mov dx,ad_io
out dx,al
mov dx,ad_io
add dx,2
L2: in al,dx
test al,01h
jz L2
mov dx,ad_io
inc dx
in al,dx
mov FLAG,00H
cmp al,00H
jnz cmp21
mov SD,0280H
jmp endser
cmp21:
cmp al,10H
jnc cmp22
mov si,WORD PTR speed[0]
mov SD,si
jmp endser
cmp22:
cmp al,20H
jnc cmp23
mov si,WORD PTR speed[2]
mov SD,si
jmp endser
cmp23:
cmp al,30H
jnc cmp24
mov si,WORD PTR speed[4]
mov SD,si
jmp endser
cmp24:
test al,40H
jnc cmp25
mov si,WORD PTR speed[6]
mov SD,si
jmp endser
cmp25:
cmp al,50H
jnc cmp26
mov si,WORD PTR speed[8]
mov SD,si
jmp endser
cmp26:
cmp al,60H
jnc cmp27
mov si,WORD PTR speed[10]
mov SD,si
jmp endser
cmp27:
mov si,WORD PTR speed[12]
mov SD,si
endser: ;发EOI命令
mov al,20h
out 20h,al
pop bx
pop si
pop dx
pop ax
sti
iret
service endp
delay proc ;延时程序
push ax
push cx
push dx
mov dh,6
x1: mov cx,SD
x2: loop x2
dec dh
jnz x1
pop dx
pop cx
pop ax
ret
delay endp
code ends
end start
9.系统调试运行结果说明、分析所出现得问题,设计体会与建议
运行结果说明:
基本完成了任务要求,可以控制步进电机的转速和旋转方向。
问题:
通过寄存器间接寻址的方法使电机旋转,在此程序中电机运行状态的改变稍有延迟,原因是在主程序中,状态的改变是在一个完整的相序周期结束后才发生的,可能需要等待循环的过程,稍有延迟。
结论及设计体会:
微机原理实验的学习使我对对汇编语言有更加进一步的了解,从理论到实际的应用。并且通过本实验让我对汇编语言产生很大的兴趣,让我掌握了汇编编程的总体思路。课程设计对我是一次很好的锻炼,综合运用所学的芯片,我进一步的掌握了对8255A,8253以及ADC0809的编程方法,对我们以后的工作和学习起到的积极的作用。
展开阅读全文
相关搜索