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,但是由于步進電機特性限制,速度不能太快,否則會驅動不起來;太慢長時間運轉會發熱嚴重。
-
電機驅動
+關注
關注
60文章
1286瀏覽量
87420 -
步進電機
+關注
關注
152文章
3147瀏覽量
148892 -
正反轉控制
+關注
關注
3文章
33瀏覽量
11196 -
脈沖信號
+關注
關注
6文章
402瀏覽量
37422 -
L298N
+關注
關注
21文章
224瀏覽量
79286
發布評論請先 登錄
步進電機的硬件電路設計,步進電機驅動原理及方法
步進電機驅動基礎

評論