小型步进电机控制系统设计_第1页
小型步进电机控制系统设计_第2页
小型步进电机控制系统设计_第3页
小型步进电机控制系统设计_第4页
小型步进电机控制系统设计_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录1. 设计课题名称及要求。2. 设计思想和实施方案论述,给出硬件电路原理图并分析。3. 典型程序模块及典型编程技巧分析。4. 课程设计中遇到的问题及解决方法。5. 程序清单和程序注释,相关流程图。6. 收获与体会。7. 参考文献。 小型步进电机控制系统设计一、 设计的题目名称及要求设计题目:小型步进电机控制系统设计。设计要求:(1)、分别用C语言和汇编语言编程完成硬件接口功能设计;(2)、基于80x86微机接口硬件电路设计调试;(3)、控制功能要求:小键盘给定分段速度,数码管显示当前步进电机启动与停止、方向、速度信息;二、实验设备PC机一台(装有TDPIT软件)、唐都AEDK8688ET实

2、验箱。三、设计的思想和实施方案1.步进电机运行方式的控制步进电机的转速与输入脉冲频率成正比,频率越大,转速越高,四相步进电机有双四拍,双八拍,双六拍等方式。实验平台可连接的步进电机为四项八拍电机,电压为DC12V。为了实现对各绕组按一定方式轮流加电,需要一个循环脉冲分配器,这里采用软件实现。将相序表存放于内存区,再设置一个地址指针。当地址依次+1(或-1)时,可从表中取出通电代码,再输出到步进电机,产生一定的运行方式。2.信号的输入与输出8255内部包含3个8位的输入输出端口A、B和C,端口A和端口B都可以用作一个8位的输入口或8位的输出口,端口C既可以作为一个8位的输入口或8位的输出口,又可

3、以作为两个4位的输入输出口(C口上半部分和C口下半部分)使用,还可以配合A口和B口工作,分别用来产生A口和B口的输出控制信号和输入A口和B口的端口状态信号。8255A内部结构图8255 ABC口都工作于方式0,A口低四位接键盘及数码管显示单元的X1X4; B口接数码管的A、B、C、D、E、F、G和DP,以使数码管显示电机的转向和转速;C口低四位接键盘及数码管显示单元的Y1Y4; C口高四位接步进电路的驱动电路,使电机转动起来。8255的A口高四位本次课程设计没有用到。3.步进电机的速度控制:采用软件延时的方法,每发射一个脉冲的间隔中插入数个延时单元。速度共分为9级,对应键盘的9个按键。可以对电

4、机进行方向的改变,并停止电机运行。初始设计时采用了8254作为计数单元,但在实际操作过程中因其过于不稳定,多次出现死机状况,难以调试故改用软件延时的方法。4.键盘及数码管显示单元: 键盘的输入左下角9格作为级数的设置,第四列第四行为停止键,4.3为设置负方向,4.2为设置负方向,初始运行时系统默认正方向。 键盘最上面一行应为没有使用所以在程序中屏蔽。四、硬件电路原理图如上图示:该原理图涉及到系统总线、可编程外围接口芯片8255、键盘及数码管显示单元和步进电机及其驱动电路8255的D0D7 依次接系统总线的XD0XD7,A1和A0依次接系统总线的XA3和XA2;WR和RD 依次接系统总线上的XI

5、OW和XIOR;8255的CS接系统总线的IOY0;8255的A口低四位PA0PA4依次接小键盘的X1X4(列);C口低四位PC0PC3分别接小键盘的Y1Y4(行); C口高四位PC4PC7依次接驱动电路的A、B、C和D;B口PB0PB7分别接数码管的A、B、C、D、E、F、G和DP;A口高四位没用到。五、典型程序模块及典型编程技巧分析 1.主函数主函数主要是完成键盘输入的处理以及综合调用各子函数,以完成对四项八拍步进电机转速和转向的控制,并在PC机及数码管上实时显示电机的转速和转向。本次设计的电机转速分为19个档次。键盘右下角9格对应9档,右侧一列底部键为停止,上面两格分别为正向和负向。当选

