四相八拍,也叫半步:AB—B—BC—C—CD—D—DA—A,再次从头循环。
四相:指步进电机中有四组线圈。
八拍:指的是四组线圈的通电时序。
步进电机:就是将电脉冲信号转变为角
位移或者线位移的开环控制电机(即无反馈)。
四线双极性步进电机
通常直接使用高低电平的方式直接驱动,常见的控制方式是四拍(整步)、八拍(半步)。
为了减弱或消除步进电机的低频振动开发了细分驱动技术。细分后电机运行时的实际步距角是基本步距角的几分之一,微步即1/4-step、1/8-step、1/16-step等
比如,两相步进电机的基本步距角是1.8°,即一个脉冲走1.8°,如果没有细分,则是200个脉冲走一圈360°。细分是通过驱动器靠精确控制电机的相电流所产生的,如果是10细分,则发一个脉冲电机走0.18°,即2000个脉冲走一圈360°,电机的精度能否达到或接近0.18°,还取决于细分驱动器的细分电流控制精度等其它因素。
四拍、八拍可使用ULN2003进行简易驱动控制,上电时序如下。
如果要使用更多级的微步控制就需要使用专门的驱动芯片,如TI的DRV8889A-Q1 。
我们这里是八拍,所以直接使用GPIO控制
8拍线圈上电时序表如下:
电极 1 2 3 4 5 6 7 8
A+ 1 1 0 0 0 0 0 1
A- 0 0 0 1 1 1 0 0
B+ 0 1 1 1 0 0 0 0
B- 0 0 0 0 0 1 1 1
电机转动方向如下所示,再次从头循环
A—AB—B–BC—C—CD—D—DA
反转时,控制时序倒过来控制就可实现反向转动。
实用简单的C代码,描述一个四相八拍电机的驱动:
//一个电机需要4个GPIO控制,下面是4组宏,控制其
#define STEP_1_H P11 = 1 //?电平
#define STEP_1_L P11 = 0 //低电平
#define STEP_2_H P12 = 1
#define STEP_2_L P12 = 0
#define STEP_3_H P13 = 1
#define STEP_3_L P13 = 0
#define STEP_4_H P14 = 1
#define STEP_4_L P14 = 0
uint8 motor_state = 0; //步进电机的状态
uint8 rotate_speed = 0;
uint16 motor_cnt = 0; //计数
void Step_Motor_Driver(void)
{
if (++ motor_cnt >= rotate_speed)
{
motor_cnt = 0;
switch (motor_state)
{
case 0:
STEP_1_L;
STEP_2_L;
STEP_3_L;
STEP_4_L;
break;
case 1: //对应 A STEP_1_H;
STEP_2_L;
STEP_3_L;
STEP_4_L;
motor_state = 2;
break;
case 2: //对应 AB STEP_1_H;
STEP_2_H;
motor_state = 3;
break;
case 3: //对应 B STEP_1_L;
STEP_2_H;
STEP_3_L;
STEP_4_L;
motor_state = 4;
break;
case 4: //对应 BC STEP_1_L;
STEP_2_H;
STEP_3_H;
STEP_4_L;
motor_state = 5;
break;
case 5: //对应 C STEP_1_L;
STEP_2_L;
STEP_3_H;
STEP_4_L;
motor_state = 6;
break;
case 6: //对应 CD STEP_1_L;
STEP_2_L;
STEP_3_H;
STEP_4_H;
motor_state = 7;
break;
case 7: //对应 D STEP_1_L;
STEP_4_H;
motor_state = 8;
break;
case 8: //对应 DA STEP_1_H;
STEP_2_L;
STEP_3_L;
STEP_4_H;
motor_state = 1;
break;
default:
break;
}
}
}
Step_Motor_Driver函数调用频率,应该小于电气规格书上的牵入频率,否则可能会导致电机失步。实际使用中,如果是简单的MCU环境,可以用延时函数替代,如果还是linux环境,则使用硬件定时器比较好。
TODO: