一、什么是步进电机
步进电机需要按照一定的时序进行通电,才能够进行转动。我使用的是4线步进电机,需要接4个IO口,两两一组。步进电机有一个固定的步距角,和步进电机本身有关。步进电机一般情况下只能以固有步距角的整数倍来运动,一个固有步进角的移动就叫做一个节拍。电机还有可以比固有步进角更小的运动方法,这种方法叫细分,由电机驱动器来支持。相数越多步进电机越精确,也就是绕阻的个数。我们使用的是2相的步进电机。
步进电机的极性:单极性,双极性。
二、步进电机的时序
拍数:单相四拍:驱动时序:正转:A/ B A B/ 反转:B/ A B A/
双相四拍:驱动时序:正转:A/B AB AB/ A/B/ 反转:A/B/ AB/ AB A/B
半步八拍:驱动时序:正转:A/ A/B B AB A AB/ B/ A/B/
反转:A/B/ B/ AB/ A AB B A/B A/
一些说明:对单相4拍 正转解释 A/ 意思就是A/这头给一个正电 A给一个负电
B就是 给B一个正电 B/给一个负电,下面做一个表格更直观的看一下:这里的0和1就是给正点或者负电的意思。其他的和这个类似
A | A/ | B | B/ | |
0 | 1 | 0 | 0 | 第一拍 |
0 | 0 | 1 | 0 | 第二拍 |
1 | 0 | 0 | 0 | 第三拍 |
0 | 0 | 0 | 1 | 第四拍 |
A | A/ | B | B/ | |
0 | 1 | 1 | 0 | 第一拍 |
1 | 0 | 1 | 0 | 第二拍 |
1 | 0 | 0 | 1 | 第三拍 |
0 | 1 | 0 | 1 | 第四拍 |
A | A/ | B | B/ | |
0 | 1 | 0 | 0 | 第一拍 |
0 | 1 | 1 | 0 | 第二拍 |
0 | 0 | 1 | 0 | 第三拍 |
1 | 0 | 1 | 0 | 第四拍 |
1 | 0 | 0 | 0 | 第五拍 |
1 | 0 | 0 | 1 | 第六拍 |
0 | 0 | 0 | 1 | 第七拍 |
0 | 1 | 0 | 1 | 第八拍 |
三、步进电机的接线和编程
A接OUTA A/接OUTB B接OUTC B/接OUTD
INA INB INC IND这边直接连接单片机的IO就可以了。必须使用驱动芯片来进行驱动,因为单片机IO口的电流太小了达不到电机的驱动电流。需要注意的是:INA INB 是一组INC IND是一组,一定要注意他们之间的对应关系。下面这个例子是用单相四拍正转的时序进行控制。其他的只需要改变给的电平的不同就可以实现
sbit APositive = P0^0;
sbit ANegative = P0^1;
sbit BPositive = P0^2;
sbit BNegative = P0^3;
void delay1ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void main(void)
{
while(1)
{
//第一拍
APositive = 0;
ANegative = 1;
BPositive = 0;
BNegative = 0;
delay1ms(); //一定要有这个延时,
//主要是让上面给的电流持续一段时间,不然极性变换太快
//改变延时的长短可以改变电机转动的速度
//第二拍
APositive = 0;
ANegative = 0;
BPositive = 1;
BNegative = 0;
delay1ms();
//第三拍
APositive = 1;
ANegative = 0;
BPositive = 0;
BNegative = 0;
delay1ms();
//第四拍
APositive = 0;
ANegative = 0;
BPositive = 0;
BNegative = 1;
delay1ms();
}
}
下面再举例子半步八拍正转的编程
sbit APositive = P0^0;
sbit ANegative = P0^1;
sbit BPositive = P0^2;
sbit BNegative = P0^3;
void delay1ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void main(void)
{
while(1)
{
//第一拍
APositive = 0;
ANegative = 1;
BPositive = 0;
BNegative = 0;
delay1ms(); //一定要有这个延时,
//主要是让上面给的电流持续一段时间,不然极性变换太快
//改变延时的长短可以改变电机转动的速度
//第二拍
APositive = 0;
ANegative = 1;
BPositive = 1;
BNegative = 0;
delay1ms();
//第三拍
APositive = 0;
ANegative = 0;
BPositive = 1;
BNegative = 0;
delay1ms();
//第四拍
APositive = 1;
ANegative = 1;
BPositive = 0;
BNegative = 0;
delay1ms();
//第五拍
APositive = 1;
ANegative = 0;
BPositive = 0;
BNegative = 0;
delay1ms();
//第六拍
APositive = 1;
ANegative = 0;
BPositive = 0;
BNegative = 1;
delay1ms();
//第七拍
APositive = 0;
ANegative = 0;
BPositive = 0;
BNegative = 1;
delay1ms();
//第八拍
APositive = 0;
ANegative = 1;
BPositive = 0;
BNegative = 1;
delay1ms();
}
}