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

第42期《Arduino入門》善假篇 05:舵機的PWM控制原理#硬聲創(chuàng)作季
Arduino應(yīng)用之PWM控制直流電機風(fēng)扇
Arduino實踐中科學(xué)邏輯的應(yīng)用和VVVV入門教程

arduino 舵機控制與pwm控制小車沖突解決資料下載

如何使用Arduino生成的PWM來控制交流風(fēng)扇的速度

評論