6、择负向时,数码管左一会显示“-”,正则为0,左四数码管会显示级数。2.RUNP、RUNN此子函数用来控制不进电机的运行,设了一个大循环每次循环都会发送一个脉冲,延时设计在循环之中。对应的电平发送顺序存放在TTABLE中。RUNP中对其正向读取,RUNN中则对其负向读取,以实现方向的变换。延时部分考虑到数码管的显示问题,数码管显示所需延时远小于不进电机调速所需延时。故以DIS作为延时函数,嵌套与每个大循环中,这样即使CPU在控制电机的运行也能保证数码管有足够的显示亮度。3.CCSCAN此子函数用来扫描小键盘是否有键按下。通过8255的C口高四位,使X1X4(列)全选通,然后由8255的C口低四位

7、判断各列所对应的行是否有键安下,无任何键按下则C口低四位读入的全是“1”,若有键按下则C口低四位读入的对应行是“0”,其余全是“1”,经取反(NOT)后扫描小键盘的子程序CCSCAN的功能变为:若小键盘无键按下则AL寄存器数据为“0”; 若小键盘有键按下则AL寄存器数据为非“0”.4.PUTBUF保存小键盘输入的信息于DS:3000-3004中。5.DIS将CUNSHU子函数中保存下的电机转向和转速值送到数码管上显示。6. CLEAR将00H分别送入A口(驱动LED灯)和B口(驱动数码管)便可实验此功能7.DALLY、DALLY1这是两个延时时间不同的延时子函数,可供别的程序调用以实现较好的显

8、示和操作效果。DALLY主要用于补偿控制转数时DIS函数延时不够。 DALLY1在数码管显示中调用,避免数码管变换太快,导致显示信息的混叠。同时在电机的控制中也作为延时的一部分。 六、课程设计中遇到的问题及解决方法 1.在使用8253时容易死机如前所诉,在实际调制的过程中,单补调试时每次运行到调用8253就会出现死机。具体原因很难说得清楚,有的是同一个程序换台机子运行就会死机,有的是同一台机子同一个程序运行多次就会死机。最后不得不因为时间紧张,放弃使用硬件延时。2.数码管看不到示数或数码管看上去全亮因为不进电机的速度调节主要靠延时的多少来完成,而8086的运行只处于单线程,无法同时运行多个子程

9、序。故在运行时,若转数较慢所需延时时间较长,则数码管显示较暗。因此,如前所述我采用了将DIS显示模块作为延时嵌套如运行控制程序的方法以保证数码管的显示。调用了数码管显示程序而却看不到数码管有示数,这主要是调用数码管显示子函数的频率不够高,可以把数码管显示子函数换个位置,或者是多调用几次就可以解决了。至于数码管好像是全亮,情况正好相反,是数码管显示子函数调用的频率过高,把数码管显示子函数换个位置,或者是在关键位置调用一下延时函数就可以解决了。还有,DIS和CLEAR成对调用可使数码管有个较好的显示效果。七、实验程序的流程图;*根据查看端口资源修改下列符号值* IOY0 EQU 0E000H ;片

10、选IOY0对应的端口始地址;* MY8255_A EQU IOY0+00H*4 ;8255的A口地址 MY8255_B EQU IOY0+01H*4 ;8255的B口地址 MY8255_C EQU IOY0+02H*4 ;8255的C口地址 MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址;* STACK1 SEGMENT STACK DW 256 DUP(?)STACK1 ENDS DATA SEGMENT TTABLE DB 10H,30H,20H,60H,40H,0C0H,80H,90H ;存放脉冲对应码字 DTABLE DB 3FH,06H,5BH,4F

11、H,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,40H ETABLE DB 1FH,2FH,3FH,4FH,5FH,6FH,7FH,8FH,9FH B DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX BUFFER: MOV SI,3000H ;建立缓冲区,存放要显示的键值 MOV AL,00H ;初始将存储区都设为0 MOV SI,AL ;第一个存储区用来存放正负方向 MOV SI+1,AL MOV SI+2,AL MOV SI+3

