28BYJ-48步进电机
将脉冲信号转变为角度信号
1. 反应式步进电机:结构简单成本低,发热大可靠性低。
2. 永磁式步进电机:动态性能好、力矩较大,误差相对大一些,价格低,广泛用在消费性产品。
3. 混合式步进电机:力矩大、动态性能好、步距角小、精度高,但是结构复杂价格高,广泛用在工业。
28——步进电机的有效最大外径是28毫米
B——表示是步进电机
Y——表示是永磁式
J——表示是减速型
48——表示四相八拍
A、B、C、D 为四相,八个定子
内部转子上含有永磁铁(0-5)
8个节拍转一个定子角度,则转一圈需要64个节拍
步进角度为:360 / 32 = 11.25度
每次开关只合上一个,即为单四拍模式
由启动频率知道,我们相邻两个低电平的导通时间要小于启动频率,即 1/550=1.8ms,即导通时间间隔大于1。8ms即可。
代码中: 参数(angle)中总共需要转动的角度,beats 为总共转动的节拍数,因为减速比是1:64,所以转一圈节拍数为 64*64=4096个节拍,那么总共的节拍数为:(angle / 360) * 4096
void TrunMotor(unsigned long angle)
{
unsigned char tmp;
unsigned char index = 0;
unsigned long beats = 0;
unsigned char code BeatCode[8] = {
0x0E, 0x0C, 0x0D, 0x09, 0x0B, 0x03, 0x07, 0x06};
beats = (angle*4076)/360;
while(beats--)
{
tmp = P1;
tmp = tmp & 0xF0;
tmp = tmp | BeatCode[index];
P1 = tmp;
index++;
index = index & 0x07;
delay();
}
}
使用定时器中断的控制函数:
void main()
{
EA = 1;
TMOD = 0x01;
TH0 = 0xF8;//定时2ms
TL0 = 0xCD;
ET0 = 1;
TR0 =1;
StartMotor(360*2 + 180);
while(1);
}
void StartMotor(unsigned long angle)
{
/*
处理long型的数据,为消除中断对程序的影响,在处理之前 应该先关掉中断
*/
EA = 0;
beats = (angle*4076)/360;
EA = 1;
}
void InterruptTimer0() interrupt 1
{
unsigned char tmp;
static unsigned char index = 0;//次变量需要进出中断处理,应定义成静态的
unsigned char code BeatCode[8] = {
0x0E, 0x0C, 0x0D, 0x09, 0x0B, 0x03, 0x07, 0x06};
TH0 = 0xF8;//重新赋值
TL0 = 0xCD;
if(beats != 0)
{
tmp = P1;
tmp = tmp & 0xF0;
tmp = tmp | BeatCode[index];
P1 = tmp;
index++;
index = index & 0x07;
beats--;
}
else
{
P1 = P1 | 0x0F;//当节拍数没了之后,对P1口进行赋值以使电机停止转动
}
}