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

下载本文档

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

文档简介

目录1. 设计课题名称及要求。2. 设计思想和实施方案论述,给出硬件电路原理图并分析。3. 典型程序模块及典型编程技巧分析。4. 课程设计中遇到的问题及解决方法。5. 程序清单和程序注释,相关流程图。6. 收获与体会。7. 参考文献。小型步进电机控制系统设计一、 设计的题目名称及要求设计题目:小型步进电机控制系统设计。设计要求:(1) 、分别用 C 语言和汇编语言编程完成硬件接口功能设计;(2) 、基于 80x86 微机接口硬件电路设计调试;(3) 、控制功能要求:小键盘给定分段速度,数码管显示当前步进电机启动与停止、方向、速度信息;二、实验设备PC 机一台(装有 TDPIT 软件) 、唐都 AEDK8688ET 实验箱。三、设计的思想和实施方案1.步进电机运行方式的控制步进电机的转速与输入脉冲频率成正比,频率越大,转速越高,四相步进电机有双四拍,双八拍,双六拍等方式。实验平台可连接的步进电机为四项八拍电机,电压为 DC12V。为了实现对各绕组按一定方式轮流加电,需要一个循环脉冲分配器,这里采用软件实现。将相序表存放于内存区,再设置一个地址指针。当地址依次+1(或-1)时,可从表中取出通电代码,再输出到步进电机,产生一定的运行方式。2.信号的输入与输出8255 内部包含 3 个 8 位的输入输出端口 A、B 和 C,端口 A 和端口 B 都可以用作一个 8 位的输入口或 8 位的输出口,端口 C 既可以作为一个 8 位的 输入口或 8 位的输出口,又可以作为两个 4 位的输入输出口( C 口上半部分和 C口下半部分)使用,还可以配合 A 口和 B 口工作,分别用来产生 A 口和 B 口的输出控制信号和输入 A 口和 B 口的端口状态信号。8255 ABC 口都工作于方式 0,A 口低四位接键盘及数码管显示单元的X1X4; B 口接数码管的 A、B、C、D、E、F 、G 和 DP,以使数码管显示电机的转向和转速;C 口低四位接键盘及数码管显示单元的 Y1Y4; C 口高四位接步8255A 内部结构图进电路的驱动电路,使电机转动起来。8255 的 A 口高四位本次课程设计没有用到。3.步进电机的速度控制:采用软件延时的方法,每发射一个脉冲的间隔中插入数个延时单元。速度共分为 9 级,对应键盘的 9 个按键。可以对电机进行方向的改变,并停止电机运行。初始设计时采用了 8254 作为计数单元,但在实际操作过程中因其过于不稳定,多次出现死机状况,难以调试故改用软件延时的方法。4.键盘及数码管显示单元:键盘的输入左下角 9 格作为级数的设置,第四列第四行为停止键,4.3 为设置负方向,4.2 为设置负方向,初始运行时系统默认正方向。键盘最上面一行应为没有使用所以在程序中屏蔽。四、硬件电路原理图如上图示:该原理图涉及到系统总线、可编程外围接口芯片 8255、键盘及数码管显示单元和步进电机及其驱动电路8255 的 D0D7 依次接系统总线的 XD0XD7,A1 和 A0 依次接系统总线的 XA3 和 XA2;WR 和 RD 依次接系统总线上的 XIOW 和 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 档,右侧一列底部键为停止,上面两格分别为正向和负向。当选择负向时,数码管左一会显示“-” ,正则为 0,左四数码管会显示级数。2.RUNP、RUNN此子函数用来控制不进电机的运行,设了一个大循环每次循环都会发送一个脉冲,延时设计在循环之中。对应的电平发送顺序存放在 TTABLE 中。RUNP中对其正向读取,RUNN 中则对其负向读取,以实现方向的变换。延时部分考虑到数码管的显示问题,数码管显示所需延时远小于不进电机调速所需延时。故以 DIS 作为延时函数,嵌套与每个大循环中,这样即使 CPU在控制电机的运行也能保证数码管有足够的显示亮度。3.CCSCAN此子函数用来扫描小键盘是否有键按下。通过 8255 的 C 口高四位,使X1X4(列) 全选通,然后由 8255 的 C 口低四位判断各列所对应的行是否有键安下,无任何键按下则 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这是两个延时时间不同的延时子函数,可供别的程序调用以实现较好的显示和操作效果。DALLY 主要用于补偿控制转数时 DIS 函数延时不够。 DALLY1 在数码管显示中调用,避免数码管变换太快,导致显示信息的混叠。同时在电机的控制中也作为延时的一部分。 六、课程设计中遇到的问题及解决方法1.在使用 8253 时容易死机如前所诉,在实际调制的过程中,单补调试时每次运行到调用 8253 就会出现死机。具体原因很难说得清楚,有的是同一个程序换台机子运行就会死机,有的是同一台机子同一个程序运行多次就会死机。最后不得不因为时间紧张,放弃使用硬件延时。2.数码管看不到示数或数码管看上去全亮因为不进电机的速度调节主要靠延时的多少来完成,而 8086 的运行只处于单线程,无法同时运行多个子程序。故在运行时,若转数较慢所需延时时间较长,则数码管显示较暗。因此,如前所述我采用了将 DIS 显示模块作为延时嵌套如运行控制程序的方法以保证数码管的显示。调用了数码管显示程序而却看不到数码管有示数,这主要是调用数码管显示子函数的频率不够高,可以把数码管显示子函数换个位置,或者是多调用几次就可以解决了。至于数码管好像是全亮,情况正好相反,是数码管显示子函数调用的频率过高,把数码管显示子函数换个位置,或者是在关键位置调用一下延时函数就可以解决了。还有,DIS 和 CLEAR 成对调用可使数码管有个较好的显示效果。七、实验程序的流程图开始初始化 8 2 5 5 、 按键信息存储区小键盘有键按下 ?显示刷新否是控制键 ?是是否为停止 ?是按给定方向和级数运行是否有新的按键按下 ?是否判断 、 计算并存储所要求级数;*根据查看端口资源修改下列符号值 *IOY0 EQU 0E000H ;片选 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 STACKDW 256 DUP(?)STACK1 ENDSDATA SEGMENTTTABLE DB 10H,30H,20H,60H,40H,0C0H,80H,90H ;存放脉冲对应码字DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,40HETABLE DB 1FH,2FH,3FH,4FH,5FH,6FH,7FH,8FH,9FHB DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXBUFFER: MOV SI,3000H ;建立缓冲区,存放要显示的键值MOV AL,00H ;初始将存储区都设为 0MOV SI,AL ;第一个存储区用来存放正负方向MOV SI+1,ALMOV SI+2,ALMOV SI+3,ALMOV SI+4,AL ;存放所需速度MAIN: MOV DX,MY8255_MODE ;定义 8255 工作方式MOV AL,81H ;工作方式 0,A 口和 B 口为输出OUT DX,ALBEGIN: CALL DIS ;显示刷新CALL CLEAR ;清屏CALL CCSCAN ;扫描按键JNZ GETKEY1 ;有键按下则跳置 GETKEY1MOV AH,1 ;判断 PC 键盘是否有按键按下INT 16HJZ BEGIN ;无按键则跳回继续循环,有则退出MOV AX,4C00H ;结束程序退出INT 21HGETKEY1: CALL DIS ;显示刷新CALL DALLY1CALL DALLY1CALL CLEAR ;清屏CALL CCSCAN ;再次扫描按键JNZ GETKEY2 ;有键按下则跳置 GETKEY2JMP BEGIN ;否则跳回开始继续循环GETKEY2: MOV CH,0FEHMOV CL,00H ;设置当前检测的是第几列COLUM: MOV AL,CH ;选取一列,将 X1X4 中一个置 0MOV DX,MY8255_AOUT DX,ALMOV DX,MY8255_C ;读 Y1Y4,用于判断是哪一行按键闭合IN AL,DXL2: TEST AL,02H ;是否为第 2 行JNZ L3 ;不是则继续判断MOV AL,07H ;设置第 2 行第 1 列的对应的键值JMP KCODEL3: TEST AL,04H ;是否为第 3 行JNZ L4 ;不是则继续判断MOV AL,04H ;设置第 3 行第 1 列的对应的键值JMP KCODEL4: TEST AL,08H ;是否为第 4 行JNZ NEXT ;不是则继续判断MOV AL,01H ;设置第 4 行第 1 列的对应的键值KCODE: CMP CL,03H ;如果是第四列的就转到控制操作部分JZ CONTROLJMP INSTALLCONTROL: CMP AL,01H ;先比较是否是 0 键,不是在进行方向控制JZ ZEROJMP DIRECTIONZERO: MOV AL,00HMOV DI,3004HCALL PUTBUFJMP LALADIRECTION: CMP AL,04H ;判断是否为负向JZ NAGTIVEMOV AL,00HMOV DI,3003HCALL PUTBUFJMP LALANAGTIVE: MOV AL,10H MOV DI,3003HCALL PUTBUFJMP LALAINSTALL: ADD AL,CL ;将第 1 列的值加上当前列数,确定按键值MOV DI,3004HCALL PUTBUF ;保存按键值JMP LALANEXT: INC CL ;当前检测的列数递增MOV AL,CHTEST AL,08H ;检测是否扫描到第 4 列JZ MODE ;是则跳回到开始处ROL AL,1 ;没检测到第 4 列则准备检测下一列MOV CH,ALJMP COLUMLALA: PUSH AXKON: CALL DIS ;显示刷新CALL CLEAR ;清屏CALL CCSCAN ;扫描按键,判断按键是否弹起JNZ KON ;未弹起则继续循环等待弹起POP AXMODE: MOV SI,3004H ;判断是否停止MOV AL,SICMP AL,00HJZ INTERMEDIUM ;是,则跳转至存储子程序JMP RUN ;否,则继续INTERMEDIUM: JMP BUFFERRUN: MOV SI,3003HMOV AL,SICMP AL,00HJZ FORWARDJMP BACKWARDFORWARD: CALL RUNPJMP GETKEY2BACKWARD: CALL RUNNJMP GETKEY2;*RUN FORWARD*RUNP PROC NEAR ;正向控制A1P: MOV B,SPMOV BX,OFFSET TTABLE MOV CX,0008H ;因为 8 拍设置 8 个循环A2P: MOV AL,BXMOV DX,MY8255_COUT DX,ALMOV SI,3004HMOV DI,SIAND DI,00FFHPUSH BXCASTE:PUSH DICALL DISCALL DALLYCALL CLEARCALL CCSCANJNZ EXITPOP DICMP DI,0JZ NDECDEC DICMP DI,0JNZ CASTENDEC:POP BXINC BXLOOP A2PMOV AH,1 ;判断是否有按键按下INT 16HJZ A1P ;无按键则跳回继续循环,有则退出MOV AX,4C00H ;结束程序退出INT 21HEXIT: MOV SP,BRETRUNP ENDP;*RUN BACKWARD* RUNN PROC NEAR ;负向控制A1N: MOV B,SPMOV BX,OFFSET TTABLEADD BX,07H ;电机控制字符从最后一位开始取,以实现反向旋转MOV CX,0008HA2N: MOV AL,BXMOV DX,MY8255_COUT DX,ALMOV SI,3004HMOV DI,SIAND DI,00FFHPUSH BXCASTE1:PUSH DICALL DISCALL DALLYCALL CLEARCALL CCSCANJNZ EXITPOP DICMP DI,0JZ NDECDEC DICMP DI,0JNZ CASTENNDEC: POP BXDEC BXLOOP A2NMOV AH,1 ;判断是否有按键按下INT 16HJZ A1N ;无按键则跳回继续循环,有则退出MOV AX,4C00H ;结束程序退出INT 21HEXITN: MOV SP,BRETRUNN ENDP;*CCSCAN PROC NEAR ;扫描是否有按键闭合子程序MOV AL,00HMOV DX,MY8255_A ;将 4 列全选通,X1X4 置 0OUT DX,ALMOV DX,MY8255_CIN AL,DX ;读 Y1Y4NOT ALAND AL,0EH ;取出 Y1Y4 的反值RETCCSCAN ENDP;*CLEAR PROC NEAR ;清除数码管显示子程序MOV DX,MY8255_B ;段位置 0 即可清除数码管显示MOV AL,00HOUT DX,ALRETCLEAR ENDP;*DISPLAY*DIS PROC NEARPUSH CXPUSH AX ;以缓冲区存放的键值为键值表偏移找到键值并显示MOV SI,3000HMOV DL,0F7HMOV AL,DLAGAIN: PUSH DXMOV DX,MY8255_AOUT DX,AL ;设置 X1X4,选通一个数码管MOV AL,SI ;取出缓冲区中存放键值MOV BX,OFFSET DTABLEAND AX,00FFHADD BX,AXMOV AL,BX ;将键值作为偏移和键值基地址相加得到相应的键值MOV DX,MY8255_BOUT DX,AL ;写入数码管 ADpCALL DALLY1INC SI ;取下一个键值POP DXMOV AL,DLTEST AL,01H ;判断是否显示完?JZ OUT1 ;显示完,返回ROR AL,1MOV DL,ALJMP AGAIN ;未显示完,跳回继续OUT1: POP AXPOP CXRETDIS ENDP;*SAVE INPUT INFORMATION*PUTBUF PROC NEAR ;保存键值子程序MOV SI,3005HMOV AH,01HMOV SI,AHMOV SI,DIMOV SI,ALMOV SI,3004HMOV AH,SIMOV AL,AHAND AH,0F0HAND AL,0FHMOV SI-3,AHMOV SI-4,ALRETPUTBUF ENDP;*HARDWARE DELAY*;*SOFTWARE DELAY*DALLY PROC NEAR ;软件延时子程序PUSH CXPUSH AXMOV CX,000FHD1: MOV AX,000FHD2: DEC AXJNZ D2LOOP D1POP AXPOP CXRETDALLY ENDPDALLY1 PROC NEAR ;软件延时子程序PUSH CXMOV CX,0FFFHD3: MOV AX,00AFHD4: DEC AXJNZ D4LOOP D3POP CXRETDALLY1 ENDPCODE ENDSEND

温馨提示

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

评论

0/150

提交评论