12、,AL MOV SI+4,AL ;存放所需速度 MAIN: MOV DX,MY8255_MODE ;定义8255工作方式 MOV AL,81H ;工作方式0,A口和B口为输出 OUT DX,AL BEGIN: CALL DIS ;显示刷新 CALL CLEAR ;清屏 CALL CCSCAN ;扫描按键 JNZ GETKEY1 ;有键按下则跳置GETKEY1 MOV AH,1 ;判断PC键盘是否有按键按下 INT 16H JZ BEGIN ;无按键则跳回继续循环,有则退出 MOV AX,4C00H ;结束程序退出 INT 21H GETKEY1: CALL DIS ;显示刷新 CALL DAL

13、LY1 CALL DALLY1 CALL CLEAR ;清屏 CALL CCSCAN ;再次扫描按键 JNZ GETKEY2 ;有键按下则跳置GETKEY2 JMP BEGIN ;否则跳回开始继续循环 GETKEY2: MOV CH,0FEH MOV CL,00H ;设置当前检测的是第几列 COLUM: MOV AL,CH ;选取一列,将X1X4中一个置0 MOV DX,MY8255_A OUT DX,AL MOV DX,MY8255_C ;读Y1Y4,用于判断是哪一行按键闭合 IN AL,DX L2: TEST AL,02H ;是否为第2行 JNZ L3 ;不是则继续判断 MOV AL,07

14、H ;设置第2行第1列的对应的键值 JMP KCODE L3: TEST AL,04H ;是否为第3行 JNZ L4 ;不是则继续判断 MOV AL,04H ;设置第3行第1列的对应的键值 JMP KCODE L4: TEST AL,08H ;是否为第4行 JNZ NEXT ;不是则继续判断 MOV AL,01H ;设置第4行第1列的对应的键值 KCODE: CMP CL,03H ;如果是第四列的就转到控制操作部分 JZ CONTROL JMP INSTALL CONTROL: CMP AL,01H ;先比较是否是0键,不是在进行方向控制 JZ ZERO JMP DIRECTION ZERO:

15、 MOV AL,00H MOV DI,3004H CALL PUTBUF JMP LALA DIRECTION: CMP AL,04H ;判断是否为负向 JZ NAGTIVE MOV AL,00H MOV DI,3003H CALL PUTBUF JMP LALA NAGTIVE: MOV AL,10H MOV DI,3003H CALL PUTBUF JMP LALA INSTALL: ADD AL,CL ;将第1列的值加上当前列数,确定按键值 MOV DI,3004H CALL PUTBUF ;保存按键值 JMP LALA NEXT: INC CL ;当前检测的列数递增 MOV AL,CH

16、 TEST AL,08H ;检测是否扫描到第4列 JZ MODE ;是则跳回到开始处 ROL AL,1 ;没检测到第4列则准备检测下一列 MOV CH,AL JMP COLUM LALA: PUSH AX KON: CALL DIS ;显示刷新 CALL CLEAR ;清屏 CALL CCSCAN ;扫描按键,判断按键是否弹起 JNZ KON ;未弹起则继续循环等待弹起 POP AX MODE: MOV SI,3004H ;判断是否停止 MOV AL,SI CMP AL,00H JZ INTERMEDIUM ;是,则跳转至存储子程序 JMP RUN ;否,则继续 INTERMEDIUM: JM

17、P BUFFER RUN: MOV SI,3003H MOV AL,SI CMP AL,00H JZ FORWARD JMP BACKWARD FORWARD: CALL RUNP JMP GETKEY2 BACKWARD: CALL RUNN JMP GETKEY2;*RUN FORWARD* RUNP PROC NEAR ;正向控制 A1P: MOV B,SP MOV BX,OFFSET TTABLE MOV CX,0008H ;因为8拍设置8个循环 A2P: MOV AL,BX MOV DX,MY8255_C OUT DX,AL MOV SI,3004H MOV DI,SI AND DI

