1 步进电机原理
1.1 步进电机简介
步进电机是将输入的电脉冲信号转换为角位移或线位移的元件。在不超负载运作的情况下,电机的转速以及停止的位置只取决于脉冲的个数和脉冲的频率。脉冲数越多,电机的角位移越大,脉冲频率越高,电机的转速越快,但不能超过最高频率,否则力矩减小,电机不转。
1.2 电机拆解内部结构
左图为定子,电机转动过程中,定子是不动的,故称为定子。可以看到定子中包含了十二个线圈。关于圆心对称的一对线圈称为一个相。图中定子为6相。
右图为转子,步进电机的转子上布满了沿轴向的齿,图中细密的红色的条线的即为转子的齿
1.3 步进电机工作原理
(以三相步进电机为例)
当某一相定子通电励磁后,它将吸引转子转动,直至与通电的线圈最接近的那一对转子上的齿(示意图中绿色突出部分即为转子的齿)与之对齐,此时步进电机停止转动。其内部结构示意与转动过程如下:
1、这种工作方式称为三相单三拍。三相指的是电机定子有三个相;单指的是一次只给一个相通电;而三拍指的是每一轮循环要通电三次。
2、·除了三相单三拍的工作方式,对于三相步进电机,还有三相双三拍和三相六拍工作方式。
三相双三拍是两相绕组同时通电即AB->BC->CA。而三相六拍是A->AB->B->BC->C->CA。
·可以看出电机的转速和通电相切换的频率有关,切换的越快,电机转速也越快。电机转动的方向与相序有关,当以A->B->C相序通电时,转子逆时针转动,当以A->C->B相序通电时,转子顺时针转动。
3、·电机每拍转动的角度(称为步距角)可以由以下公式描述
其中m为定子绕组的相数,;z为转子的齿数,k描述通电方式,m相m拍时取k=1,m相2m拍时取k=2。
上面的例子中可以由m=3,z=4,k=1求得角度为30°,即每通一次电,电机转动30°
2 步进电机Proteus仿真
2.1 步进电机仿真模型
搜索motor,找到MOTOR-STEPPER,找到一个六线四相制的步进电机。各引脚说明见图,中间两线为电源Vcc。ABCD相标注如图
2.2 步进电机驱动电路设计
单片机IO口驱动能力十分有限,无法直接驱动步进电机,需要设计驱动电路,单片机仅作控制用。这里使用到ULN2003芯片
芯片的8号引脚接GND,9号引脚接VCC。当某一路B输入高电平时,对应输出端C输出低电平。此时连接到该引脚上的步进电机对应的相在外接的Vcc和芯片输出端的低电平作用下通电,励磁。因此要给步进电机某一相通电,就是给该相对应的芯片的输入端高电平。
电机是感性负载,当ULN2003A芯片驱动感性元件时,在断电的瞬间,由于电感的特点,会产生瞬时的大电流,而内部二极管起到续流的作用,能较好保护元件。
这个芯片还可以用于有源蜂鸣器的扩展,只要将蜂鸣器的Vcc端通过限流电阻接Vcc,另一端接到芯片的输出某一路引脚,当对应IO口输出高电平时,蜂鸣器通电,开始按固定频率发声
2.3 接口芯片与步进电机的连接
2.4 四相步进电机工作方式
四相步进电机有单四拍(A-B-C-D)和双四拍(AB-BC-CD-DA)和八拍(A-AB-B-BC-C-CD-D-DA)这三种工作方式。第一种工作方式扭矩小,功耗小,但震动大。第二种工作方式扭矩较大,功耗也大,震动小。第三种工作方式步距角小,输出更平滑,推荐采用这种方式
只需要控制单片机的IO口使得ULN2003芯片按A-AB-B-BC-C-CD-D-DA的次序输出低电平即可完成步进电机转动的一轮循环。如果要按相反方向转动,只要把上面A-AB-B-BC-C-CD-D-DA的次序反过来即可。
至于给A、B、C、D相通电需要分别使哪个IO口输出高电平,与步进电机ABCD相和ULN2003以及IO口的连接有关系。参见2.1中标注的步进电机的abcd相
3 仿真参考程序
1.使电机连续逆时针转动
#include "reg52.h"
#define GPIO_MOTOR P1
unsigned char code Clockwise[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //顺时针A-AB-B-BC-C-CD-D-DA
unsigned char code Anticlockwise[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //逆时针转动顺序
void Delay(unsigned int t)
{
unsigned int k;
while(t--)
{
for(k=0; k<80; k++)
;
}
}
void Motor() //逆时针转动8拍
{
unsigned char i;
for(i=0;i<8;i++)
{
GPIO_MOTOR&=0xf0; //低四位清零
GPIO_MOTOR|=Anticlockwise[i]; //置位低四位的相应位
Delay(2); //改变参数可以调节转速
//如果要使步进电机停止转动,则使用GPIO_MOTOR&=0xf0;
}
}
void main(void)
{
while(1)
{
Motor();
}
}
2.使电机顺时针转动/逆时针转动180°后停下的函数
//以下函数在主函数中只需调用一次即可转动180°
void Anticlockwise180() //逆时针转动180°
{
unsigned char i,j;
for(j=0;j<79;j++) //79这个数字与电机参数有关,需要在仿真实验中不断调整从而确定
{
for(i=0;i<8;i++)
{
GPIO_MOTOR&=0xf0; //低四位清零
GPIO_MOTOR|=Anticlockwise[i]; //置位低四位的相应位
Delay(3); //调节转速
}
}
GPIO_MOTOR&=0xf0; //低四位清零,停止转动
}
void Clockwise180() //顺时针转动180°
{
unsigned char i,j;
for(j=0;j<79;j++) //79这个数字与电机参数有关,需要在仿真实验中不断调整从而确定
{
for(i=0;i<8;i++)
{
GPIO_MOTOR&=0xf0; //低四位清零
GPIO_MOTOR|=Clockwise[i]; //置位低四位的相应位
Delay(3); //调节转速
}
}
GPIO_MOTOR&=0xf0; //低四位清零,停止转动
}
4 仿真原理图
5 硬件实现
5.1 28BYJ48步进电机
28BYJ48是很常见的一种四相步进电机,与仿真模型中不同的是它是五线制,也就是只有一根线需要接到电源Vcc。
对于28BYJ-48。COM端(公共端)为红线,接Vcc,橙黄粉蓝依次为ABCD相。根据产品手册可以查到步距角为5.625°/64,这个步距角是在一二相单极驱动(即八拍工作方式)下得出的。这里的/64意味着电机内部集成的减速齿轮的减速比为1/64。下面是内部拆解结构,可以看到里面是包含了减速齿轮的。
5.2 电机的驱动
有了步距角参数,我们就可以计算出要使步进电机转动180°,所需要的拍数。每拍转动(5.625/64)°,在八拍工作方式下,一轮循环下来就转动了(5.625°/8)°,要使电机转动180°就是要进行180/((5.625°/8))=256轮的8拍循环。256恰好是无符号8位数据所能容纳的数据数(0-255共256)。这也是这个电机设计的巧妙之处。
程序与上面的是类似的,改个参数即可,以逆时针转动为例,给出程序:
void Anticlockwise180() //逆时针转动180°
{
unsigned char i,j;
for(j=0;j<255;j++) //改成255
{
for(i=0;i<8;i++)
{
GPIO_MOTOR&=0xf0; //低四位清零
GPIO_MOTOR|=Anticlockwise[i]; //置位低四位的相应位
Delay(3); //调节转速
}
}
GPIO_MOTOR&=0xf0; //低四位清零,停止转动
}
由于步进电机制造时存在误差,实际结果与180°可能有少量误差。并且如果负载较重,步进电机会出现丢步情况,使用前应该根据负载选择合适的步进电机。