2011年7月26日 星期二

6.2) Fading

實驗目的

利用 PWM (Pulse Width Modulation, 脈衝寬度調變) 控制 LED 燈光亮度。

材料
  • Arduino 主板 x 1
  • LED x 1
  • 220 ohm 電阻 x 1
  • 單心線 x N
接線
  • LED 接到 pin9 和 GND,長腳 (陽極) 串接一顆 220 ohm 電阻到 pin9,短腳 (陰極) 直接接到 GND

image

程式

先來看 Arduino 版本的程式:

這支程式使用 analogWrite() 改變 PWM 的 duty cycle。因此在程式執行的時候,你會看到 LED 燈光不斷地改變亮度,一下子漸亮,一下漸暗。

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 的縮寫

根據上表可知 Arduino pin9 其實是 Timer1 的 PWM Output A,接下來我們就改用 Timer1 暫存器重新改寫程式:

Timer1 暫存器的設定摘要: 把 waveform generation mode bits WGM 設定為 001 以選擇 8-bit Fast Correct PWM 模式,把 COM1A 位元設定為 10 以選擇 channel A 為非反相 (non-inverted) 的 PWM 輸出,設定 CS bits 為 011 以選擇 prescaler 為 clock/64。

使用 Proteus 觀察 PWM 波形

接下來我們用 Proteus 觀察 PWM 的波形。

image
▲ Barebone Arduino

我們以 Barebone Arduino 為基礎,在設計畫面上放一個虛擬示波器 (OSSCILLOSCOPE),然後把 pin 0 接到 channel A:

image

接著即可載入 Arduino 的 HEX 檔並使用示波器觀察 PWM 波形。由於程式不斷改變 duty cycle,從 0% 到 100%,然後再從 100% 慢慢變回 0%,因此在執行的時候,你會看到 PWM 波形從 0% 一直增加到 100%,然後再從 100% 一直附回 0%:

image
▲ duty cycle 接近 100%

image
▲ duty cycle 接近 0% 

Phase-Correct PWM 的 frequency 計算公式為:

PWM_frequency = clock_speed / (2 * Prescaller_value * TOP_value )

可知頻率為 16 MHz / 64 / 255 / 2 = 490.196Hz,頻率的倒數就是週期,所以 Output A 的 PWM 週期大約是 1000000/490.196 = 2040 us。

利用 Proteus 的示波器觀察 PWM 波形,並使用 Cursor (游標) 計算 Pulse 寬度:

image

得 Output A 的 Pulse 寬度大約是 2.04 mS (等於 2040 us),跟理論值幾乎是一樣的。

延伸閱讀

0 意見: