上回我們用 PWM 控制了一盞 LED 燈的亮度,實(shí)現(xiàn)了漸明漸暗的效果。今天就來用 PWM 控制一個(gè)直流電機(jī)的轉(zhuǎn)速,實(shí)現(xiàn)逐漸加速,減速的效果。為了能清除看到效果,筆者還專門用拙劣的手工做了一個(gè)紙風(fēng)車,粘到電機(jī)轉(zhuǎn)軸上。下面就來動(dòng)手做實(shí)驗(yàn)。
實(shí)驗(yàn)器材:
- Arduino Uno R3 芯片 x1
- Adafruit 電機(jī)驅(qū)動(dòng)板(Motor Shield)V1 型 x1
- 直流電機(jī) x1
- 電線 x2
- USB 數(shù)據(jù)線 x1
- PC x1
實(shí)驗(yàn)器材一覽如下:
注意事項(xiàng):
Adafruit 電機(jī)驅(qū)動(dòng)板是設(shè)計(jì)成兼容 Arduino Uno R3 芯片的,可以直接堆疊在 Arduino 上連接。
驅(qū)動(dòng)板上的 jumper(在標(biāo)注 PWRJMP,意為 power jumper 的位置)是用來決定 Arduino 和驅(qū)動(dòng)板是否獨(dú)立供電的。如果蓋上 jumper,則驅(qū)動(dòng)板由 Arduino供電;如果拔掉jumper,則驅(qū)動(dòng)板獨(dú)立供電。
驅(qū)動(dòng)板若要獨(dú)立供電,電源接標(biāo)注 EXT_PWR(意為 external power)的 2 個(gè)接口。注意不要接反正負(fù)極,否則會(huì)燒壞驅(qū)動(dòng)板甚至 Arduino!驅(qū)動(dòng)板上LED 燈亮,表示驅(qū)動(dòng)板供電正常。
實(shí)驗(yàn)原理:
PWM 全稱 Pulse Width Modulation,它的原理,簡而言之,是通過產(chǎn)生持續(xù)時(shí)間長短不一的數(shù)字脈沖,來模擬連續(xù)變化的電平(“捏造”模擬信號(hào))。注意芯片上的標(biāo)識(shí), pin 號(hào)旁邊有 ~ 符號(hào)的表示該 pin 支持 PWM。(更詳盡的原理以后再做整理)
實(shí)驗(yàn)步驟:
1.連接硬件:
首先將 Adafruit 電機(jī)驅(qū)動(dòng)板直接堆疊插在 Arduino 板上,注意數(shù)字引腳對(duì)數(shù)字引腳,模擬引腳對(duì)模擬引腳,就可以很容易安裝好。效果如圖:
b. Arduino 板用 USB 數(shù)據(jù)線接 PC。這時(shí)候 Arduino 和驅(qū)動(dòng)板都有供電,2 個(gè)板子上的 LED 燈常亮;
c. 2 條電線穿進(jìn)電機(jī)的 2 個(gè)腳,打個(gè)小結(jié)固定一下,連接順序現(xiàn)在來說隨意。這里提一下電線的準(zhǔn)備,用剪刀剪出合適大小的電線后,用剪刀在電線的 2 端各去掉半個(gè)手指頭長度的包皮,讓導(dǎo)線頭裸露;
d. 2 條電線另外一端接驅(qū)動(dòng)板上標(biāo)注 M3(意為 Motor 3)的 2 個(gè)腳。用 3 mm 十字螺絲刀擰松 2 個(gè)腳的螺絲,把電線放進(jìn)去 2 只腳的壓片下,然后擰緊螺絲,效果如圖:
2.下載安裝電機(jī)驅(qū)動(dòng)庫
要用代碼控制 Adafruit 電機(jī)驅(qū)動(dòng)板,可以使用 Adafruit 提供的庫函數(shù),輕松上手。
然后打開 Arduino IDE,在菜單里,點(diǎn)擊“項(xiàng)目”->“加載庫”->“添加一個(gè)新 ZIP 庫”,然后選擇剛剛下載的 ZIP 壓縮包就可以了。
3.編寫程序
#include < AFMotor.h >
// 因?yàn)殡姍C(jī)裝在驅(qū)動(dòng)板的 M3 位置,所以第一個(gè)參數(shù)是 3
// 第 2 個(gè)參數(shù)是 PWM 頻率,如果電機(jī)接在 M1-M2 位上,則參數(shù)可選
// MOTOR12_64KHZ
// MOTOR12_8KHZ
// MOTOR12_2KHZ
// MOTOR12_1KHZ
// 如果電機(jī)接在 M3-M4 位上,則參數(shù)可選
// MOTOR34_64KHZ
// MOTOR34_8KHZ
// MOTOR34_1KHZ
AF_DCMotor motor(3, MOTOR34_64KHZ);
void setup() {
// 選擇串口 Baud 率
Serial.begin(9600);
Serial.println("Motor test!");
}
void loop() {
Serial.println("tick");
// 設(shè)置電機(jī)向前運(yùn)轉(zhuǎn)
motor.run(FORWARD);
// 不斷加速
for (int i = 0; i < 255; i++) {
motor.setSpeed(i);
// 等待 0.1 s 讓電機(jī)充分加速
delay(100);
}
// 讓電機(jī)恒速運(yùn)轉(zhuǎn) 10 s
delay(10000);
// 不斷減速
for (int i = 255; i > 0; i--) {
motor.setSpeed(i);
// 等待 0.1 s 讓電機(jī)充分減速
delay(100);
}
Serial.println("tock");
// 釋放電機(jī),不運(yùn)轉(zhuǎn)
motor.run(RELEASE);
// 停轉(zhuǎn) 1 s
delay(1000);
Serial.println("tack");
// 設(shè)置電機(jī)向后運(yùn)轉(zhuǎn)
motor.run(BACKWARD);
// 不斷加速
for (int i = 0; i < 255; i++) {
motor.setSpeed(i);
// 等待 0.1 s 讓電機(jī)充分加速
delay(100);
}
// 讓電機(jī)恒速運(yùn)轉(zhuǎn) 10 s
delay(10000);
// 不斷減速
for (int i = 255; i > 0; i--) {
motor.setSpeed(i);
// 等待 0.1 s 讓電機(jī)充分減速
delay(100);
}
Serial.println("tock");
// 釋放電機(jī),不運(yùn)轉(zhuǎn)
motor.run(RELEASE);
// 停轉(zhuǎn) 1 s
delay(1000);
}
燒錄到 Arduino 芯片上,可以看到電機(jī)按照我們?cè)O(shè)計(jì)的一樣,先正向加速運(yùn)轉(zhuǎn),然后恒速轉(zhuǎn)動(dòng) 10 秒,然后減速運(yùn)轉(zhuǎn),停頓 1 秒,然后反向加速運(yùn)轉(zhuǎn),恒速轉(zhuǎn)動(dòng) 10 秒,然后減速運(yùn)轉(zhuǎn),停頓 1 秒,周而復(fù)始。
最后,為了更加明顯的看到電機(jī)的轉(zhuǎn)動(dòng),筆者給小電機(jī)安上了一個(gè)粗糙的紙風(fēng)車,效果如下:
-
直流電機(jī)
+關(guān)注
關(guān)注
36文章
1710瀏覽量
70413 -
電機(jī)驅(qū)動(dòng)
+關(guān)注
關(guān)注
60文章
1227瀏覽量
86939 -
PWM控制
+關(guān)注
關(guān)注
7文章
194瀏覽量
26460 -
Arduino
+關(guān)注
關(guān)注
188文章
6477瀏覽量
187827
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論