步进电机控制及其汇编程序
- 格式:doc
- 大小:221.50 KB
- 文档页数:5
51单片机步进电机控制汇编语言程序;本程序是通过秒信号触发中断来实现的,要求中断程序必须在1S内执行完毕;步进电机转速控制是通过8255输入信号在每次执行中断程序内调整控制信号的循环次数来实现的CODE SEGMENTASSUME CS:CODESTART: PUSH CSPOP DS;数据段和代码段共用一个地址JMP MAINNUM DB 08H,04H,02H,01H; 定义循环控制信号DAT1 DB 0H ;定义循环参量DAT2 DB 0H;---------初始化8253计数器-----------MAIN:MOV DX,203H;计数器0初始化,工作在方式3 MOV AL,36HOUT DX,ALMOV DX,200H;给计数器0赋计数初值960H(2400)MOV AL,60H ;低8位OUT DX,ALMOV AL,09H ;高8位OUT DX,ALMOV DX,203H;计数器1初始化,工作在方式3 MOV AL,76HOUT DX,ALMOV DX,201H;给计数器1赋计数处值80H(128) MOV AL,80H ;低8位OUT DX,ALMOV AL,00H ;高8位OUT DX,AL;-----------初始化8255--------------- MOV DX,021BH;A口输入,B口输出MOV AL,90HOUT DX,AL;-----------初始化向量表8号中断-------- MOV AX,0;ES:DIMOV ES,AXMOV DI,20H;4*8=32MOV AX,OFFSET INTP;装载中断函数的偏移地址MOV ES:[DI],AXMOV AX,8100H;MOV ES:[DI+2],AX;-------------初始化8259A--------------MOV DX,210H;ICW1初始化MOV AL,13H;上升沿触发,单片,要ICW4OUT DX,ALMOV DX,211H;ICW2初始化MOV AL,08H;初始化中断类型码范围,08-0F对应INT0-INT7OUT DX,ALMOV DX,211H;ICW4初始化MOV AL,01H;OUT DX,AL;--------------打开中断-------------- MOV DX,211H;打开8259A八号中断IN AL,DXAND AL,0FEH;1111 1110OUT DX,ALSTI;开CPU中断,IF=1MOV BX,OFFSET NUM;取控制信号的偏移地址MOV SI,0 ;将SI循环归零LOP: MOV AX,0JMP LOP;死循环,等待中断到来;------------中断程序开始----------INTP PROC FAR;LTP:MOV DX,219HMOV AL,[BX+SI]OUT DX,ALINC SICMP SI,04HJNZ NEXTMOV SI,0NEXT: MOV CX,03FFFH ;简短延时LOOP $CALL REFRESH;调用按键扫描子程序DEC DAT1 ;循环次数减一JNZ LTP ;循环次数减为零时跳出循环MOV AL,DAT2;重新填装DAT1的值MOV DAT1,ALMOV DX,210H;中断结束命令MOV AL,20HOUT DX,ALIRET;中断返回INTP ENDP;-------按键扫描程序---------- REFRESH PROC FARMOV DX,218HIN AL,DXCMP AL,00HJNZ NEXT1 ;若输入信号为00,则循环参量置为1 MOV DAT2,01HNEXT1: CMP AL,01HJNZ NEXT2 ;若输入信号为01,则循环参量置为2 MOV DAT2,02HNEXT2: CMP AL,03HJNZ NEXT3 ;若输入信号为11,则循环参量置为3 MOV DAT2,03HNEXT3: CMP AL,07HJNZ NEXT4 ;若输入信号为111,则循环参量置为4 MOV DAT2,04HNEXT4 MOV DAT1,0HRETREFRESH ENDP;-------按键扫描结束----------CODE ENDSEND START。
附件:ORG 0000HLJMP MAINORG 0003HLJMP Speed_UpORG 0013HLJMP Speed_DownORG 0100HMAIN:;打开外部中断IT0/IT1SETB EASETB EX0SETB EX1SETB IT0SETB IT1;扫描键盘,无键按下显示0,并继续扫描MAKEY:MOV DPTR,#TABMOV A,#0MOVC A,@A+DPTRMOV P0,AMOV P3,#0FFHMOV A,P3CPL AJZ MAKEYLCALL D10MSJZ MAKEY;当有键按下时,启动步行电机转动Speed EQU 20HNum EQU 21HMOV Speed,#60 ;Speed初始化,Speed控制延时的时间,即脉冲的频率MOV Num,#1 ;Num初始化,Num存放数码管显示的转速数值JNB ACC.4,TO_TWO ;默认设置为正向转动,转速为1,当有反向键按下,按反向转动;------------------------ 1号程序:控制步行电机正转--------------------------------TO_ONE:MOV R7,#4MOV A,#01HMOV P3,#0FFHLP1:MOV P1,ALCALL DELAYLCALL DISPLAYRL A ; 正向输入脉冲信号DJNZ R7,LP1JNB P3.4,TO_TWO ; 有反向键按下,跳转到2号程序LJMP TO_ONE;------------------------2号程序:控制步行电机反转---------------------------------- TO_TWO:MOV R7,#4MOV A,#08HMOV P3,#0FFHLP2:MOV P1,ALCALL DELAYLCALL DISPLAYRR A ; 反向输入脉冲信号DJNZ R7,LP2JNB P3.5,TO_ONE ;有正向键按下,跳转到1号程序LJMP TO_TWO;----------------------------中断服务程序----------------------------------------------- Speed_Up: ; 外部中断IT0,控制加速PUSH ACCLCALL D10MSMOV A,SpeedCJNE A,#12,L1 ; 最大速度时,速度不再增加LJMP L2L1: ; 速度加1(减小脉冲周期)SUBB A,#12MOV Speed,AINC NumL2: POP ACCRETISpeed_Down: ;外部中断IT1,控制减速PUSH ACCLCALL D10MSMOV A,SpeedCJNE A,#60,L3 ;最小速度时,速度不再减小LJMP L4L3: ;速度减1(增大脉冲周期)ADD A,#12MOV Speed,ADEC NumL4: POP ACCRETI;----------------------------------延时、显示子程序--------------------------------------------- DISPLAY: ;显示子程序,显示步行电机的转速PUSH ACCMOV A,NumMOVC A,@A+DPTRMOV P0,APOP ACCRETDELAY: ;延时子程序,用于产生脉冲信号,并可通过改变延时来改变脉冲的频率PUSH ACCMOV R6,Speedd1:MOV R5,#100DJNZ R5,$DJNZ R6,d1POP ACCRETD10MS: ;延时10ms,软件去抖动MOV R4,#10D1MS:MOV R3,#249DL: NOPNOPDJNZ R3,DLDJNZ R4,D1MSRETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H ;速度显示:0~5END。
综合实践报告之第二次大作业题目:步进电机控制设计说明:在工业电气自动化工程中,步进电机是一种常用的控制设备,它以脉冲信号控制电机的转速,在数控机床、仪器仪表、计算机外围设备以及其它自动设备中有广泛的应用。
步进电机是指一步步走的电动机,所谓“步”指转动角度,每步都会使电机转过一个固定的角度。
步进电机有不同的种类,但其控制方法均相同,均以脉冲信号进行驱动,很适合使用单片机来进行控制。
本次大作业要求设计一个步进电机的控制部分。
已知:1. 采用2相制5线步进电机,其结构如下图所示,线圈中心抽头X1与X2连接在一起;B 相X1A 相2相步进电机2. 步进电机采用1相激磁法,即在每一个瞬间只有一个线圈导通,其它线圈休息;3. 单片机与步进电机之间可采用ULN2003类的驱动IC ;要求:1.查找资料,设计出步进电机的硬件连接电路图;2.给出控制软件流程图;3.用汇编语言写出控制软件的代码。
提示:本作业对电机的转动方向不做要求,在实际应用中,改变线圈激磁的顺序可以改变步进电机的转动方向,每送一次激磁信号后应经过一小段时间延时,让步进电机有足够的时间建立激励磁场及转动。
可以使用单片机的P0.0~P0.3端口输出控制信号,经驱动IC传至步进电机。
一.电路图设计说明此控制电路选用AT89S51型单片机作为驱动时序的输出控制器,其P0.1-P0.3输出作为两相四线步进电机的时序信号,经过驱动芯片ULN2003放大后输入到两相四线步进电机的输入端口;单片机P1.0-P1.2作为控制指令的输入按键K1-K3的输入端口,K1为电机正转按键,K2为电机正转按键,K3为电机停止按键,这三个按键均为高电平输入有效,按一下K1电机正转,按一下K2电机反转转,按一下K3电机停止。
其硬件电路如图一:二.控制程序流程图由于ULN2003是非们输出电路所以P0.0-P0.3端口输出低电平才是有效驱动电平,其控制程序流程图如图二:三.控制程序K1BIT P1.0K2BIT P1.1K3BIT P1.2K_OLD EQU30HK_NEW EQU31H;---------------------------------------------------------ORG0000HJMP MAINORG0030H;---------------------------------------------------------MAIN:MOV SP,#60HMOV P1,#00HMOV P0,#0FFHMOV K_OLD,#04HMAIN1:MOV R2,#4;给R2赋值4循环移位次数CALL K_SCAN;键扫描MOV A,K_NEWCJNE A,#00H,MAIN2 ;是否有按键按下MOV A, K_OLD;JMP MAIN4MAIN2:CALL DELAY;延时示去抖动CALL K_SCAN;再次判断键是否按下MOV A,K_NEWCJNE A,#00H,MAIN3 ; 再次判断键是否按下MOV A, K_OLDJMP MAIN4MAIN3:MOV K_OLD,AMAIN4:JB ACC.0,LOOP1;K1按下既P1.2-P1.0输入为001电机正转指令JB ACC.1,LOOP2;K2按下既P1.2-P1.0输入为010电机反转指令JB ACC.2,LOOP3;K3按下既P1.2-P1.0输入为110电机停止指令JMP MAIN1;电机正转控制时序LOOP1:MOV A,#0FEHLOPP1A:MOV P0,ACALL DELAY ;延时RLC A ;左移1位DJNZ R2,LOPP1AJMP MAIN1;电机反转控制时序LOOP2:MOV A,#0F7HLOPP2A:MOV P0,ACALL DELAY ;延时RRC A ;右移1位DJNZ R2,LOOP1AJMP MAIN1;电机停止控制时序LOOP3:MOV A,#0FFHMOV P0,A ;P0.0-P0.3输出1111电机停止JMP MAIN1;---------------------------------------------------------;K_SCAN:;MOV K_NEW,#00H;MOV A,P1 ;将P1端口的输入状态读入;ANL A,#07H ;保留P1端口状态的低三位;MOV K_NEW,A ;将K1,K2,K3的输入状态存入K_NEW, ;RET;---------------------------------------------------------;---------------------------------------------------------;延时子程序DELAY:MOV R6,#200DEL:MOV R7,#0FFHDJNZ R7,$DJNZ R6,DELRET;---------------------------------------------------------Welcome To Download !!!欢迎您的下载,资料仅供参考!。
单片机步进电机控制程序代码引言:步进电机是一种常见的电机类型,它具有准确的位置控制和高速运动的特点,在许多应用中被广泛使用。
为了实现步进电机的精确控制,我们需要编写相应的单片机控制程序代码。
本文将介绍一种常见的单片机步进电机控制程序代码,并详细解析其实现原理和使用方法。
一、控制原理:步进电机通过控制电流的方向和大小来控制转子的运动,常见的步进电机控制方式有两相和四相控制。
本文将以四相控制为例进行介绍。
四相控制是指通过控制四个线圈的电流状态来控制步进电机的运动。
具体控制方式有全步进和半步进两种。
全步进模式下,每一步都是四个线圈中的两个同时激活;半步进模式下,每一步都是四个线圈中的一个或两个同时激活。
在本文中,我们将介绍半步进模式的控制程序代码。
二、程序代码:下面是一段常见的单片机步进电机控制程序代码:```c#include <reg51.h>sbit A1 = P1^0;sbit A2 = P1^1;sbit B1 = P1^2;sbit B2 = P1^3;void delay(unsigned int t){unsigned int i, j;for (i = 0; i < t; i++)for (j = 0; j < 120; j++);}void main(){unsigned int i;unsigned char step[8] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09};while (1){for (i = 0; i < 8; i++){P1 = step[i];delay(1000);}}}```三、代码解析:1. 引用头文件reg51.h,该头文件定义了单片机51的寄存器等相关信息。
2. 定义了四个IO口A1、A2、B1、B2,分别对应步进电机的四个线圈。
3. 定义了一个延时函数delay,用于控制电机转动的速度。
基于单片机的步进电机控制系统设计前言步进电机是一种进行精确步进运动的机电执行元件,它广泛应用于工业机械的数字控制,为使系统的可靠性、通用性、可维护性以及性价比最优,根据控制系统功能要求及步进电机应用环境,确定了设计系统硬件和软件的功能划分,从而实现了基于8051单片机的四相步进电机的开环控制系统。
控制系统通过单片机存储器、I/O接口、中断、键盘、LED显示器的扩展、步进电机的环形分频器、驱动及保护电路、人机接口电路、中断系统及复位电路、单电压驱动电路等的设计,实现了四相步进电机的正反转,急停等功能。
为实现单片机控制步进电机系统在数控机床上的应用,系统设计了两个外部中断,以实现步进电机在某段时间内的反复正反转功能,也即数控机床的刀架自动进给运动,随着单片机技术的不断发展,单片机在日用电子产品中的应用越来越广泛,自六十年代初期以来,步进电机的应用得到很大的提高。
人们用它来驱动时钟和其他采用指针的仪器,打印机、绘图仪,磁盘光盘驱动器、各种自动控制阀、各种工具,还有机器人等机械装置。
此外作为执行元件,步进电机是机电一体化的关键产品之一,被广泛应用在各种自动化控制系统中,随着微电子和计算机技术的发展,它的需要量与日俱增,在各个国民经济领域都有应用。
步进电机是机电数字控制系统中常用的执行元件,由于其精度高、体积小、控制方便灵活,因此在智能仪表和位置控制中得到了广泛的应用,大规模集成电路的发展以及单片机技术的迅速普及,为设计功能强,价格低的步进电机控制驱动器提供了先进的技术和充足的资源。
1.步进电机原理及硬件和软件设计1.1步进电机原理及控制技术由于步进电机是一种将电脉冲信号转换成直线或角位移的执行元件,它不能直接接到交直流电源上,而必须使用专业设备一步进电机控制驱动器,典型步进电机控制系统如图1所示:控制器可以发出脉冲频率从几赫兹到几千赫兹可以连续变化的脉冲信号,它为环形分配器提供脉冲序列,环形分配器的主要功能是把来自控制环节的脉冲序列按一定的规律分配后,经过功率放大器的放大加到步进电机驱动电源的各项输入端,以驱动步进电机的转动,环形分配器主要有两大类:一类是用计算机软件设计的方法实现环形分配器要求的功能,通常称软环形分配器。
步进电机的控制电路和程序先看一下我们将要使用的51单片机综合学习系统能完成哪些实验与产品开发工作:分别有流水灯,数码管显示,液晶显示,按键开关,蜂鸣器奏乐,继电器控制,IIC总线,SPI总线,PS/2实验,AD模数转换,光耦实验,串口通信,红外线遥控,无线遥控,温度传感,步进电机控制等等。
上图是我们将要使用的51单片机综合学习系统硬件平台,本期实验我们用到了综合系统主机、步进电机,综合系统其它功能模块原理与使用详见前几期《电子制作》杂志及后期连载教程介绍。
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。
在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的。
可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
步进电机可以作为一种控制用的特种电机,利用其没有积累误差(精度为100%)的特点,广泛应用于各种开环控制。
步进电机分类与结构现在比较常用的步进电机分为三种:反应式步进电机(VR)、永磁式步进电机(PM)、混合式步进电机(HB)。
本章节以反应式步进电机为例,介绍其基本原理与应用方法。
反应式步进电机可实现大转矩输出,步进角一般为1.5度。
反应式步进电机的转子磁路由软磁材料制成,定子上有多相励磁绕组,利用磁导的变化产生转矩。
常用小型步进电机的实物如图1所示。
图1步进电机实物图图2 步进电机内部图步进电机现场应用驱动电路综合系统使用的是小型步进电机,对电压和电流要求不是很高,为了说明应用原理,故采用最简单的驱动电路,目的在于验证步进电机的使用,在正式工业控制中还需在此基础上改进。
一般的驱动电路可以用图3的形式。
图3 一般驱动电路在实际应用中一般驱动路数不止一路,用上图的分立电路体积大,很多场合用现成的集成电路作为多路驱动。
步进电机在控制系统中具有广泛的应用。
它可以把脉冲信号转换成角位移,并且可用作电磁制动轮、电磁差分器、或角位移发生器等。
有时从一些旧设备上拆下的步进电机(这种电机一般没有损坏)要改作它用,一般需自己设计驱动器。
本文介绍的就是为从一日本产旧式打印机上拆下的步进电机而设计的驱动器。
本文先介绍该步进电机的工作原理,然后介绍了其驱动器的软、硬件设计。
1. 步进电机的工作原理该步进电机为一四相步进电机,采用单极性直流电源供电。
只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。
图1是该四相反应式步进电机工作原理示意图。
图1 四相步进电机步进示意图开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。
当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。
而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。
依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。
四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。
单四拍与双四拍的步距角相等,但单四拍的转动力矩小。
八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。
单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2.a、b、c所示:a. 单四拍b. 双四拍c八拍图2.步进电机工作时序波形图2.基于AT89C2051的步进电机驱动器系统电路原理步进电机驱动器系统电路原理如图3:图3 步进电机驱动器系统电路原理图AT89C2051将控制脉冲从P1口的P1.4~P1.7输出,经74LS14反相后进入9014,经9014放大后控制光电开关,光电隔离后,由功率管TIP122将脉冲信号进行电压和电流放大,驱动步进电机的各相绕组。
ORG 0000HLJMP MAINORG 0100HMAIN:SETB P2.4 //启停键SETB P2.5 //正反SETB P2.6 //加速SETB P2.7 //减速MOV R0,#0 //启停标志MOV R1,#0 //正反标志MOV R7,#0 //速度控制及查表MOV R3,#0 //查表STA:JNB P2.4,YS1 //启停键按下,跳至防抖LJMP PDR0 //判断R0奇偶性SS:INC R0 //R0+1LJMP PDR0 //判断R0奇偶性START:JNB P2.5,YS2 //正反键按下,跳至防抖LJMP PDR1 //判断R1奇偶性TT:INC R1LJMP PDR1 //判断R1奇偶性FAN:CJNE R3,#09H,PDR3F //反转FANZ:MOV R3,#09H //反转查表初始化LJMP XX //跳至判断加减速ZHENG:CJNE R3,#8,PDR3Z //正转ZHENGZ: MOV R3,#0 //正转查表初始化XX:JNB P2.6,YS3 //加速判断,P2.6=0跳至防抖JNB P2.7,YS4 //减速判断,P2.7=0跳至防抖CS: CJNE R7,#0,XIANSHI //速度显示初始化CSZT:MOV R7,#5 //速度显示保护,初始状态LJMP XIANSHIYY:MOV R2,#1 //加速标志LJMP GZZTZZ:MOV R2,#2 //减速标志GZZT:CJNE R2,#1,JIANSU //加减速工作DEC R7CJNE R7,#0,XIANSHI //速度显示保护,减速LJMP CSZTJIANSU:INC R7CJNE R7,#10,XIANSHI //速度显示保护,加速LJMP CSZTXIANSHI: //显示及输出MOV DPTR,#TABLEMOV A,R7ADD A,#12HMOVC A,@A+DPTRMOV P0,A //速度等级显示MOV A,R3MOVC A,@A+DPTRJZ STAMOV P1,A //P1.0--P1.3输出步进电机控制脉冲MOV A,R7MOV R6,ALCALL DELAY //速度控制MOV A,R6MOV R7,AINC R3LJMP STAYS1:LCALL DL10mS //启停防抖JNB P2.4, YS1LJMP SSYS2:LCALL DL10mS //正反转防抖JNB P2.5, YS2LJMP TTYS3:LCALL DL10mS //加速位防抖JNB P2.6, YS3LJMP YYYS4:LCALL DL10mS //减速位防抖JNB P2.7, YS4LJMP ZZPDR1:MOV A,#01H //正反转判断,R1为奇数反转ANL A,R1JZ ZHENGLJMP FANPDR3F : JC FANZ //反转查表判断CJNE R3,#11H,XXMOV R3,#0AHLJMP XXPDR3Z : JNC ZHENGZJC XXPDR0:MOV A,#01H //启停标志判断ANL A,R0JZ CSHLJMP STARTCSH:MOV P0,#0C0H //初始化MOV P1,#0LJMP MAINDELAY: //步进电机步间延时速度控制M3: MOV R5,#5M2: MOV R4,#100DJNZ R4,$DJNZ R5,M2DJNZ R7,M3RETDL10mS:MOV R5,#25 //防抖延时DL4: MOV R4,#198DL5: DJNZ R4,DL5DJNZ R5,DL4RETTABLE:DB 01H,03H,02H,06H,04H,0CH,08H,09H // 正转表DB 00H // 正转结束DB 08H,0CH,04H,06H,02H,03H,01H,09H // 反转表DB 00H // 反转结束DB 0xc0,0x90,0x80,0xf8,0x82,0x92,0x99,0xb0,0xa4,0xf9,0xc0 //共阳数码管0,1~9,0 END。
步进电机驱动汇编程序及调试总结;*************步进电机驱动*****************;设计者小苏FOSC=12MHz 2013.11.05;------------------------------------------------; 步进角为7.5 度一圈360 度,需要48 个脉冲完成;A 组线圈P2.4;B 组线圈P2.5;C 组线圈P2.6;D 组线圈P2.7;正传次序:AB 组-BC 组-CD 组-DA 组(即一个脉冲,正转7.5 度);--------------------------------------------;调试平台i51 最小系统;调试结果:步进电机,速度参数40,正反转正常;;30 以下速度加快,正转正常反转不动,原因不明,卡死丢步猜测为卡死;;继续加速,参数为5,正转平稳,反转跳动,怀疑丢步。
;继续加速,电机震动,但正反转都不动,改进方案尚无(R6=248,R7 为修改量);--------------------------------------------;总结:对步进电机运行、驱动原理还不够理解、;任务,尽快学习,并写出c 程序,加入速度,正反转,停机控制;--------------------------------------------;---------正转-----------ORG 0000H LJMP MAIN ORG 0100HMAIN: MOV R3,#255 ;正转3 圈共114 脉冲START: MOV R0,#00HSTART1:MOV P2,#00H MOV A,R0 MOV DPTR,#TABLE MOVC A,@A+DPTR JZ START ;当A=0 时转到START(一个脉冲,正转7.5 度)MOV P2,A LCALL DELAY INC R0 DJNZ R3,START1 MOV P2,00H LCALL DELAY1;----------------反转------------------------- MOVR3,#255 ;正转3 圈共114 脉冲START2:MOV P2,#00H MOV R0,#05HSTART3:MOV A,R0 MOV DPTR,#TABLE MOVC A,@A+DPTR JZ START2 ;当A=0 时转到START(一个脉冲,反转7.5 度)MOV P2,A CALL DELAY INC R0 DJNZ R3,START3 MOV P2,00H LCALL DELAY1 LJMP MAINDELAY: MOV R7,#10 ;步进电机的转速M3: MOV R6,#248 DJNZ R6,$ DJNZ R7,M3 RETDELAY1:MOV R4,#20 ;2S 延时子程序DEL2: MOV。
步进电机控制实验c语⾔程序,⽤AT89C51单⽚机控制步进电机的汇编源程序:单⽚机(2540)源程序(50)步进电机(282)汇编语⾔(64)下⾯程序完成的主要功能:实现的正反转,加速、减速;显⽰电机转速(转速级别)和⼯作状态(正转、反转、不转)。
源程序SPEED EQU 10H ;SPEED为转速等级标志,共7级,即1~7FX EQU 11H ;FX 为⽅向标志COUNT EQU 12H ;COUNT次数标志ORG 0000HAJMP MAINORG 0003H ;外部中断0⼊⼝地址,加速⼦程序AJMP UPORG 0013H ;外部中断1⼊⼝地址,减速⼦程序AJMP DOWNORG 000BH ;定时器0中断⼊⼝地址,控制中断次数来达到控制转速 AJMP ZDT0ORG 0030HMAIN: MOV SP,#60HMOV TMOD,#01H ;⼯作于定时、软件置位启动,模式1(16 位计时器)MOV TH0,#0CFHMOV TL0,#2CHMOV COUNT,#01HSETB ET0 ;定时/计数器允许中断CLR IT0 ;外部中断为电平触发⽅式,低电平有效CLR IT1SETB EX0 ;外部允许中断SETB EX1SETB EA ;开总中断MOV R1,#11H ;四相单四拍运⾏,共阳数码管⽅向显⽰8,速度值显⽰0MOV SPEED,#00HMOV FX,#00HXIANS: MOV A,SPEEDMOV DPTR,#LEDMOVC A,@A+DPTR ;查表获取等级对应数码管代码MOV P2,A ;第⼆个数码管显⽰转速等级MOV A,FX ;准备判断转向CJNE A,#11H,ELSMOV P0, #0F9H ;第⼀个数码管显⽰ 1,表⽰正转AJMP QDELS: CJNE A,#00H,ZHENGMOV P0,#0C0H ;第⼀个数码管显⽰ 0,表⽰不转AJMP QDZHENG: MOV P0,#0BFH ;第⼀个数码管显⽰-,表⽰反转QD: JB P3.4,DD ;P3.4 接启动开关 K1,P3.4=1 时启动CLR TR0 ;停⽌定时/计数器MOV P0,#0C0H ;第⼀个数码管显⽰ 0,表⽰不转MOV P2,#0C0H ;第⼆个数码管显⽰ 0,表⽰转速为 0 MOV SPEED,#00H ;重新赋初值MOV FX,#00HAJMP QDDD: MOV A,SPEEDJNZ GO ;A 不等于 0,即初始速度不为零,则转移到 GO CLR TR0 ;停⽌定时/计数器AJMP QDGO: SETB TR0 ;开启定时/计数器ACALL DELAYAJMP XIANSDELAY: MOV R6,#10 ;延时⼦程序DEL1: MOV R7,#250HERE1: DJNZ R7, HERE1DJNZ R6,DEL1RET。
本程序的资源分配如下:R0——中间寄存器;R1——储存速度级数;R2——储存级数步数;R3——加减速状态指针,加速时指向35H,恒速时指向37H,减速时指向3AH;32H~34H——存放绝对参数(假设用3个字节),低位在前;35H、36H——存放加速总步数(假设2个字节),低位在前;37H~39H——存放恒速总步数(假设3个字节),低位在前;3AH、3BH——存放减速总步数(假设2个字节),低位在前;P0.0——正转脉冲输入;P0.1——反转脉冲输入;P1.3——正转按钮K1;P1.4——反转按钮K2;P1.5——加速按钮K3;P1.6——减速按钮K4;定时常数序列放在以ABC为起始地址的ROM中。
初始R3=35H,R1、R2都有初始值。
程序如下:ORG 0000HJNB P0.0 ZZ;JNB P0.1 FZ;ZZ:INC R0CJNE R0,#06H ZZ1;MOV R0,00H;ZZ1:MOV A,R0;MOV DPTR,#ABC;MOVC A,@A+DPTR;MOV P0 A;FZ: DEC R0;CJNE R0 #0FFH,FZ1;MOV R0,#05H ;FZ1:MOV A,R0;MOV DPTR,#ABC;MOVC A,@A+DPTR;MOV P0,A;ABC:DB 01H 03H 02H 06H 04HRETJS:MOV R0,#35;CJNE@R0 #0FFH,JS1;INC R0;DEC @R0;JS1:DJNC R2 JS2;INC R1;MOV A R1;MOV B,#N;MUL AB;MOV R2 A;JS2:MOV A,35H;ORL A,36H;JNB R3 #37H;MOV R0 #3AH;DEC @R0;CJNE @R0,#0FFH,JS4;INC R0;DEC @R0;JS4:DJNC R2 JS5;DEC R1;MOV A,R1;MOV B,#N;MUL AB;MOV R2,A;JS5:MOV A,3AH;ORL A,3B;JNB R3;RET;。
图8 总体电路图1.3.4软件设计通过分析可以看出,实现系统功能可以采用多种方法,由于随时有可能输入加速、加速信号和方向信号,因而采用中断方式效率最高,这样总共要完成4个部分的工作才能满足课题要求,即主程序部分、定时器中断部分、外部中断0和外部中断1部分,其中主程序的主要功能是系统初始参数的设置及启动开关的检测,若启动开关合上则系统开始工作,反之系统停止工作;定时器部分控制脉冲频率,它决定了步进电机转速的快慢;两个外部中断程序要做的工作都是为了完成改变速度这一功能。
下面分析主程序与定时器中断程序及外部中断程序。
(1)主程序设计主程序中要完成的工作主要有系统初始值的设置、系统状态的显示以及各种开关状态的检测判断等。
其中系统初始状态的设置内容较多,该系统中,需要初始化定时器、外部中断;对P1口送初值以决定脉冲分配方式,速度值存储区送初值决定步进电机的启动速度,对方向值存储区送初值决定步进电机旋转方向等内容。
若初始化P1=11H、速度和方向初始值均设为0,就意味着步进电机按四相单四拍运行,系统上电后在没有操作的情况下,步进电机不旋转,方向值显示“0”,速度值显示“0”,主程序流程图如图9所示。
(2)定时中断设计步进电机的转动主要是给电机各绕组按一定的时间间隔连续不断地按规律通入电流,步进电机才会旋转,时间间隔越短,速度就越快。
在这个系统中,这个时间间隔是用定时器重复中断一定次数产生的,即调节时间间隔就是调节定时器的中断次数,因而在定时器中断程序中,要做的工作主要是判断电机的运行方向、发下一个脉冲,以及保存当前的各种状态。
程序流程图如图10所示。
(3)外部中断设计外部中断所要完成的工作是根据按键次数,改变速度值存储区中的数据(该数据为定时器的中断次数),这样就改变了步进电机的输出脉冲频率,也就是改变了电机的转速。
速度增加按钮S2为INT0中断,其程序流程为原数据,当值等于7时,不改变原数值返回,小于7时,数据加1后返回;速度减少按钮S3,当原数据不为0,减1保存数据,原数据为0则保持不变。
mega16的,16和32管脚兼容,只不过flash大小不一样,不过中断向量号也不一样,你看下自己改改。
时钟频率:内部RC 1M 芯片:ULN2003 键值:0 小角度快正转。
1 小角度快倒。
2 大角度快转。
3 大角度快倒。
4 小角度正慢转。
5 小角度倒慢转。
6 大角度正慢转。
7 大角度倒慢转。
********************************************************************/#include<iom16v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned intuchar a=0,b=0;uchar KEY_num=0xe1;unsigned int m=9000;const uchar f1[]={0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03}; //正转时序3.75度const uchar f2[]={0x04,0x06,0x02,0x03,0x01,0x09,0x08,0x0c}; //倒转时序3.75度const uchar f3[]={0x01,0x02,0x04,0x08}; //正转时序7.5度const uchar f4[]={0x01,0x08,0x04,0x02}; //倒转时序7.5度void delay(int k) //延时{ int i; for(i=0;i<k;i++); }void delay_10ms(uint data){ uint m=2; while(data) { data--; m=2; while(m)m--; } }void zhengzhuan1(void) //正转3.75度{ unsigned char j; for (j=0;j<8;j++) { PORTC=f1[j]; delay(m); } }void daozhuan1(void) //倒转3.75度{ unsigned char j; for (j=0;j<8;j++) { PORTC=f2[j]; delay(m); } }void zhengzhuan2(void) //正转7.5度{ unsigned char j; for (j=0;j<4;j++) { PORTC=f3[j]; delay(m); } }void daozhuan2(void) //倒转7.5度{ unsigned char j; for (j=0;j<4;j++) { PORTC=f4[j]; delay(m); } }void port_int() //初始化端口{ PORTB = 0xf0; DDRB = 0x0F; DDRC=0xff; PORTC=0x01; }void init_devices(void){ CLI(); //禁止所有中断MCUCR = 0x00; MCUCSR = 0x80;//禁止JTAG GICR = 0x00; port_int();SEI();//开全局中断}//按键键值读取程序//返回按键键值,如果没有按键则返回0.void KYY_read(){ //定义按键值存放内存PORTB=0xf0; //行全部送高电平PORTB=0xf0;if((PINB&0xf0)!=0xf0) //有按键{ delay_10ms(1);//延时消抖if((PINB&0xf0)!=0xf0) //确定有按键按下{ PORTB=0xfe; //扫描第一行PORTB=0xfe;if((PINB&0xf0)!=0xf0){ KEY_num=(PINB&0xf0)+1; a=9; }PORTB=0xfd; //扫描第二行PORTB=0xfd;if((PINB&0xf0)!=0xf0){ KEY_num=(PINB&0xf0)+2; } PORTB=0xfb; //扫描第三行PORTB=0xfb;if((PINB&0xf0)!=0xf0){ KEY_num=(PINB&0xf0)+4; } PORTB=0xf7; //扫描第四行PORTB=0xf7;if((PINB&0xf0)!=0xf0){ KEY_num=(PINB&0xf0)+8; } } } //没有按键返回0 }//按键执行程序//送如参数:按键键值KEY_do(uchar data){ uchar KEY_number=data;switch(KEY_number){ case 0xe1:a=0;b=0;daozhuan1();m=5000;break;case 0xd1:a=0;b=1;daozhuan1();m=6000;break;case 0xb1:a=0;b=2;daozhuan1();m=7000;break;case 0x71:a=0;b=3;daozhuan1();m=8000;break;case 0xe2:a=0;b=4;daozhuan2();m=5000;break;case 0xd2:a=0;b=5;daozhuan2();m=6000;break;case 0xb2:a=0;b=6;daozhuan2();m=7000;break;case 0x72:a=0;b=7;daozhuan2();m=8000;break;case 0xe4:a=0;b=8;zhengzhuan1();m=5000;break;case 0xd4:a=0;b=9;zhengzhuan1();m=6000;break;case 0xb4:a=1;b=0;zhengzhuan1();m=7000;break;case 0x74:a=1;b=1;zhengzhuan1();m=8000;break;case 0xe8:a=1;b=2;zhengzhuan2();m=5000;break;case 0xd8:a=1;b=3;zhengzhuan2();m=6000;break;case 0xb8:a=1;b=4;zhengzhuan2();m=7000;break;case 0x78:a=1;b=5;zhengzhuan2();m=8000;break; default:b=0;break;}}void main (void)//主程序{ init_devices();while(1){ KYY_read(); KEY_do(KEY_num); }}#include <reg51.h> //51芯片管脚定义头文件#include <intrins.h> //内部包含延时函数_nop_();#define uchar unsigned char#define uint unsigned intuchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};sbit K1 = P3^4; //正转sbit K2 = P3^5; //反转sbit K3 = P3^6; //停止sbit K4 = P3^7;sbit BEEP = P0^6; //蜂鸣器/********************************************************//*/* 延时t毫秒/* 11.0592MHz时钟,延时约1ms/*/********************************************************/void delay(uint t){uint k;while(t--){for(k=0; k<125; k++){ }}}/**********************************************************/void delayB(uchar x) //x*0.14MS{uchar i;while(x--)for (i=0; i<13; i++){ }}}/**********************************************************/ void beep(){uchar i;for (i=0;i<180;i++){delayB(5);BEEP=!BEEP; //BEEP取反}BEEP=1; //关闭蜂鸣器}/********************************************************/ /*/*步进电机正转/*/********************************************************/ void motor_ffw(){uchar i;uint j;for (j=0; j<12; j++) //转1*n圈{if(K4==0){break;} //退出此循环程序for (i=0; i<8; i++) //一个周期转30度{P0 = FFW[i]; //取数据delay(15); //调节转速}}}/********************************************************/ /*/*步进电机反转/********************************************************/ void motor_rev(){uchar i;uint j;for (j=0; j<12; j++) //转1×n圈{if(K4==0){break;} //退出此循环程序for (i=0; i<8; i++) //一个周期转30度{P0 = REV[i]; //取数据delay(15); //调节转速}}}/********************************************************** 主程序**********************************************************/main(){uchar r,N=5; //N 步进电机运转圈数P2=0xDF;while(1){if(K1==0){beep();for(r=0;r<N;r++){motor_ffw(); //电机正转if(K4==0){beep();break;} //退出此循环程序}}else if(K2==0){beep();for(r=0;r<N;r++){motor_rev(); //电机反转if(K4==0){beep();break;} //退出此循环程序}}elseP0 = 0xf0;}}/********************************************************/ULN2803是8路NPN达林顿连接晶体管系列,特别适用于低逻辑电平数字电路,如:TTL,COMS或PMOS/NMOS,和较高的电压/电流要求之间的接口,广泛应用与计算机、打印机、继电器、灯等类似负载中。
DELAY 1MS MACRO TIME ;延时宏命令LOCAL AALOCAL BBPUSH CXMOV CX,TIMEAA: PUSH CXMOV CX,1000BB: NOPLOOP BBPOP CXLOOP AAPOP CXENDMDA TA SEGMENTTABA DB 01H,03H,02H,06H,04H,05H;正转的模型TABB DB 05H,04H,06H,02H,03H,01H;反转的模型DA TA ENDSCODE SEGMENTZZ PROC NEARPUSH DSMOV AX,DA TAMOV DS,AXMOV AX,0PUSH AXMOV DX,203HMOV AL,80HOUT DX,AL ;8255的控制字设定MOV DX,200HMOV AL,0OUT DX,AL ;先输出制动命令MOV CX,360 ;设定正转步数DD:MOV BL,6 ;六拍MOV DX,200HLEA DI,TABA ;指针指向正转的数字模型CC: MOV AL,[DI]OUT DX,ALDELAY 1MS 10INC DI ;指针加1,指向下一步的数字模型DEC BL ;拍数减1JNZ CC ;六拍未结束,则继续循环LOOP DD;360个周期的六拍未结束,继续循环ZZ ENDPFZ PROC NEARMOV CX,400 ;设定反转步数FF: MOV BL,6MOV DX,200HLEA DI,TABB ;指针指向反转的数字模型EE: MOV AL,[DI]OUT DX,ALDELAY 1MS 10DEC DI ;指针减1,指向反转下一步数字模型DEC BLJNZ EELOOP FFFZ ENDPMOV DX,200HMOV AL,0OUT DX,AL ;结束后,输出制动命令RETMAIN ENDPCODE ENDSEND START。
综合实践报告之第二次大作业
题目:步进电机控制设计
说明:在工业电气自动化工程中,步进电机是一种常用的控制设备,它以脉冲信号控制电机的转速,在数控机床、仪器仪表、计算机外围设备以及其它自动设备中有广泛的应用。
步进电机是指一步步走的电动机,所谓“步”指转动角度,每步都会使电机转过一个固定的角度。
步进电机有不同的种类,但其控制方法均相同,均以脉冲信号进行驱动,很适合使用单片机来进行控制。
本次大作业要求设计一个步进电机的控制部分。
已知:
采用2相制5线步进电机,其结构如下图所示,线圈中心抽头X1与X2连接在一起;
B 相X1A 相
2相步进电机
步进电机采用1相激磁法,即在每一个瞬间只有一个线圈导通,其它线圈休息; 单片机与步进电机之间可采用ULN2003类的驱动IC ;
要求:
查找资料,设计出步进电机的硬件连接电路图; 给出控制软件流程图;
用汇编语言写出控制软件的代码。
提示:本作业对电机的转动方向不做要求,在实际应用中,改变线圈激磁的顺序可以改变步进电机的转动方向,每送一次激磁信号后应经过一小段时间延时,让步进电机有足够的时间建立激励磁场及转动。
可以使用单片机的~端口输出控制信号,经驱动IC 传至步进电机。
电路图设计说明
此控制电路选用AT89S51型单片机作为驱动时序的输出控制器,其输出作为两相四线步进电机的时序信号,经过驱动芯片ULN2003放大后输入到两相四线步进电机的输入端口;单片机作为控制指令的输入按键K1-K3的输入端口,K1为电机正转按键,K2为电机正转按键,K3为电机停止按键,这三个按键均为高电平输入有效,按一下K1电机正转,按一下K2电机反转转,按一下K3电机停止。
其硬件电路如图一:
控制程序流程图
由于ULN2003是非们输出电路所以端口输出低电平才是有效驱动电平,其控制程序流程图如图二:
控制程序
K1 BIT
K2 BIT
K3 BIT
K_OLD EQU 30H
K_NEW EQU 31H
;---------------------------------------------------------
ORG 0000H
JMP MAIN
ORG 0030H
;---------------------------------------------------------
MAIN:
MOV SP,#60H
MOV P1,#00H
MOV P0,#0FFH
MOV K_OLD,#04H
MAIN1:
MOV R2,#4 ;给R2赋值4循环移位次数
CALL K_SCAN ;键扫描
MOV A,K_NEW
CJNE A,#00H,MAIN2 ;是否有按键按下
MOV A, K_OLD ;
JMP MAIN4
MAIN2:
CALL DELAY ;延时示去抖动
CALL K_SCAN ;再次判断键是否按下
MOV A,K_NEW
CJNE A,#00H,MAIN3 ; 再次判断键是否按下
MOV A, K_OLD
JMP MAIN4
MAIN3:
MOV K_OLD ,A
MAIN4:
JB ,LOOP1 ;K1按下既输入为001电机正转指令JB ,LOOP2 ;K2按下既输入为010电机反转指令
JB ,LOOP3 ;K3按下既输入为110电机停止指令
JMP MAIN1
;电机正转控制时序
LOOP1:
MOV A,#0FEH
LOPP1A:
MOV P0,A
CALL DELAY ;延时
RLC A ;左移1位
DJNZ R2,LOPP1A
JMP MAIN1
;电机反转控制时序
LOOP2:
MOV A,#0F7H
LOPP2A:
MOV P0,A
CALL DELAY ;延时
RRC A ;右移1位
DJNZ R2,LOOP1A
JMP MAIN1
;电机停止控制时序
LOOP3:
MOV A,#0FFH
MOV P0,A ;输出1111电机停止
JMP MAIN1
;---------------------------------------------------------
;K_SCAN:
; MOV K_NEW,#00H
; MOV A,P1 ;将P1端口的输入状态读入
; ANL A,#07H ;保留P1端口状态的低三位
; MOV K_NEW,A ;将K1,K2,K3的输入状态存入K_NEW, ; RET
;---------------------------------------------------------
;---------------------------------------------------------
;延时子程序
DELAY:
MOV R6,#200
DEL:
MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DEL
RET
;---------------------------------------------------------。