18、,00FFH PUSH BX CASTE: PUSH DI CALL DIS CALL DALLY CALL CLEAR CALL CCSCAN JNZ EXIT POP DI CMP DI,0 JZ NDEC DEC DI CMP DI,0 JNZ CASTE NDEC: POP BX INC BX LOOP A2P MOV AH,1 ;判断是否有按键按下 INT 16H JZ A1P ;无按键则跳回继续循环,有则退出 MOV AX,4C00H ;结束程序退出 INT 21H EXIT: MOV SP,B RET RUNP ENDP;*RUN BACKWARD* RUNN PROC NEAR

19、 ;负向控制 A1N: MOV B,SP MOV BX,OFFSET TTABLE ADD BX,07H ;电机控制字符从最后一位开始取,以实现反向旋转 MOV CX,0008H A2N: MOV AL,BX MOV DX,MY8255_C OUT DX,AL MOV SI,3004H MOV DI,SI AND DI,00FFH PUSH BX CASTE1: PUSH DI CALL DIS CALL DALLY CALL CLEAR CALL CCSCAN JNZ EXIT POP DI CMP DI,0 JZ NDEC DEC DI CMP DI,0 JNZ CASTE NNDEC:

20、POP BX DEC BX LOOP A2N MOV AH,1 ;判断是否有按键按下 INT 16H JZ A1N ;无按键则跳回继续循环,有则退出 MOV AX,4C00H ;结束程序退出 INT 21H EXITN: MOV SP,B RET RUNN ENDP;* CCSCAN PROC NEAR ;扫描是否有按键闭合子程序 MOV AL,00H MOV DX,MY8255_A ;将4列全选通,X1X4置0 OUT DX,AL MOV DX,MY8255_C IN AL,DX ;读Y1Y4 NOT AL AND AL,0EH ;取出Y1Y4的反值 RET CCSCAN ENDP;* CL

21、EAR PROC NEAR ;清除数码管显示子程序 MOV DX,MY8255_B ;段位置0即可清除数码管显示 MOV AL,00H OUT DX,AL RET CLEAR ENDP;*DISPLAY* DIS PROC NEAR PUSH CX PUSH AX ;以缓冲区存放的键值为键值表偏移找到键值并显示 MOV SI,3000H MOV DL,0F7H MOV AL,DL AGAIN: PUSH DX MOV DX,MY8255_A OUT DX,AL ;设置X1X4,选通一个数码管 MOV AL,SI ;取出缓冲区中存放键值 MOV BX,OFFSET DTABLE AND AX,0

22、0FFH ADD BX,AX MOV AL,BX ;将键值作为偏移和键值基地址相加得到相应的键值 MOV DX,MY8255_B OUT DX,AL ;写入数码管ADp CALL DALLY1 INC SI ;取下一个键值 POP DX MOV AL,DL TEST AL,01H ;判断是否显示完? JZ OUT1 ;显示完,返回 ROR AL,1 MOV DL,AL JMP AGAIN ;未显示完,跳回继续 OUT1: POP AX POP CX RET DIS ENDP;*SAVE INPUT INFORMATION* PUTBUF PROC NEAR ;保存键值子程序 MOV SI,30

23、05H MOV AH,01H MOV SI,AH MOV SI,DI MOV SI,AL MOV SI,3004H MOV AH,SI MOV AL,AH AND AH,0F0H AND AL,0FH MOV SI-3,AH MOV SI-4,AL RET PUTBUF ENDP;*HARDWARE DELAY*;*SOFTWARE DELAY* DALLY PROC NEAR ;软件延时子程序 PUSH CX PUSH AX MOV CX,000FH D1: MOV AX,000FH D2: DEC AX JNZ D2 LOOP D1 POP AX POP CX RET DALLY ENDP DALLY1 PROC NEAR ;软件延时子程序 PUSH CX MOV CX,0FFFH D3: MOV AX,00AFH D4: DEC AX JNZ D4 LOOP D3 POP CX RET DALLY1 ENDP CODE ENDS END ST

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论