[Arduino_AVR] 06-Timer1_Fast_PWM

Morgan Ting
閱益如美
Published in
6 min readJul 20, 2020
Photo by Bonneval Sebastien on Unsplash

Pulse Width Modulation, PWM 是微處理器中常用的功能,可以模擬類比量用來控制馬達轉速或燈光亮度等。而 PWM是正是由 TIMER 產生,本篇文章將會介紹 Fast PWM 模式的原理與控制。

使用工具/材料

  1. Arduino UNO *1
  2. 220 歐姆電阻 *2
  3. LED 燈*2

Fast PWM 是什麼 ?

PWM 可以由多種方式產生而 Fast PWM 是其中一種。藉由設定特定數值當計數器數到該數值時輸出訊號會轉態,這時繼續計數到最大值後輸出訊號再度轉態並且歸零重新計數,如此反覆循環我們可以在輸出腳位得到頻率相同工作週期不同的 PWM 訊號。

當 TCNT1等於 OCR1A 或 OCR1B 時觸發服務中斷常式ISR(TIMER1_COMPn_vect) 後繼續計數至最大值並觸發計數溢位中斷服務常式 ISR(TIMER1_OVF_vect)。

Timer 1 的 Fast PWM

Atmega328P 16-bit 的 Timer 1 計數範圍為 0 ~ 65535 ,特別的地方是可以設定計數時間長度為 8-bit 、9-bit 與 10-bit ,可以依需求彈性調整。

頻率與工作週期

Fast PWM 模式的頻率計算為: 系統頻率 / ( 除頻 * 計數最大值 ) [Hz]

工作週期為:( 1+OCR1n ) / 計數最大值 % [n: A or B]

其中的系統頻率是指微處理機的運作頻率,以 UNO 開發板而言是 16 MHz。

計數最大值若設定 16-bit 則是 65535,若設定 8-bit 則是 255,若設定 9 bit 則是 511,若設定 10-bit 則是 1023。這樣可以讓使用者依需求做彈性選擇。

輸出波形

Fast PWM 可以設定 2 種輸出波形模式,當計數到 OCR1n 時訊號設為高電位或是低電位,計數到最大值時再轉態。這兩種波形會互補對於工作週期有截然不同的結果,在設計上需要注意。

Fast PWM 輸出波形

暫存器設定

對於 Fast PWM 模式而言要設定 「Clear/non-inverting」與 「Set/inverting」兩種模式。

Timer 1 的 Fast PWM 模式設定有多種選擇,差別在於計數上限不同。

除頻,依需求做調整來得到想要的頻率。

TCNT1 是儲存計數值的暫存器。時脈踢 ( tick ) 一下,TCNT 1 就會加 1。

OCR1A 與 OCR1B 設定輸出訊號轉態時機,此設定會影響工作週期 ( duty cycle )。

TIMSK1 中斷致能,依需求設定是否觸發中斷服務常式。

實驗

利用 Timer 1 的 Fast PWM 模式輸出頻率相同而工作週期不同的訊號來點亮LED 燈,可以觀察到 LED 燈亮度會有不同。此次實驗調整 Fast PWM 解析度為 8-bit 此時就像使用 8-bit 計數器一樣,原因在於若直接使用 16-bit 解析度就算在不除頻情況下輸出頻率為 16 MHz / 65536 = 244.14 Hz 有點低,在筆者的老骨頭示波器上瞧不出所以然 ( 看它心情,老是不想顯示像樣的波形),實驗相關設定如下:

  1. 設定 Timer 1 Fast PWM 解析度為 8-bit 。
  2. 設定除頻 64 。
  3. 輸出波形模式為 「Clear/non-inverting」。
  4. OCR1A 設定 127 ,OCR1B 設定 64。

程式碼

  1. timer1_fast_pwm () 副程式中,TCCR1A、TCCR1B與 TCNT1 先清除為零。之後TCCR1A與TCCR1B 再設定波形輸出模式為 「Clear/non-inverting」,Fast PWM 解析度為 8-bit,除頻為 64 。OCR1A 設為 127,OCR1B 設為 64。
  2. pin_setup () 副程式中,設定 OCR1A / OCR1B 對應的 I/O 腳位為輸出模式,並預先設為低電位輸出。
  3. int main () 主程式中分別呼叫上述副程式進行設定後,發呆空轉。

實驗結果

依照設定期望得到的輸出訊號頻率為 16 MHz / ( 64 * 256 ) = 976.56 Hz,

OCR1A 對應的腳位 PORTB1 輸出訊號工作週期為 ( 1 + 127 ) / 256 = 50 %

OCR1B對應的腳位 PORTB2 輸出訊號工作週期為 ( 1 + 64 ) / 256 = 25.4 %

輸出波形

輸出波形

總結

本篇文章介紹了 Atmega328P 的 Timer 1 Fast PWM 運作方式與操作,最後整理如下:

  1. Timer 1 Fast PWM 有 16-bit、10-bit、9-bit 與 8-bit 可以選擇。
  2. 輸出訊號有 「Clear/non-inverting」與 「Set/inverting」可以選擇。
  3. 頻率的計算為:系統頻率 / ( 除頻 * 計數最大值 )。
  4. 輸出訊號工作週期為: ( 1 + OCR1n ) / 計數最大值 % 。

程式碼下載

06-Timer1-Fast-PWM

參考出處

  1. Atmega328P Datasheet.
  2. Secrets of Arduino PWM.

感謝有您

感謝讀者閱讀文章若有任何意見與想法歡迎留言指導讓知識擴大加深,秉持愛學習與愛分享的精神歡迎分享與轉載並請標註來源。

--

--

Morgan Ting
閱益如美

用好奇心探索世界。喜愛學習樂於分享。