计算机课程设计.docx
《计算机课程设计.docx》由会员分享,可在线阅读,更多相关《计算机课程设计.docx(13页珍藏版)》请在冰豆网上搜索。
计算机课程设计
大连理工大学本科设计报告
题目:
步进电机控制系统设计
课程名称:
计算机原理实验
学院(系):
电信学部
专业:
通信工程
班级:
学号:
学生姓名:
成绩:
2014年12月28日
题目:
步进电机控制系统
一、设计要求
利用实验台上的开关(K7-K0),实现步进电机的转速、转向控制。
具体要求如下:
1.利用D8255A的PA0-PA3做输出,输出步进电机的相序、驱动步进电机工作(使用四个LED监视步进电机的相序信号),相序之间的时间决定着步进电机的转速,而间隔时间由延时程序中的CX寄存器的初值决定(参见实验教材3.1.3章节)。
2.利用D8255A的PB7-PB0做输入,与K7-K0连接。
其中K7做步进电机的转向控制,其余位做步进电机的转速控制。
程序运行时通过K7-K0对步进电机实施动态控制;
3.利用8253做秒脉冲发生器,产生约2秒的周期性方波信号。
其中CNT0做分频器:
将1MHZ信号分频为100HZ;CNT1做秒脉冲输出(0.5HZ);
4.利用386模块的主8259的MIR5做中断请求输入,将CNT1的OUT1秒信号方波作为中断请求信号,引发中断服务ISR;
5.在中断服务程序中实现对步进电机的转速、转向实时控制。
方法如下:
在ISR中,对D8255A的PB口进行一次输入操作,并根据输入的数据:
1)对D7(与K7对应)位的数据为步进电机的转向控制;
2)对D6-D0(与K6-K0对应)位的数据为步进电机的转速控制。
在程序中建立一个“转向标志”,初始化时=1,并在后续中的中根据输入的K7来修改。
回到主程序后,主程序根据该标志决定电机的旋转方向。
二、设计分析及系统方案设计
1.利用定时器8254的输出OUT1产生定时引发中断,在中断服务程序中对步进电机的驱动
定时器的定时初值决定了定时器溢出的频率,也就是引发中断的频率,而中断服务的操作是输出步进电机新的相序代码、控制着步进电机的转动速度。
2.整个实验相关的模块有8254定时计数器、8255A并行端口、步进电机模块和386EX中的主8259A的IRQ5。
Ø8254的CNT0设计为模式3(分频器),其输出作为CLK1的输入计数脉冲。
CNT1设计为模式3或2,此信号的输出OUT1用于引发系统的中断;
Ø8255A的PA口作输出,用于输出步进电机的相序代码,PB口作输入,PB7位的数据控制转向,PB6~PB0位的数据控制转速;
Ø385EX的IRQ5(总线信号:
MIR5)的工作模式以固定为边沿触发、中断类型码35H
3.步进电机驱动编程算法
步进电机驱动原理是通过对电机每相线圈中的电流的顺序切换来使电机作步进式旋转。
驱动电路由脉冲信号来控制,所以调节脉冲信号的频率便可改变步进电机的转速。
如下表所示:
本实验使用的步进电机用直流+5V电压,每相电流为0.16A,电机线圈由四相组成
即:
1(BA);2(BB);3(BC);4(BD)驱动方式为二相激磁方式,各线圈通电顺序如下表:
表1步进电机的运转相序代码
顺序
BA
BB
BC
BD
逆时针
0
1
1
0
0
1
0
1
1
0
2
0
0
1
1
3
1
0
0
1
顺时针
首先向1线圈—2线圈输入驱动电流,接着2—3,3—4,4—1,又返回到1—2,按这种顺序切换,电机按顺时针方向旋转。
可通过在节拍之间加入掩饰的方法控制步进电机的转速。
实验中采用8284来实现硬件定时、软件查询的方式实现定时操作及步进电机的转速控制。
将CNT1设定为模式2,即周期性的“1/N低电平”方式,N决定着定时的长短,通过检测OUT1的低电平获取定时信息。
三、硬件电路图
1.8255的A口作输出,与步进电机的输入端连接:
PA0—BA,PA1—BB,PA1—BC,PA3—BD;
2.8255的B口作输入,PB7与K7连接,控制转向;若用K6~K0控制转速,则对应与PB6~PB0连接,若用电位器控制转速,则不用到PB6~PB0,直接将ADC0809的数字量输入相序代码寄存器AL;若用8253定时查询方式,检测8253定时时间到否,则PC0作输入,与8253的OUT1连接用于查询8253的定时时间,若用8253定时中断法,则不用到PC0,8253的OUT1连接MIR5.
3.
8253的CLK0接1Mhz脉冲,OUT0与CLK1连接,GATE0和GATE1都接高电平
4.使用四个LED灯来监视电机相序的变换状态
四、外围接口模块硬件电路功能描述
1.步进电机驱动电路
步进电机驱动原理是通过对电机每相线圈中施加某一顺序的电压(电流)来使电机作步进式旋转。
驱动电路由脉冲信号来控制,所以调节脉冲的频率便可改变步进电机的转速。
2.8283/8254定时器和8255并行接口芯片
8253具有三个独立的16位减法计数器,每个计数器可按照二进制或十进制计数,每个通道都有六种不同的工作方式。
8255有3个8位并行I/O口。
具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。
其各口功能可由软件选择,使用灵活,通用性强。
8255可作为主机与多种外设连接时的中间接口电路。
3.AD转换器0809
START:
启动脉冲输入,高电平有效(>100nS);
EOC:
转换结束标志输出,高电平有效;
OE:
输出三态控制,高电平有效;
IN0~IN7:
A/D转换器的八路模拟电压输入线;
ADDA~ADDC:
八路模拟输入选择控制输入线;
ALE:
地址锁存线,高电平时锁存;
D0~D7:
具有三态功能的数字量输出线;
CLOCK:
外时钟输入线。
640KHZ时钟脉冲;
VCC:
+5V电源线;
VR(+)、VR(-):
参考电压输入线。
五、主程序变量和子程序功能
1.主程序变量
变量名称
内存单元
功能
buf
Al
步进电机初始相序
2.系统软件中各个子程序的功能描述
子程序名称
入口参数
出口参数
功能描述
int_proc
p8255b
P8255a
中断服务函数
Adc0809
AD_IO
Al相序代码
ad转换子程序
六、程序流程图
七、程序清单
;*******************************************************;
;--------------------步进电机控制实验-------------------;
;*******************************************************;
io8253_0equ200h;8253CNT0的端口地址
io8253_1equ201h;8253CNT1的端口地址
io8253_kequ203h;8253控制寄存器的端口地址
p8255_aequ210h;8255的a口地址
p8255_bequ211h;8255的b口地址
p8255_cequ212h;8255的c口地址
p8255_ctlequ213h;8255的控制口地址
ad_ioequ220h;ADC_CS=220h
datasegment
bufdb0
dataends
codesegment
assumecs:
code,ds:
data
start:
cli;关中断
movax,cs;设定数据段与代码段在同一段中
movds,ax
movax,data
movds,ax
;-----------------------设置386EX主8259中断屏蔽字---------------
inal,21h
andal,11011111b;开放IR5中断
out21h,al
;--------------------------设置中断向量表-------------------------
pushds
movax,0
movds,ax
leaax,cs:
int_proc;ax指向中断程序的入口地址
movsi,35h;类型码=35h
addsi,si
addsi,si;35h*4=D4h
movds:
[si],ax;中断向量表的IP值
pushcs
popax
movds:
[si+2],ax;中断向量表的CS值(=0000h)
popds
movdx,p8255_ctl;指向8255的控制口
moval,8bh;设定A口为方式0输出,B、C口方式0输入
outdx,al;写入控制字
movbuf,33h;buf=33h初始相序0011B
movdx,io8253_k
moval,36h;设8253计数器0为方式3
outdx,al
movdx,io8253_0
movax,100;写入计数器0初值为100
outdx,al
moval,ah
outdx,al
movdx,io8253_k
moval,74h;设8253计数器1为方式2
outdx,al
movdx,io8253_1
movax,40;写入计数器1初值(必须大于35)
outdx,al
moval,ah
outdx,al
out1:
moval,buf
movdx,p8255_a
outdx,al;输出步进电机的相序代码
sti;开中断
;-------------------------------等待中断----------------------------
LLL:
nop
JmpLLL;等待中断
;------------------------------中断服务子程序-----------------------
int_procprocfar
pushax
pushcx
calladc;调用ad转换子程序
movdx,p8255_b;指向8255的B口、输入K信号
inal,dx;将开关值写入到al
testal,80h;方向控制:
判断K7=1?
Jnznx0
moval,buf;K7=0时,电机正转
roral,1;相序代码循环右移
jmpnx1
nx0:
moval,buf;K7=1时,电机反转
rolal,1;相序代码循环左移
nx1:
movdx,p8255_a;指向8255的A口
outdx,al;输入步进电机的相序代码
movbuf,al;移位后的相序代码重新写入变量buf
moval,20h;发送中断结束命令
out20h,al
popax
popcx
sti
iret
int_procendp
adc0809procnear;AD转换子程序
pushdx
pushax
;--------------------ADC软件查询法进行模数转换------------------------
MOVDX,AD_IO;ADC启动转换地址
OUTDX,AL;启动ADC
MOVDX,AD_IO;获取ADC的EOC状态地址
ADDDX,2
L1:
INAL,DX
TESTAL,01H;测试EOC=1?
JZL1
MOVDX,AD_IO;读数据地址
INCDX
INAL,DX;读入到相序代码寄存器AL
MOVAH,0
MOVDL,2
DIVDL;AX/2得到一个合适的计数器CNT1的初值范围
;-----------------------数字量结果存入AX----------------------------
;改变8253CNT1的计数初值,从而改变转速……
;movdx,p8255_b;指向8255的B口
;inax,dx;读取switchK7~K0的值
;andax,7fh;屏蔽K7
addax,40;要求计数器1的最低初值为35
movdx,io8253_1;重新写入8253CNT1的计数初值
outdx,al
moval,ah
outdx,al
popax
popdx
ret;子程序返回
adc0809endp
codeends
endstart
八、系统调试运行结果说明、分析所出现得问题,设计体会与建议
1.运行结果
程序编辑完成后,正确连接电路,编译—连接—运行,在385EX实验箱中,可以观察到:
若以K7控制转向,K6~K0控制转速,步进电机可以正常工作:
K7=0,顺时针旋转,K7=0,逆时针旋转;K6~K0以二进制数值加上计数器CNT1最低计数初值40,和值作为新的计数初值,改变电机转速,K6~K0均为0时,转速最大,K6~K0均为1时,转速最小。
若仅用K7控制转向,通过电位器控制转速,则p8255b口仅用到PB7输入,PB6~PB0均空闲,旋转电位器,通过改变输入电压改变转速,电机正常工作:
K7=0,顺时针旋转,K7=0,逆时针旋转;电位器输出电压U=0V时,转速最快,U=5V时,转速最慢。
2.问题及改进措施
为了达到一个比较理想的转速控制效果,首先得找出合适的转速范围所对应的计数器CNT1的计数初值。
实验中实测得计数初值在40~250范围内能观察到一个比较理想的速度变化效果。
通过K6~K0控制转速时,有两种方式:
(1)K6~K0分别对应CNT1的六个计数初值,作为6个档速,读取p8266b时分别判断K6~K0的状态,从而写入对应的计数初值,实现六种转速控制
(2)把K6~K0的值作为二进制数读到AL中,加上最小计数基值40,和值作为CNT1的计数初值,实现转速控制,此时K6~K0共同作用,改变转速
当引入ADC0809,通过电位器控制转速时,将AD转换后数字量结果,通过合适的处理,使其范围在合理转速变化的计数初值范围内,加上最小计数基值40,和值作为CNT1的计数初值,实现转速控制。
此种方式处理较为方便,缺点是旋动电位器时,转速变化不均匀。
当设定6种档速,并引入ADC0809时,则需要对AD转换得到的数字量0~255进行划分6段,每段对应一种转速,才能看到比较理想调速效果。
九、结论及设计体会
通过综合设计实验,让我对汇编语言的应用有了更为清晰的认识,综合设计,要求我们对硬件接口有清晰的理解,对汇编语言的运用有足够的熟练程度,在接口电路的搭接和所要实现的功能上有一个整体的把握。
经过此次设计实验,可以总结出汇编实验的基本方法与步骤,重难点在于算法流程的设计,对我们以后的汇编设计有着指导性的作用。
一十、参考文献
《计算机原理综合实验教程》秦晓梅、陈育斌编著