2011年7月19日 星期二

6) PWM

PWM 簡介

PWM (Pulse-width modulation,脈衝寬度調變) 是一種利用數位訊號來控制類比輸出的技術。

數位輸出 (Digital Output) 可以控制訊號的開跟關,開 (ON) 意味著通電,關 (OFF) 意味著斷電,假如我們進一步控制通電的時間比例,就能讓類比輸出產生變化。Arduino 的數位輸出電壓是 5V,如果腳位 ON 的時間佔整個週期 (Period) 的 50%,那麼平均電壓就是 2.5V。

Duty Cycle 為每一個週期通電時間 (ON) 所佔的比例,中文稱為工作週期或責任週期,在大陸地區稱為占空比。Duty Cycle 的變化可以從 0% 到 100%:

image
▲ 圖中垂直的綠線代表一個週期 (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 腳位:

image
▲ 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 有三種模式:

  1. Fast PWM
  2. Phase Correct PWM
  3. Phase Correct and Frequency PWM

我們會把焦點放在 Fast PWM 和 Phase Correct PWM,下次將介紹這兩種模式。

延伸閱讀

3 意見:

dg101 提到...
作者已經移除這則留言。
Unknown 提到...

請問可以控制接著L298N的馬達轉速嗎??

Cooper Maa 提到...

可以參考這篇:
http://vkwarehouse.blogspot.tw/2012/05/bidirectional-motor-control.html