Arduino - 脈衝寬度調製

脈衝寬度調製或 PWM 是用於改變脈衝序列中脈衝寬度的常用技術。PWM 具有許多應用場景,例如控制伺服和速度控制器,限制電機和 LED 的有效功率等。

PWM 的基本原理

脈衝寬度調製基本上是具有變化的高和低時間的方波。基本 PWM 訊號如下圖所示。

PWM

有各種與 PWM 相關的術語 -

  • 開啟時間 - 時間訊號持續時間很長。

  • 關閉時間 - 時間訊號持續時間很短。

  • 週期 - 表示為 PWM 訊號的導通時間和關斷時間之和。

  • 佔空比 - 表示為 PWM 訊號週期內保持的時間訊號百分比。

週期

如圖所示,Ton 表示導通時間,Toff 表示訊號的關斷時間。週期是開啟和關閉時間的總和,計算方法如下式所示 - $$ T_ {total} = T_ {on} + T_ {off} $$

佔空比

佔空比計算為該時間段的接通時間。使用上面計算的時間,工作週期計算如下 -

$$ D = \frac{T_ {on}} {T_ {on} + T_ {off}} = \frac {T_ {on}} {T_ {total}} $$

analogWrite() 函式

analogWrite() 函式將模擬值(PWM 波)輸出到一個管腳。它可用於點亮不同亮度的 LED 或以各種速度驅動電機。在呼叫 analogWrite() 函式之後,該引腳將產生指定佔空比的穩定方波,直到下一次呼叫 analogWrite() 或在同一引腳上呼叫 digitalRead()digitalWrite()。大多數引腳上的 PWM 訊號頻率約為 490 Hz。在 Uno 和類似的板上,引腳 5 和 6 的頻率約為 980Hz。Leonardo 的第 3 和第 11 針也以 980 Hz 的速度執行。

在大多數 Arduino 板(帶有 ATmega168 或 ATmega328 的板)上,此功能適用於引腳 3,5,6,9,10 和 11.在 Arduino Mega 上,它適用於引腳 2 - 13 和 44 - 46.較舊的 Arduino 具有 ATmega8 的電路板僅支援引腳 9,10 和 11 上的 analogWrite()

UNO PWM 引腳

Arduino Due 支援引腳 2 至 13 上的 analogWrite() ,以及引腳 DAC0 和 DAC1。與 PWM 引腳不同,DAC0 和 DAC1 是數模轉換器,可用作真正的模擬輸出。

在呼叫 analogWrite() 之前,你無需呼叫 pinMode() 將引腳設定為輸出。

analogWrite() 函式語法

analogWrite ( pin , value ) ;

value - 佔空比:介於 0(始終關閉)和 255(始終開啟)之間。

int ledPin = 9; // LED connected to digital pin 9
int analogPin = 3; // potentiometer connected to analog pin 3
int val = 0; // variable to store the read value

void setup() {
   pinMode(ledPin, OUTPUT); // sets the pin as output
}

void loop() {
   val = analogRead(analogPin); // read the input pin
   analogWrite(ledPin, (val / 4)); // analogRead values go from 0 to 1023, 
      // analogWrite values from 0 to 255
}