1.背景
收拾東西發(fā)現(xiàn)一個(gè)步進(jìn)電機(jī)(應(yīng)該是之前從攝像頭拆下來(lái)的,42步進(jìn)電機(jī)),驅(qū)動(dòng)一下試試。簡(jiǎn)單記錄一下,內(nèi)容比較簡(jiǎn)單,歡迎大家指正。
2.硬件
都是用手邊有的材料:
控制板用ART-Pi;
驅(qū)動(dòng)板L298N模塊;
電源DC12V;
3.原理
3.1 什么是步進(jìn)電機(jī)
步進(jìn)電機(jī)是將電脈沖信號(hào),轉(zhuǎn)變?yōu)榻俏灰苹蚓€位移的開(kāi)環(huán)控制電機(jī),又稱(chēng)為脈沖電機(jī)。在非超載的情況下,電機(jī)的轉(zhuǎn)速、停止的位置只取決于脈沖信號(hào)的頻率和脈沖數(shù),而不受負(fù)載變化的影響。當(dāng)步進(jìn)驅(qū)動(dòng)器接收到一個(gè)脈沖信號(hào)時(shí),它就可以驅(qū)動(dòng)步進(jìn)電機(jī)按設(shè)定的方向轉(zhuǎn)動(dòng)一個(gè)固定的角度,稱(chēng)為“步距角”。
步進(jìn)電機(jī)的旋轉(zhuǎn)是以固定的角度一步一步運(yùn)行的,可以通過(guò)控制脈沖個(gè)數(shù)來(lái)控制角位移量,從而達(dá)到準(zhǔn)確定位的目的,同時(shí)可以通過(guò)控制脈沖頻率,來(lái)控制電機(jī)轉(zhuǎn)動(dòng)的速度和加速度,從而達(dá)到調(diào)速的目的。(網(wǎng)上摘錄)
3.2 步進(jìn)電機(jī)驅(qū)動(dòng)方式
1)4拍,整步控制,就是依據(jù)電機(jī)固有結(jié)構(gòu)設(shè)計(jì)固定的步距角工作,一個(gè)電脈沖,步進(jìn)電機(jī)前進(jìn)一個(gè)步距角;
2)8拍,半步控制,是以電機(jī)固有的結(jié)構(gòu)決定的步距角的一半角度進(jìn)行步進(jìn)旋轉(zhuǎn);
3)微步,細(xì)分控制,步距角更小,就是1/4步、1/8步、1/16步、1/32步,可以到很高的細(xì)分(最高應(yīng)該是1/256步),對(duì)應(yīng)的步進(jìn)角度就是在整步步距角乘以微步系數(shù)。微步控制就要用到驅(qū)動(dòng)芯片了,比如TI的DRV8889A。
3.3 L298N模塊
L298N常用的雙H橋電機(jī)驅(qū)動(dòng)模塊,都應(yīng)該比較熟悉了不再過(guò)多介紹。
4.硬件連接
1)步進(jìn)電機(jī)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拍控制方式,簡(jiǎn)單驅(qū)動(dòng)電機(jī)轉(zhuǎn)動(dòng),實(shí)現(xiàn)任意角度的正反轉(zhuǎn)控制。
5.1 正轉(zhuǎn)控制(順時(shí)針)
void turn_angle_forward(float_t angle)
{
rt_uint16_t half_beat_num = 0;//角度轉(zhuǎn)換半拍總數(shù)
rt_uint16_t half_beat_count = 0;//半拍計(jì)數(shù)
rt_uint8_t beat_now = 0;//當(dāng)前節(jié)拍
//半拍步進(jìn)值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 反轉(zhuǎn)控制(逆時(shí)針)
反正控制時(shí)序,形象點(diǎn)從硬件上來(lái)說(shuō),把A相和B相調(diào)換,對(duì)應(yīng)程序的話就是調(diào)整一下控制時(shí)序。
void turn_angle_reverse(float_t angle)
{
rt_uint16_t half_beat_num = 0;//角度轉(zhuǎn)換半拍總數(shù)
rt_uint16_t half_beat_count = 0;//半拍計(jì)數(shù)
rt_uint8_t beat_now = 0;//當(dāng)前節(jié)拍
//半拍步進(jìn)值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 轉(zhuǎn)動(dòng)效果
正轉(zhuǎn)360°,反轉(zhuǎn)360°
6.總結(jié)
簡(jiǎn)單寫(xiě)了段程序驅(qū)動(dòng)一下步進(jìn)電機(jī),實(shí)現(xiàn)了步進(jìn)電機(jī)的8拍控制,可以任意角度正反轉(zhuǎn)。調(diào)速可以通過(guò)修改脈沖頻率,也就是代碼中的DELAY,但是由于步進(jìn)電機(jī)特性限制,速度不能太快,否則會(huì)驅(qū)動(dòng)不起來(lái);太慢長(zhǎng)時(shí)間運(yùn)轉(zhuǎn)會(huì)發(fā)熱嚴(yán)重。
-
電機(jī)驅(qū)動(dòng)
+關(guān)注
關(guān)注
60文章
1204瀏覽量
86615 -
步進(jìn)電機(jī)
+關(guān)注
關(guān)注
150文章
3095瀏覽量
147346 -
正反轉(zhuǎn)控制
+關(guān)注
關(guān)注
3文章
33瀏覽量
11065 -
脈沖信號(hào)
+關(guān)注
關(guān)注
6文章
394瀏覽量
36916 -
L298N
+關(guān)注
關(guān)注
21文章
224瀏覽量
78629
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論