5线4相步进电机
通过使不同的线圈导通,产生磁极,来控制中间转子运动.
细分驱动
通过控制输入电流的大小,让转动的偏移角度随电流大小而变化(有专门的驱动器让旋转角度细分)
28BYJ-48步进电机
如果想让28BY48旋转一圈,需要360/5.625*64 = 64*64 = 4096个脉冲
#ifndef BJ_H
#define BJ_H
#include "reg52.h"
void step_motor_set(u8 direction);
#endif
#include "bj.h"
sbit IN_D = P1^0;
sbit IN_C = P1^1;
sbit IN_B = P1^2;
sbit IN_A = P1^3;
void step_motor_set(u8 direction)
{
static u8 step = 0;
if(direction == 0)
{
step = 7 - step;
}
switch(step)
{
case 0:
IN_A = 1;
IN_B = 1;
IN_C = 1;
IN_D = 0;
break;
case 1:
IN_A = 1;
IN_B = 1;
IN_C = 0;
IN_D = 0;
break;
case 2:
IN_A = 1;
IN_B = 1;
IN_C = 0;
IN_D = 1;
break;
case 3:
IN_A = 1;
IN_B = 0;
IN_C = 0;
IN_D = 1;
break;
case 4:
IN_A = 1;
IN_B = 0;
IN_C = 1;
IN_D = 1;
break;
case 5:
IN_A = 0;
IN_B = 0;
IN_C = 1;
IN_D = 1;
break;
case 6:
IN_A = 0;
IN_B = 1;
IN_C = 1;
IN_D = 1;
break;
case 7:
IN_A = 0;
IN_B = 1;
IN_C = 1;
IN_D = 0;
break;
}
step++;
if(step >= 8)
{
step = 0;
}
}
void Timer0() interrupt 1
{
static u16 j;
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
i++;
j++;
if(j >= 7)
{
step_motor_set(1);
j = 0;
}
}
直接找了个定时器中断例程,把步进电机处理函数丢到终端中(实际项目不能这么做这里仅测试),我买的28BY48步进电机是12V,而普中开发板的接口是5V,转起来贼慢.可能和电压有关,有点带不起来.
以下为我找到的驱动步进电机的方法,使用PWM来进行控制,相比上面的方法,PWM驱动的时候电机走的更加顺滑。
步进电机的好处是,你可以省掉用于测量电机转角的传感器。因此在结构上和价格上有一定的优势。而且它的位置和速度控制相对简单。其缺点是,第一,与同等功率的电机相比载荷比较小,没有角度传感器的情况下不能输出大力矩。第二,功耗相对较大,要么全开,要么全关。所以要么接近满功耗,要么就不能出力。
因此步进电机一般只用于载荷较小而且十分确定、位置精度要求并不非常高,对体积敏感或在较低价格想要做到较高可靠性的场合。最常见的就是光驱、扫描仪、复印机等等。当然,它和舵机一样,也受到没有能力自行搭建伺服电机系统的业余爱好者的喜爱,在一些业余项目上面用于替代完整的伺服电机系统。
步进电机驱动并不是PWM控制的,而是每个时间片给8个步骤依次供电。如果想细分驱动,必须用到专用的驱动IC,通过输入不同的PWM可以控制电路中电流的大小。