在 Arduino 中輕鬆實現脈寬調變 (PWM)

脈寬調變(PWM)訊號基本上是一個方波,在導通(高)和關斷(低)狀態之間反覆切換。其工作週期和頻率用於確定 PWM 訊號控制目標的動作。

image

PWM 訊號的工作週期是指訊號處於高電平(導通)狀態的時間與完成一個週期所需的總時間之比,通常以百分比或比率來表示。

image

50% 的工作週期代表高電平狀態佔據一半的時間,低電平狀態佔據另一半時間。這與理想的方波相同。如果該比率大於 50%,則邏輯高電平訊號在週期中佔用的時間比邏輯低電平多,反之亦然。因此,100% 工作週期表示信號始終處於導通狀態(full-scale, 全刻度),0% 工作週期表示訊號始終處於關斷狀態(接地)。

在 Arduino 上,可以通過各種方式輕鬆實現 PWM。以下介紹的 Seeeduino 開發板就是其中一款不錯的學習和評估板。它以 ATmega328P 微控制器構建,並能與 Arduino 兼容。

板上包含6個引腳(即引腳3、5、6、9、10、11),可以利用 analogWrite() 函數輸出 PWM 波。只需利用 analogWrite()函數即可在 PWM 引腳上產生具有指定工作週期的穩定方波。一般來說,這些引腳的頻率在 490Hz 左右,而 Seeeduino 或類似板的引腳 5 和 6 的頻率為 980Hz。

Arduino 引腳的輸出電壓為 5V,不同的工作週期輸出的電壓電平各不相同,具體如下所示:

工作週期 輸出電壓
0% 0V
25% 1.25V
50% 2.5V
75% 3.75V
100% 5V

範例 - 調節 LED 的亮度

利用 PWM 技術在 Arduino 上 控制 LED 的亮度。

硬體連接圖

image

軟體編程
analogWrite()函數語法:

analogWrite ( pin , value ) ;

該值代表工作週期,數值介於 0(關斷)和 255(導通)之間。


int ledPin = 9; // LED connected to digital pin 9

void setup() {
   pinMode(ledPin, OUTPUT); // sets the pin as output
}

void loop() {
   analogWrite(ledPin, 255); //set duty cycle to always on
}

你可以將「255」更改為「0 」至「255」之間的任何一個數字作調變不同的輸出,也可以修改程式碼以連續更改該數值。