PWM 簡介
PWM (Pulse-width modulation,脈衝寬度調變) 是一種利用數位訊號來控制類比輸出的技術。
數位輸出 (Digital Output) 可以控制訊號的開跟關,開 (ON) 意味著通電,關 (OFF) 意味著斷電,假如我們進一步控制通電的時間比例,就能讓類比輸出產生變化。Arduino 的數位輸出電壓是 5V,如果腳位 ON 的時間佔整個週期 (Period) 的 50%,那麼平均電壓就是 2.5V。
Duty Cycle 為每一個週期通電時間 (ON) 所佔的比例,中文稱為工作週期或責任週期,在大陸地區稱為占空比。Duty Cycle 的變化可以從 0% 到 100%:
▲ 圖中垂直的綠線代表一個週期 (Period),圖片來源: arduino.cc
PWM 可以應用在很多地方,例如:
- 調節燈光
- 提供類比輸出;數位輸出如果經過瀘波,將可提供 0% 到 100% 的類比電壓
- 產生音訊 (audio signals)
- 提供馬達的變速控制
- 產生調變訊號,比如驅動遙控用的紅外線 LED
PWM with analogWrite()
Arduino 讓 PWM 的使用變得很簡單,只要呼叫 analogWrite(pin, dutyCycle) 就好,其中 dutyCycle 是一個 0 到 255 的數值,而 pin 則是 PWM 腳位 (3, 5, 6, 9, 10 或 11)。例如:
- analogWrite(3, 255) 代表在 pin 3 上產生 duty cycle 為 100% 的 PWM 輸出
- analogWrite(3, 127) 代表在 pin 3 上產生 duty cycle 為 50% 的 PWM 輸出
analogWrite() 函式提供了一個很簡單的 PWM 使用介面,不過只能控制 duty cycle,沒有提供頻率的控制。
Software PWM
你可以在任何腳位上手動實作 PWM,方法是依想要的時間重覆開關某個腳位,例如:
上列會產生一個 duty cycle 為 10% 而頻率為 1 KHz 的 PWM 波形。
這個技巧的優點是可以使用任何一支腳位,而且你也可以完全掌控 duty cycle 和 frequency。一個主要的缺點是中斷會影響 timing,除非你把中斷關掉,不然的話會造成抖動 (Jitter)。第二個缺點是程式沒法多工。
Hardware PWM
ATmega168/328 有 Timer0, Timer1 (16-bit) 和 Timer2 三個 Timer,每個 Timer 控制兩個 PWM 輸出,所以 Arduino (如 UNO, Duemilanove) 一共有 6 支 PWM 腳位:
▲ ATmega328 與 ATmega168 腳位是相容的
下表整理 Timer 與 Arduino 輸出腳位的對應關係:
Timer output | Arduino Pin | Chip Pin Name |
---|---|---|
OC0A | 6 | PD6 |
OC0B | 5 | PD5 |
OC1A | 9 | PB1 |
OC1B | 10 | PB2 |
OC2A | 11 | PB3 |
OC2B | 3 | PD3 |
▲ OC 是 Output Compare 的縮寫
ATmega168/328 提供的 Hardware PWM 有三種模式:
- Fast PWM
- Phase Correct PWM
- Phase Correct and Frequency PWM
我們會把焦點放在 Fast PWM 和 Phase Correct PWM,下次將介紹這兩種模式。
作者已經移除這則留言。
回覆刪除請問可以控制接著L298N的馬達轉速嗎??
回覆刪除可以參考這篇:
回覆刪除http://vkwarehouse.blogspot.tw/2012/05/bidirectional-motor-control.html