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