
摘要: 步进电机是机电控制中一种常用的执行机构,它的用途是将电脉冲转化为角位移,通过控制脉冲个数即可以控制角位移量,从而达到准确定位的目的;同时通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。本设计采用ATS52单片机对步进电机进行控制,通过IO口输出的具有时序的方波作为步进电机的控制信号,信号经过芯片ULN2003驱动步进电机,并用键盘控制步进电机的工作。
关键词:ULN2003 步进电机 单片机
方案论证与比较:
方案一:方案一:单片机通过IO口直接驱动步进电机
通过IO直接连接步进电机各线,单片机发出PWM波控制单片机运行。但是这样步进电机的电流太小,不利于工作!
方案二:通过各种功率放大器驱动步进电机
通过使用不同的放大电路和不同参数的器件,可以达到不同的放大的要求,放大后能够得到较大的功率。但是由于使用的是四相的步进电机,就需要对四路信号分别进行放大,由于放大电路很难做到完全一致,当电机的功率较大时运行起来会不稳定,而且电路的制作也比较复杂。
方案三:通过芯片ULN2003驱动步进电机
ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。 ULN2003工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受 50V的电压,输出还可以在高负载电流并行运行,并且可以放大功率,放大电流。可以直接用单片机的IO口提供信号;而且电路简单,使用比较方便。
二、步进电机控制原理
步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB)。
步进电机区别于其他控制电机的最大特点是,它是通过输入脉冲信号来进行控制的,即电机的总转动角度由输入脉冲数决定,而电机的转速由脉冲信号频率决定。
步进电机的驱动电路根据控制信号工作,控制信号由单片机产生。其基本原理作用如下:
通电换相这一过程称为脉冲分配。例如:三相步进电机的三拍工作 方式,其各相通电顺序为A-B-C-D,通电控制脉冲必须严格按照这 一顺序分别控制A,B,C,D相的通断。
(2)控制步进电机的转向
如果给定工作方式正序换相通电,步进电机正转,如果按反序通电 换相,则电机就反转。
三、电路流程图
本实验电路流程图如下所示:
五、本实验程序框图
六、电路原理图
七、实验总结
在实验过程中搭建电路比较简单,但是在实物实验时遇见了几个问题。通过实验,了解了步进电机的相序问题,只有通过给正确的相线按顺序通以脉冲,电机才会按要求转动。而相序可以通过用直流电源触碰的方式测出,步进电机的公共端可以用万用表测电阻得出。
八、问题
刚开始实验时单片机的引脚采用的是P2.0,P2.2,P2.5,P2.7,即使是正确的相序也不能是步进电机正确的转动。当把引脚改为P0.0~P0.3后,电机运转正常。
九、程序代码
#include #define uint unsigned int #define uchar unsigned char sbit AX=P0^0; sbit BX=P0^1; sbit CX=P0^2; sbit DX=P0^3; sbit k1=P3^4; sbit k2=P3^5; sbit k3=P3^6; sbit k4=P3^7; void delay(int x) { while(x--); } void zhengzhuan(int y) { AX=1;DX=0; delay(500);delay(y); BX=1;AX=0; delay(500);delay(y); CX=1;BX=0; delay(500);delay(y); DX=1;CX=0; delay(500);delay(y); } void fanzhuan() { AX=1;BX=0; delay(500); DX=1;AX=0; delay(500); CX=1;DX=0; delay(500); BX=1;CX=0; delay(500); } void main(void) { uint i,k; int y=10000; while(1) { if(k1==0) { delay(10000); if(k1==0) k=1; } if(k2==0) { delay(10000); if(k2==0) k=2; } if(k3==0) { delay(10000); if(k3==0) k=3; if(k4==0) { delay(10000); if(k4==0) k=4; } switch k { case 1:zhengzhuan();break; case 2:fanzhuan();break; case 3: for(i=0;i<300;i++) { zhengzhuan(); } for(i=0;i<300;i++) {fanzhuan();} };break; case 4: { y=y-100; if(y<=0) y=50000; };break; } } }
