1.背景
收拾东西发现一个步进电机(应该是之前从摄像头拆下来的,42步进电机),驱动一下试试。简单记录一下,内容比较简单,欢迎大家指正。
2.硬件
都是用手边有的材料:
控制板用ART-Pi;
驱动板L298N模块;
电源DC12V;
3.原理
3.1 什么是步进电机
步进电机是将电脉冲信号,转变为角位移或线位移的开环控制电机,又称为脉冲电机。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响。当步进驱动器接收到一个脉冲信号时,它就可以驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”。
步进电机的旋转是以固定的角度一步一步运行的,可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的,同时可以通过控制脉冲频率,来控制电机转动的速度和加速度,从而达到调速的目的。(网上摘录)
3.2 步进电机驱动方式
1)4拍,整步控制,就是依据电机固有结构设计固定的步距角工作,一个电脉冲,步进电机前进一个步距角;
2)8拍,半步控制,是以电机固有的结构决定的步距角的一半角度进行步进旋转;
3)微步,细分控制,步距角更小,就是1/4步、1/8步、1/16步、1/32步,可以到很高的细分(最高应该是1/256步),对应的步进角度就是在整步步距角乘以微步系数。微步控制就要用到驱动芯片了,比如TI的DRV8889A。
3.3 L298N模块
L298N常用的双H桥电机驱动模块,都应该比较熟悉了不再过多介绍。
4.硬件连接
1)步进电机2相4线,直接接L298N模块的OUT1~OUT4,ENA、ENB跳线帽,电源DC12V;
OUT1—->A+
OUT2—->A-
OUT3—->B+
OUT4—->B-
2)L298N接ART-Pi
IN1—->PH7
IN2—->PH8
IN3—->PH9
IN4—->PH10
5.程序代码
这里采用8拍控制方式,简单驱动电机转动,实现任意角度的正反转控制。
5.1 正转控制(顺时针)
void turn_angle_forward(float_t angle)
{
rt_uint16_t half_beat_num = 0;//角度转换半拍总数
rt_uint16_t half_beat_count = 0;//半拍计数
rt_uint8_t beat_now = 0;//当前节拍
//半拍步进值360°/50/8 = 0.9°
half_beat_num = (angle * 10) / 9;
while(1)
{
switch (beat_now)
{
case 0://1000
rt_pin_write(IN1_PIN, PIN_HIGH);
rt_pin_write(IN2_PIN, PIN_LOW);
rt_pin_write(IN3_PIN, PIN_LOW);
rt_pin_write(IN4_PIN, PIN_LOW);
beat_now = 1;
break;
case 1: //1010
rt_pin_write(IN1_PIN, PIN_HIGH);
rt_pin_write(IN2_PIN, PIN_LOW);
rt_pin_write(IN3_PIN, PIN_HIGH);
rt_pin_write(IN4_PIN, PIN_LOW);
beat_now = 2;
break;
case 2://0010
rt_pin_write(IN1_PIN, PIN_LOW);
rt_pin_write(IN2_PIN, PIN_LOW);
rt_pin_write(IN3_PIN, PIN_HIGH);
rt_pin_write(IN4_PIN, PIN_LOW);
beat_now = 3;
break;
case 3://0110
rt_pin_write(IN1_PIN, PIN_LOW);
rt_pin_write(IN2_PIN, PIN_HIGH);
rt_pin_write(IN3_PIN, PIN_HIGH);
rt_pin_write(IN4_PIN, PIN_LOW);
beat_now = 4;
break;
case 4://0100
rt_pin_write(IN1_PIN, PIN_LOW);
rt_pin_write(IN2_PIN, PIN_HIGH);
rt_pin_write(IN3_PIN, PIN_LOW);
rt_pin_write(IN4_PIN, PIN_LOW);
beat_now = 5;
break;
case 5://0101
rt_pin_write(IN1_PIN, PIN_LOW);
rt_pin_write(IN2_PIN, PIN_HIGH);
rt_pin_write(IN3_PIN, PIN_LOW);
rt_pin_write(IN4_PIN, PIN_HIGH);
beat_now = 6;
break;
case 6://0001
rt_pin_write(IN1_PIN, PIN_LOW);
rt_pin_write(IN2_PIN, PIN_LOW);
rt_pin_write(IN3_PIN, PIN_LOW);
rt_pin_write(IN4_PIN, PIN_HIGH);
beat_now = 7;
break;
case 7://1001
rt_pin_write(IN1_PIN, PIN_HIGH);
rt_pin_write(IN2_PIN, PIN_LOW);
rt_pin_write(IN3_PIN, PIN_LOW);
rt_pin_write(IN4_PIN, PIN_HIGH);
beat_now = 0;
break;
default:
beat_now = 0;
break;
}
DELAY;
half_beat_count++;
if(angle > 0)
{
if(half_beat_count > half_beat_num)
break;
}
}
turn_stop();
}
5.2 反转控制(逆时针)
反正控制时序,形象点从硬件上来说,把A相和B相调换,对应程序的话就是调整一下控制时序。
void turn_angle_reverse(float_t angle)
{
rt_uint16_t half_beat_num = 0;//角度转换半拍总数
rt_uint16_t half_beat_count = 0;//半拍计数
rt_uint8_t beat_now = 0;//当前节拍
//半拍步进值360°/50/8 = 0.9°
half_beat_num = (angle * 10) / 9;
while(1)
{
switch (beat_now)
{
case 0://0010
rt_pin_write(IN1_PIN, PIN_LOW);
rt_pin_write(IN2_PIN, PIN_LOW);
rt_pin_write(IN3_PIN, PIN_HIGH);
rt_pin_write(IN4_PIN, PIN_LOW);
beat_now = 1;
break;
case 1://1010
rt_pin_write(IN1_PIN, PIN_HIGH);
rt_pin_write(IN2_PIN, PIN_LOW);
rt_pin_write(IN3_PIN, PIN_HIGH);
rt_pin_write(IN4_PIN, PIN_LOW);
beat_now = 2;
break;
case 2://1000
rt_pin_write(IN1_PIN, PIN_HIGH);
rt_pin_write(IN2_PIN, PIN_LOW);
rt_pin_write(IN3_PIN, PIN_LOW);
rt_pin_write(IN4_PIN, PIN_LOW);
beat_now = 3;
break;
case 3://1001
rt_pin_write(IN1_PIN, PIN_HIGH);
rt_pin_write(IN2_PIN, PIN_LOW);
rt_pin_write(IN3_PIN, PIN_LOW);
rt_pin_write(IN4_PIN, PIN_HIGH);
beat_now = 4;
break;
case 4://0001
rt_pin_write(IN1_PIN, PIN_LOW);
rt_pin_write(IN2_PIN, PIN_LOW);
rt_pin_write(IN3_PIN, PIN_LOW);
rt_pin_write(IN4_PIN, PIN_HIGH);
beat_now = 5;
break;
case 5://0101
rt_pin_write(IN1_PIN, PIN_LOW);
rt_pin_write(IN2_PIN, PIN_HIGH);
rt_pin_write(IN3_PIN, PIN_LOW);
rt_pin_write(IN4_PIN, PIN_HIGH);
beat_now = 6;
break;
case 6://0100
rt_pin_write(IN1_PIN, PIN_LOW);
rt_pin_write(IN2_PIN, PIN_HIGH);
rt_pin_write(IN3_PIN, PIN_LOW);
rt_pin_write(IN4_PIN, PIN_LOW);
beat_now = 7;
break;
case 7://0110
rt_pin_write(IN1_PIN, PIN_LOW);
rt_pin_write(IN2_PIN, PIN_HIGH);
rt_pin_write(IN3_PIN, PIN_HIGH);
rt_pin_write(IN4_PIN, PIN_LOW);
beat_now = 0;
break;
default:
beat_now = 0;
break;
}
DELAY;
half_beat_count++;
if(angle > 0)
{
if(half_beat_count > half_beat_num)
break;
}
}
turn_stop();
}
5.3 停止
void turn_stop(void)
{
rt_pin_write(IN1_PIN, PIN_LOW);
rt_pin_write(IN2_PIN, PIN_LOW);
rt_pin_write(IN3_PIN, PIN_LOW);
rt_pin_write(IN4_PIN, PIN_LOW);
5.4 转动效果
正转360°,反转360°
6.总结
简单写了段程序驱动一下步进电机,实现了步进电机的8拍控制,可以任意角度正反转。调速可以通过修改脉冲频率,也就是代码中的DELAY,但是由于步进电机特性限制,速度不能太快,否则会驱动不起来;太慢长时间运转会发热严重。