基于8255的步进电机控制系统设计.docx
《基于8255的步进电机控制系统设计.docx》由会员分享,可在线阅读,更多相关《基于8255的步进电机控制系统设计.docx(15页珍藏版)》请在冰豆网上搜索。
基于8255的步进电机控制系统设计
基于8255的步进电机控制系统设计
一、实验设计的目的与要求
通过步进电机控制系统实验设计,用8255扩展端口控制步进电机,编写程序输出脉冲序列到8255的PA口,控制步进电机正传,反转,加速,减速。
进一步掌握微机原理与接口的理论和实际方法。
培养和锻炼开发控制系统的能力。
为今后单片机的学习与应用开发打下良好的基础。
要求了解步进电机控制的基本原理,掌握控制步进电机的转动的编程方法,进一步了解单片机控制外部设备的常用电路。
二、步进电机原理
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.步进电机的驱动原理
步进电动机是一种数字元件,易于数字电路接口,但一般数字电路的信号的能量远远不足以驱动步进电动机。
因此,必须有一个与之匹配的驱动电路来驱动步进电动机。
对步进电动机驱动一般有如下要求:
(1)能够提供较快的电流上升和下降速度,使电流波形尽量接近矩形。
(2)具有供截止期间释放电流流通的回路,以降低绕组两端的反电动势,加快电流衰减。
(3)具有较高的功率及效率。
步进电动机的驱动方式很多,如单极性驱动、双极性驱动、高低压驱动、斩波驱动、细分驱动、集成电路驱动等。
三、步进电机的控制1.ULN2003
由于集成电路集驱动和保护于一体,作为小功率步进电动机的专用驱动芯片,ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。
该电路的特点如下:
ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTLCMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。
ULN2003工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V的电压,输出还可以在高负载电流并行运行。
ULN2003A在各种控制电路中常用它作为驱动继电器的芯片,其芯片内部做了一个消线圈反电动势的二极管。
ULN2003的输出端允许通过IC电流200mA,饱和压降VCE约1V左右,耐压BVCEO约为36V。
输出电流大,故可以用来直接驱动步进电机。
项目
符号
数值
单位
最大输入电压
Vi(max)
30
V
集电极-发射极电压
Vo(max)
50
V
最大基极输入电流
IB(MAX)
25
mA
输出电流
Io
500
mA
贮存温度
Ts
-65~150
℃
结温
Tj
175
℃
引线耐焊接温度
TD
300
℃
2、脉冲的形成
实现对步进电机的控制,微机应能输出有一定周期的控制脉冲。
步骤是:
先输出一个高电平,延时一段时间后,再输入一个低电平,然后再延时。
改变延时时间的长
短,即可改变脉冲的周期,脉冲的周期由步进电机的工作频率确定。
用软件形成环形脉冲的程序流程图
3、正反转控制
步进电机的旋转方向和内部绕组的通电顺序及通电方式有密切关系。
通过改变各相脉冲的先后顺序,就可以改变电机的旋转方向.
4、转速控制
控制步进电机的运行速度,实际上是控制系统发出时钟脉冲的频率或换相的周期,即在升速过程中,使脉冲的输出频率逐渐增加;在减速过程中,使脉冲的输出频率逐渐减少。
脉冲信号的频率可以用软件延时和硬件中断两种方法来确定。
采用软件延时,一般是根据所需的时间常数来设计一个子程序,该程序包含一定的指令,设计者要对这些指令的执行时间进行严密的计算或者精确的测试,以便确定延时时间是否符合要求。
每当延时子程序结束后,可以执行下面的操作,也可用输出指令输出一个信号作为定时输出。
采用软件定时,CPU一直被占用,因此CPU利用率低。
可编程的硬件定时器直接对系统时钟脉冲或某一固定频率的时钟脉冲进行计数,计数值则由编程决定。
当计数到预定的脉冲数时,产生中断信号,得到所需的延时时间或定时间隔。
由于计数的初始值由编程决定,因而在不改动硬件的情况下,只通过程序变化即可满足不同的定时和计数要求,因此使用很方便。
五、硬件连接图
六、程序设计
1、程序流程图
2、程序代码:
;**************************************************************************************
;本程序能实现步进电机的正反转与加速,具体过程如下:
;正转加速一段时间,然后停止5秒,然后反向加速一段时间,然后再正转,如此循环往复.
;能实现正-停-反,也能实现正-反-停.
;**************************************************************************************
MODEEQU080H;8255方式控制字
CTLEQU8000H;8255端口A地址
CONTRLEQU8003H;8255控制寄存器地址
AEQU01H
BEQU02H
CEQU04H
DEQU08H
QSEQU300;步进电机转过的圈数
DATASEGMENT
DLY_CDW0;DLY_C用以控制延时的长短以实现步进电机的加速
SOURCEDBA,A+B,B,B+C,C,C+D,D,D+A;步序表,使电机的工作方式为单/双8拍
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA;初始化数据段
MOVDS,AX
;**************************************************************************************
;初始化8255,使8255的A口输出.
;**************************************************************************************
MOVDX,CONTRL;8255的控制寄存器地址送DX
MOVAL,MODE;8255的A口输出,故初始化控制字为80H
OUTDX,AL;将控制字从8255输出以配置8255的工作方式
MOVDX,CTL;将A口地址送DX
MOVAL,0;将0送AL
OUTDX,AL;8255的端口写0以实现初始化
MOVDLY_C,300H;延时初始值
MOVCX,QS;将步进电机的圈数300送CX
;**************************************************************************************
;以下程序段实现的功能是让电机正向加速,速度达到最大值后匀速转动.
;**************************************************************************************
ZZ:
MOVBX,0;将0送BX,让电机的初始步为A
NEXT1:
MOVDX,CTL;将8255的A口地址送DX
MOVAL,SOURCE[BX];将电机的步序送AL
OUTDX,AL;将步序表中的第一个步序通过A口输出
CALLDELAY;调用延时子程序,用来控制电机转速
INCBX;BX加1,为取下一个步序做准备
CMPBX,7
JBENEXT1;判断电机是否已经走完8拍
PUSHCX;保存CX的值,因为下面还要用到CX
MOVCX,DLY_C;将DLY_C的值送CX
DECCX;CX(即DLY_C)减1以实现加速
CMPCX,100H;CX与100H比较,判断电机转速是否已经达到最大值
JNENN1;若电机转速尚未达到最大值,则转向NN1
INCCX;若电机转速已经达到最大值,则CX加1以实现电机匀速转动
NN1:
MOVDLY_C,CX;将CX的值送DLY_C以实现在一个循环
POPCX;恢复CX
LOOPZZ;CX减1,让电机转下一圈
;**************************************************************************************
;以下代码段调用5次延时子程序以实现延时5秒.正式调试时时间稍大于5秒,
;可见用软件延时不能实现精确延时.
;**************************************************************************************
TZ:
MOVDX,CTL;将8255的A口地址送DX
MOVAL,0;将0送AL
OUTDX,AL;将0从A口输出,使电机静止不转
CALLDELAY1S;调用5次延时1秒子程序,总共延时5秒
CALLDELAY1S
CALLDELAY1S
CALLDELAY1S
CALLDELAY1S
;**************************************************************************************
;反转加速一段时间,过程与正向加速类似,速度达到最大值后匀速转动.
;**************************************************************************************
MOVDLY_C,300H;延时初始值
MOVCX,QS;将步进电机的圈数送CX,使电机反转300圈
FZ:
MOVBX,7;将7送BX使电机反转的初始相序为D+A
NEXT2:
MOVDX,CTL;将8255的A口地址送DX
MOVAL,SOURCE[BX];将电机的步序送AL
OUTDX,AL;将步序表中的第八个步序通过A口输出,以控制电机反转
CALLDELAY;调用延时子程序,用来控制电机转速
DECBX;BX减1,为取下一个步序做准备
CMPBX,0
JGENEXT2;判断电机是否已经反向走完8拍
PUSHCX;保存CX的值,因为下面还要用到CX
MOVCX,DLY_C;将DLY_C的值送CX
DECCX;CX(即DLY_C)减1以实现加速
CMPCX,100H;CX与100H比较,判断电机转速是否已经达到最大值
JNENN2;若电机转速尚未达到最大值,则转向NN1
INCCX;若电机转速已经达到最大值,则CX加1以实现电机匀速转动
NN2:
MOVDLY_C,CX;将CX的值送DLY_C以实现在一个循环
POPCX;恢复CX
LOOPFZ;CX减1,让电机转下一圈
JMPSTART;无条件转到START处以实现下一个循环
;**************************************************************************************
;该延时子程序用于控制电机转速若DLY_C减少,则延时时间将减少,则电机转速增加,
;反之亦然.
;**************************************************************************************
DELAYPROCNEAR
PUSHCX;保存CX,因为下面还要用到CX
MOVCX,DLY_C;将DLY_C的值送CX以控制延时的长短
DD1:
NOP;空操作,用于延时,可以用NOP指令的数目控制延时的长短
NOP
NOP
NOP
NOP
NOP
NOP
LOOPDD1;CX减1,若不为0则转向DD1,否则跳出循环
POPCX;恢复CX
RET;子程序返回
DELAYENDP
;**************************************************************************************
;8086延时1S子程序,用执行PUSHF和POPF指令来延时
;之所以选择这两条指令,主要是由于这两条指令执行时间比较长
;**************************************************************************************
DELAY1SPROCNEAR
PUSHF;把标志寄存器的内容保存到堆栈中去
PUSHBX;保存BX
PUSHCX;保存CX
MOVBX,3E8H;将3E8H送BX,用于控制外循环次数
LP2:
MOVCX,0BAH;将0BAH送CX,用于控制内循环次数
LP1:
PUSHF;把标志寄存器的内容保存到堆栈中去
POPF;将保护的FLAG内容恢复,这两条指令主要是用于延时
LOOPLP1;CX减1,不为0则转至LP1处执行
DECBX;BX减1
JNZLP2;不为0则转至LP2处执行
POPCX;恢复CX
POPBX;恢复BX
POPF;将保护的FLAG内容恢复
RET;子程序返回
DELAY1SENDP
CODEENDS
ENDSTART
3、实验的实现
1、连接计算机与实验箱,按电路图将实验箱内部各个芯片和接口连接。
2、然后打开计算机,执行WAVE集成调试软件,设置8086硬件仿真器。
3、新建文件,编写程序,并以.ASM扩展名保存。
4、对程序进行汇编,汇编无误后,单击全速执行,然后查看运行结果。
5、若步进电机运行不正常,则需检查程序的功能是否有误,直至达到期望结果为止。
七、实验设计总结
这是一个综合性实验,也是我做得比较成功的一个微机接口实验之一。
通过做该实验,使我受益匪浅,特别是对用8086CPU去控制步进电机有了进一步的认识,对步进电机的原理也有了比较深的了解。
主要表现在以下几个方面:
1、对控制步进电机(比如正转,反转,停止,加速,减速)有了初步的认识。
步进电机并不像普通的直流电机,交流电机那样在常规下使用,步进电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响。
因此,用8086控制步进电机不能像控制其它电机一样。
以前在杂志上看到,电脑的软驱就是用步进电机带动软盘转动的,我也亲手拆下过里面的步进电机,但是对步进电机的工作原理,以及计算机是怎么控制步进电机的并不了解。
通过做这个综合性实验,我对这些有了一个初步的认识。
2、实验大部分的源代码都是我自己写的,花了大概一个晚上的时间。
在做实验之前多已经把源代码输入计算机并在WAVE上通过软件仿真的形式调试通过。
这样,在正式做实验时我拥有了充足的时间去调试和改进,并在实验时间结束时成功实现了大部分功能。
通过该实验,我认为不管做什么实验都必须提前预习,了解实验的基本原理,这样才能把实验做好。
3、我认为做这个实验最成功的地方就是用步序表去做,从而避免了后面大量冗余重复的代码,从而简化了代码。
但是这样必须用一些比较复杂的指令以及多重循环,增加编程的难度,但使程序更加简洁。
4、通过做这个实验我发,延时子程序延时的长短很难控制。
比如步进电机的加速用到了延时,如果延时时间过短,那么观察时用肉眼很难看到转速在增加,因为加速过程太短了。
因此在编程中我写了好几个备用的延时子程序,其中有一个是前面的跑马灯中复制过来的,还有一个是我《微控制器》(即MC68HC908GP32单片机)中的延时子程序改为8086汇编得到的,只要修改其中的参数应该能控制延时的长短。
看来用软件延时的方法很难实现精确延时。
5、有同学完全复制我的代码却没有观察到应有的现象,取而代之的是电机左右摆动。
我们的第一反应是电机可能坏了,但最终检查的结果却是线接反了。
因此,在做实验时我们应该细心一点,否则一根线接错,或者一个字母输错可能会浪费我们宝贵的时间去检查错误。
6、在做实验前我用WAVE软件仿真功能进行调试,并用观察寄存器的变化情况来推测实验结果。
我认为这一点很重要,因为在以后的工作过程中我们不可能任何项目都用实验板去仿真调试,因此我们必须先用软件仿真成功后才动手去芯片上调试。
这样我们才能节省时间并避免损坏硬件等意外情况。