关于ULN2003模块和对应的28BYJ48步进电机,网上现有的资料与教程对于初学者有点不太友好,造成的现象是仅仅只能让步进电机转起来,但是没有对于控制转速和转角的实践分析,本文的所有内容博主都经过了实物及程序的验证和计算,并以最言简意赅的方式记录下来。(测试平台:STC8A8K,STM32F103)
先上实物图:
左边7PIN的排针是连到单片机IO口上的,中间偏下插着短接帽的4PIN排针是供电给模块和步进电机(有时候是单独供电,但是要共地),偏右边白色的5PIN插槽是五线四相步进电机专用接口,最右边的的7PIN排针是控制其他多项电机(低于七项)用的。
ULN2003本质很简单
除了8.9俩电源引脚之外,其他引脚(7*2)都是相互对应的(以上图为例,1~16,2~15以此类推),具体是什么原理呢,咱不用知道那么多,咱只用知道ULN2003内部用的是高耐压、大电流复合晶体管阵列,是让单片机IO口驱动大电流用的(因为咱们用的步进电机内部其实还是线圈,所以用到了ULN2003),多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中,可直接驱动继电器等负载。由于单片机采用的是灌电流驱动方式(这种驱动方式驱动能力强,但是容易烧),因此控制步进电机的IO口0为有效电平,1为无效电平。
步进电机,ULN2003,单片机的前后连接原理图如下:
所有资料都写的是步进电机靠脉冲驱动的,一个脉冲对应转过一个步距角,这句话会有部分理解上的问题的,下面我会一一分析的。
现在给大家区分一个概念,上图中能直接看到的绑个弹簧的那个轴是输出轴,在这个步进电机内部有个真正的步进马达转子,每一个脉冲(或者下文所谓的“拍”)能使这个真正的转子转动5.625°,看下图的数据表格中的减速比是1:64,意思是这个真正的步进马达转子转动64周才能让输出轴转动1周(这个术语叫做步进马达的细分),因此下图的表格中步距角度才写的是5.625°/64,表明的意思是一个脉冲可以让输出轴转动5.625°/64的角度。
脉冲的意思,必须由低电平变高电平,说白了这玩意看上升沿的,持续一段时间然后拉低即可,这段持续的时间直接决定了电机的转速,据说这废物最快14转每分钟。
下面详细说一下通电方式(或者叫励磁方式)
首先,脉冲(或拍)的数量决定转动的角度,单位时间内脉冲(或拍)的数量决定转动的速度
常见的通电方式有:
其中,经过博主的对比试验和资料查找,一相励磁和二相励磁一个脉冲转动两个步距角,一二相励磁一次脉冲只转一个步距角(测试平台STC8A8K,STM32F103)
举个简单例子,这里博主为了朋友们便于理解,没有采用网上的相序表(数组法因接口而异):
单(单相绕组通电)四拍(A-B-C-D-A。。。)
void main() //一相励磁的例程
{
uint16 num;
IN1=IN2=IN3=IN4=1;
for(num=640;num>0;num--) //640个循环,5.625/64步距角*2(一相励磁一拍走2个步距角)*4拍*640次循环=450度
{
IN1=~IN1; //控制A相的IO口非运算后的电平变化产生一个脉冲,第一拍
delay(speed);
IN1=~IN1;
IN2=~IN2; //控制B相的IO口非运算后的电平变化产生一个脉冲,第二拍
delay(speed);
IN2=~IN2;
IN3=~IN3; //控制C相的IO口非运算后的电平变化产生一个脉冲,第三拍
delay(speed);
IN3=~IN3;
IN4=~IN4; //控制D相的IO口非运算后的电平变化产生一个脉冲,第四拍
delay(speed);
IN4=~IN4;
}
IN1=IN2=IN3=IN4=1;
while(1);
}
双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。。。)
void main() //二相励磁的例程
{
uint16 num;
IN1=IN2=IN3=IN4=1;
for(num=640;num>0;num--) //640个循环,5.625/64步距角*2(二相励磁一拍走2个步距角)*4拍*640次循环=450度
{
IN1=~IN1; //控制A相的IO口非运算后的电平变化产生一个脉冲,第一拍
IN2=~IN2; //控制B相的IO口非运算后的电平变化产生一个脉冲,第一拍
delay(speed);
IN1=~IN1;
IN2=~IN2;
IN2=~IN2; //控制B相的IO口非运算后的电平变化产生一个脉冲,第二拍
IN3=~IN3; //控制C相的IO口非运算后的电平变化产生一个脉冲,第二拍
delay(speed);
IN2=~IN2;
IN3=~IN3;
IN3=~IN3; //控制C相的IO口非运算后的电平变化产生一个脉冲,第三拍
IN4=~IN4; //控制D相的IO口非运算后的电平变化产生一个脉冲,第三拍
delay(speed);
IN3=~IN3;
IN4=~IN4;
IN4=~IN4; //控制D相的IO口非运算后的电平变化产生一个脉冲,第四拍
IN1=~IN1; //控制A相的IO口非运算后的电平变化产生一个脉冲,第四拍
delay(speed);
IN4=~IN4;
IN1=~IN1;
}
IN1=IN2=IN3=IN4=1;
while(1);
}
八拍(A-AB-B-BC-C-CD-D-DA-A。。。)
void main() //一二相励磁的例程
{
uint16 num;
IN1=IN2=IN3=IN4=1;
for(num=640;num>0;num--) //640个循环,5.625/64步距角*1(一二相励磁一拍走1个步距角)*8拍*640次循环=450度
{
IN1=~IN1; //控制A相的IO口非运算后的电平变化产生一个脉冲,第一拍
delay(speed);
IN1=~IN1;
IN1=~IN1; //控制A相的IO口非运算后的电平变化产生一个脉冲,第二拍
IN2=~IN2; //控制B相的IO口非运算后的电平变化产生一个脉冲,第二拍
delay(speed);
IN1=~IN1;
IN2=~IN2;
IN2=~IN2; //控制B相的IO口非运算后的电平变化产生一个脉冲,第三拍
delay(speed);
IN2=~IN2;
IN2=~IN2; //控制B相的IO口非运算后的电平变化产生一个脉冲,第四拍
IN3=~IN3; //控制C相的IO口非运算后的电平变化产生一个脉冲,第四拍
delay(speed);
IN2=~IN2;
IN3=~IN3;
IN3=~IN3; //控制C相的IO口非运算后的电平变化产生一个脉冲,第五拍
delay(speed);
IN3=~IN3;
IN3=~IN3; //控制C相的IO口非运算后的电平变化产生一个脉冲,第六拍
IN4=~IN4; //控制D相的IO口非运算后的电平变化产生一个脉冲,第六拍
delay(speed);
IN3=~IN3;
IN4=~IN4;
IN4=~IN4; //控制D相的IO口非运算后的电平变化产生一个脉冲,第七拍
delay(speed);
IN4=~IN4;
IN4=~IN4; //控制D相的IO口非运算后的电平变化产生一个脉冲,第八拍
IN1=~IN1; //控制A相的IO口非运算后的电平变化产生一个脉冲,第八拍
delay(speed);
IN4=~IN4;
IN1=~IN1;
}
IN4=IN1=IN2=IN3=1;
while(1);
}
关于控制线的脉冲有严格顺序,通脉冲的顺序影响转向(顺向逆向),负载能力,电机发热程度等。
这里博主给出了使用手册上的标准脉冲流程,如果想反转的话只用颠倒给脉冲的顺序即可,但是不要打乱顺序,否则也可能会转但是会造成各种问题。