實驗目的
利用 PWM (Pulse Width Modulation, 脈衝寬度調變) 控制 LED 燈光亮度。
材料
- Arduino 主板 x 1
- LED x 1
- 220 ohm 電阻 x 1
- 單心線 x N
接線
- LED 接到 pin9 和 GND,長腳 (陽極) 串接一顆 220 ohm 電阻到 pin9,短腳 (陰極) 直接接到 GND
程式
先來看 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 的波形。
▲ Barebone Arduino
我們以 Barebone Arduino 為基礎,在設計畫面上放一個虛擬示波器 (OSSCILLOSCOPE),然後把 pin 0 接到 channel A:
接著即可載入 Arduino 的 HEX 檔並使用示波器觀察 PWM 波形。由於程式不斷改變 duty cycle,從 0% 到 100%,然後再從 100% 慢慢變回 0%,因此在執行的時候,你會看到 PWM 波形從 0% 一直增加到 100%,然後再從 100% 一直附回 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 寬度:
得 Output A 的 Pulse 寬度大約是 2.04 mS (等於 2040 us),跟理論值幾乎是一樣的。
0 意見:
張貼留言