微机课程设计——电机的控制 课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机课程设计——电机的控制
一、项目设计内容与要求
1.设计内容
利用电机平台上的步进电机和直流电机,实现步进电机的转角控制和直流电机速度的控制。
2.设计要求
(1)步进电机的转角控制可以通过调整电机的转过的步数来实现。
一次转过的步数和方向可用按键设定。
还可以用按键控制步进电机一步一步的转动,要分正反转。
转过的步数要显示在发光二极管上。
(2)直流电机的转速是根据用数模转换电路的输入数据变化,要求用发光二极管显示转速数据值。
(3)可以用按键或开关输入相应的转速控制数据。
二、电路连接图
三、各模块的设计
1.键盘模块
本程序的键盘功能的设计采用扫描法实现,各个键的键值由扫描法得到。
各个键的键值如下表所示:
程序流程图:
2.直流电机的转速控制模块
设计思路:
直流电机的转速是根据用数模转换电路的输入数据变化,可以把键盘按下的数字键的键值送入数模转换电路(DAC0832的208H),按下不同的按键就实现转速的控制。
要求用发光二极管显示转速数据值,可以直接把按键的键值送B口显示,本程序把旧键值左移四位送CH,新键值BH加上CH存BH并送发光二极管显示,再送数字进208口处理.
此模块实现的功能也即数字键要处理的功能,作为键盘模块的子程序使用。
程序流程图:
3. 步进电机控制模块
设计思路:本设计采用的是四相步进电机,步进电机用直流+12V电压,每项电流为0.20A,电机线圈由A、B、C、D四相组成。
驱动方式为四相单四拍方式,按A→B→C→D→A次序通电为正转;按A→D→C →B→A次序通电为反转。
正向单步转可用一个寄存器来标志给哪相通电,如CL=0,A通电;CL=1,B通电;CL=2,C通电;CL=3,D通电。
反转单步走则类似。
这个模块作为键盘主程序的子程序使用,使用键盘的第三行为功能键,操作步进电机的正反转,数字键送入NUM的值则控制电机的步数。
功能键说明:
“+”控制步进电机正向转NUM步
“-“控制步进电机反向转NUM步
“,”控制步进电机正向单步走
“.”控制步进电机反向单步走
正向走NUM步的程序流程图:(反向走NUM步的省略)
正向单步走程序流程图:(反向单步的省略)
四、源程序代码:
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
START: MOV CH,00h ;键值左移4位存CH用,先初始化MOV CL,00h ;控制步进电机单步走用作标志
MOV DX,203H ;置8255A控制口地址
MOV AL,90H ;A口输入,C口输出
OUT DX,AL
LOOP1: MOV DX,202H ;8255A的C口
MOV AH,00000110B
MOV AL,00000110B ;键盘第一行
OUT DX,AL
MOV DX,200h ;8255A的A口
IN AL,DX ;获取列码
CMP AL,0FFH
JNE LOOP2 ;有键按下
MOV DX,202H ;列码全1无键按下扫描第二行
MOV AH,00000101B
MOV AL,00000101B
OUT DX,AL
MOV DX,200h
IN AL,DX
CMP AL,0FFH
JNE LOOP2
MOV DX,202H ;第三行
MOV AH,00000011B
MOV AL,00000011B
OUT DX,AL
MOV DX,200h
IN AL,DX
CMP AL,0FFH
JNE LOOP2
JMP LOOP1
LOOP2: CALL Delay ;消除抖动
IN AL,DX
CMP AL,0FFH
JE LOOP1
MOV BL,0FEH ;确定有键按下则求列值
MOV BH,0 ;BH存键值
LOOP3: CMP AL,BL ;扫描列值
JE ONE
CMP BH,7 ;所有列码都扫描完
JE LOOP1 ;重新检测按键
INC BH
ROL BL,1 ;列码循环左移一位
JMP LOOP3
ONE:
CMP AH,00000110B ;第一行按键
JE ONE2
CMP AH,00000101B ;第二行按键
JE TWO2
CMP AH,00000011B ;第三行功能键
JE THREE2
CALL JUMP
JMP wait1
ONE2:
CALL First ;调用第一行处理程序
JMP wait1
TWO2: CALL Second ;调用第二行处理程序JMP wait1
THREE2:CALL Third ;调用第三行处理程序wait1: MOV DX,200h
wait2: IN AL,DX
CMP AL,0FFh
JNE wait2 ;等待按键
JMP LOOP1
ORG 200H
NUM DB ? ;存步进电机步数
First PROC NEAR
MOV DX,203H ; 开控制口
MOV AL,90h ;A口输入,C口输出
OUT DX,AL
CMP CH,0 ;第一次执行按键
JZ CH0 ;
ADD BH,CH ;显示八位,
CH0: MOV DX,201H ;B口
MOV AL,BH ;键值送AL
OUT DX,AL ;在二极管上显示BH即输入的键值
MOV DX,208H ;打开D/A
OUT DX,AL ;控制直流电机转速
MOV NUM,AL ;步进电机转的步数
MOV CL,4
SAL BH,CL; BH值左移四位
MOV CH,BH ;BH值送CH
MOV CL,0 ;CL清零,不影响步进电机单步走
RET
First ENDP
Second PROC NEAR
ADD BH,8h ;扫描第二行
MOV DX,203H
MOV AL,90h
OUT DX,AL
CMP CH,0 ;
JZ CH1
ADD BH,CH
CH1: MOV DX,201H ;8255A的B口输出MOV AL,BH
OUT DX,AL ;输出键盘的值
MOV DX,208H
OUT DX,AL
MOV NUM,AL ;步进电机步数
MOV CL,4
SAL BH,CL ;左移4位
MOV CH,BH
MOV CL,0
RET
Second ENDP
Third PROC NEAR
ADD BH,10H ;扫描第三行
MOV DX,203H ;设置方式控制字
MOV AL,90H
OUT DX,AL
MOV DX,201H ;二极管显示为全0;B口
MOV AL,00h ;
OUT DX,AL
CMP BH,13H ;比较键值13H为”+”
JZ DONE2
;正转
CMP BH,12H ;12H为”-”
JZ DONE3
;反转
CMP BH,11H ;11H为”,”
JZ DONE4
;正向一步一步转
CMP BH,10H ;10H 为”.”
JZ DONE5 ;反向一步一步转
RET
Third ENDP
DONE2: CALL PROGRAM1
DONE3:CALL PROGRAM2
DONE4:CALL PROGRAM3
DONE5:CALL PROGRAM4
Delay PROC NEAR ; 键盘延时子程序PUSH CX
MOV CX,1800H
NEXT: DEC CX
JNE NEXT
POP CX
RET
Delay ENDP
Delay2 PROC NEAR ;电机延时子程序PUSH CX
MOV CX,5000H
NEXT2: DEC CX
JNE NEXT2
POP CX
RET
Delay2 ENDP
JUMP PROC NEAR
RET
JUMP ENDP
PROGRAM1 PROC NEAR ;正向连续转PUSH CX
MOV DX,203H
MOV AL,90H
OUT DX,AL
MOV DX,202H; C口
MOV CL,NUM ;电机步数
ZHENG: MOV AL,10H ;正向
OUT DX,AL ;给A相通电
CALL Delay2
DEC CL ;计算已进步数
JZ DONE1 ;步数已完成,返回
MOV AL,20H ;输出第二拍模型
OUT DX,AL ;给B相通电
CALL Delay2 ;延迟;
DEC CL
JZ DONE1
MOV AL,40H ;输出第三拍模型
OUT DX,AL ;给C相通电
CALL Delay2
DEC CL
JZ DONE1
MOV AL,80H ;输出第四拍
OUT DX,AL ;给D相通电
CALL Delay2
DEC CL
JZ DONE1
MOV AL,10H ;回到原点
OUT DX,AL
CALL Delay2
DEC CL
JNZ ZHENG ;ABCDA循环通电JMP LOOP1
POP CX
RET
PROGRAM1 ENDP
DONE1:JMP LOOP1
PROGRAM2 PROC NEAR ;反向连续转
PUSH CX
MOV DX,203H
MOV AL,90H
OUT DX,AL
MOV DX,202H ;C口
MOV CL,NUM ;设置转的步数
FAN: MOV AL,10H ;反向转动
OUT DX,AL ;给A通电
CALL Delay2
DEC CL
JZ DONE1
MOV AL,80H ;给D通电OUT DX,AL
CALL Delay2
DEC CL
JZ DONE1
MOV AL,40H ;给C通电OUT DX,AL
CALL Delay2
DEC CL
JZ DONE1
MOV AL,20H ;给B通电OUT DX,AL
CALL Delay2
DEC CL
JZ DONE1
MOV AL,10H ;给A通电OUT DX,AL
CALL Delay2
DEC CL
JNZ FAN ;ADCBA通电JMP LOOP1
POP CX
RET
PROGRAM2 ENDP
PROGRAM3 PROC NEAR ;正向单步走
MOV DX,203H
MOV AL,90H
OUT DX,AL
MOV DX,202H ;C口
CMP CL,00H ;第一次按,给A通电转一步
JZ AA1;
CMP CL,01H ;CL=1,B通电
JZ BB1
CMP CL,02H ;CL=2,C通电
JZ CC1
CMP CL,03H ;CL=3,D通电
JZ DD1
JMP LOOP1 ;检测键盘
AA1: MOV AL,10H
OUT DX,AL
CALL Delay2
INC CL ;自动加一,CL为01H
JNZ DONE
BB1: MOV AL,20H
OUT DX,AL
CALL Delay2
INC CL
JNZ DONE
CC1: MOV AL,40H
OUT DX,AL
CALL Delay2
INC CL
JNZ DONE
DD1: MOV AL,80H
OUT DX,AL
CALL Delay2
MOV CL,00H
;JZ DONE
JMP LOOP1 PROGRAM3 ENDP
PROGRAM4 PROC NEAR ;反向单步走MOV DX,203H
MOV AL,90H
OUT DX,AL
MOV DX,202H
;MOV CL,0
CMP CL,00H ;CL=0,A通电
JZ AA2
CMP CL,01H ;CL=1,D通电
JZ DD2
CMP CL,02H ;CL=2,C 通电
JZ CC2
CMP CL,03H ;CL=3,B 通电
JZ BB2
JMP LOOP1 ;检测键盘
AA2: MOV AL,10H
OUT DX,AL
CALL Delay2
INC CL
JNZ DONE
DD2: MOV AL,80H
OUT DX,AL
CALL Delay2
INC CL
JNZ DONE
CC2: MOV AL,40H
OUT DX,AL
CALL Delay2
INC CL
JNZ DONE
BB2: MOV AL,20H
OUT DX,AL
CALL Delay2
MOV CL,00H ;CL重新置0
;JZ DONE
JMP LOOP1
PROGRAM4 ENDP
DONE: JMP LOOP1 ;扫描键盘
CODE ENDS
END START
五、设计的问题及难点
刚开始在实现键盘扫描功能时遇到比较多的问题,如怎么根据行码和列码来判断到底是哪个键被按下,以及键值该如何处理,数字键和功能键又怎么区分等等,在询问同学和老师的过程中了解到了实现的一些方法。
在实现直流电机控制速度的时候也遇到了不少问题,起先连怎么把数据送入DAC0832转换处理都不知道,后来到图书馆查阅点资料才理解了。
在这里把旧键值送高4位,新键值送低4位花了不少时间,后面实现了才发现这有点容易了。
实现步进电机单步走的时候不知如何控制什么时候给哪相通电,后面想到用一个寄存器才标志该给哪个相通电,实现了单步走的功能。
设计的不足:
控制直流电机的时候,按下数字键,速度不应该马上变化,可以设置一个功能键,实现先按下数字键先显示在B口,不直接送入DAC0832,等检测到按下那个功能键后才送进去,改变电机速度。
本文来自CSDN博客,转载请标明出处:/xinghui100/archive/2008/06/11/2537101.aspx。