看過 Arduino 基本 Pin 介紹 (這篇),後我們知道有 Arduino 有 digital pin 及 analog pin,digital pin 可以在 pin mode 設定 output/input 來決定 digital pin 是輸出數位訊號,還是接收數位訊。
But!analog pin (A0~A5) 只能接收類比訊號,通常我們的 sensor 都是利用 analog pin 接收外界訊息 (TMP 系列就是接在 analog pin 上的),那我們要怎麼輸出類比訊號?!
靠的就是,Pulse Width Modulation (PWM),脈衝寬度調變。
甚麼是 PWM?簡單的說,他是一種利用數位訊號模擬類比訊號的方式。通常我們可以用來調整燈光的亮度、馬達的轉速、RGB LED 的配色、螢幕亮度控制、喇叭的大小聲/聲音頻率等…。
PWM 的原理是甚麼?想像我們用點亮一盞燈,用肉眼快到不能察覺的速度,開關開關開關開關開關開關開關~~~~
當快到不行的時候,我們其實就會看到燈光較暗,而看不到一閃一閃光;當我們微調開與關的長度比例變成,開--關開--關開--關開--關開--關開--關開--關開--關~
我們就會看到燈光稍微的變亮了。這就是 PWM 的原理,藉由數位訊號高頻率的切換,調整開關的比例,我們可以模擬出我們需要的類比訊號。
藉由上面的例子,介紹幾個專有名詞:
- 切換週期 T,通常我們會用頻率 f (Hz) 來表達,在 Arduino pin 上基本的切換頻率大約是 490Hz,部分的 pin 是 980 Hz (Arduino Uno pin 5&6)。
- Duty Cycle = Ton/Toff (%),為 ON 的時間與 OFF相除的百分比
- 模擬出的電壓 V = Von x duty cycle (%),可以知道 duty cycle 越高模擬出的電壓越高,當完全沒有 OFF 的時候,duty cycle = 100%,V = Von 為最大可輸出的電壓,這時候電燈會最亮
注意看一下 Arduino 的 digital pin 會發現,有些編號旁有 "~" 符號,這些 pin 就是可以使用 PWM pin。
Arduino PWM 的使用方式其實超簡單的,IDE code 為 analogWrite ()。
格式:analogWrite(pin, value)
參數:
pin:輸出 PWM 的 pin ,上面的例子可以是 pin 3/5/6/9/10/11
value:duty cycle,介於0~255。0 = 0%,127 = 50%,255 = 100%
analog(3,127),就是代表由 pin 3 輸出 duty cycle 50% 的訊號。
附上一個簡單的 sketch:
int ledPin = 3; // 把 LED 接上 PWM pin3
void setup()
{
pinMode(ledPin, OUTPUT); // 設定 pin 3 為輸出
}
// 下面這個 loop 會讓 LED 燈由暗變為一半亮度,最後變成最大亮度
void loop()
{
analogWrite(ledPin, 0); // LED 不亮
delay (1000);
analogWrite(ledPin, 127); // LED 一半亮度
delay (1000);
analogWrite(ledPin, 255); // LED 最大亮度
delay (1000);
}
後續會再介紹 Starter Kit 中的 RGB LED ,比上面這個有趣的多~
參考資料:
Arduino – analogWrite()
Wiki – Pulse Width Modulation (這篇有講解到怎麼轉換類比訊號為 PWM 訊號,有興趣可以參考看看)
請問:
回覆刪除可以進行PWM轉換的數位接角和其他的接角差在哪啊?
我想問的是確切電路上的差異
謝謝
你好!
刪除確切的電路圖可以參考,http://arduino.cc/en/uploads/Main/arduino-uno-schematic.pdf 這份文件,老實說我功力不太夠,看不太懂...
我想詢問的是 我PWM想要輸出20KHZ 然後DUTY可以變動
回覆刪除請問我該怎麼寫
您好
回覆刪除請教您一下
假使我是用外接感測器,獨到的輸入值
例如程式設定為, 0~10
輸入類比值得到0~3 輸出PWM電壓為0
輸入類比值得到4~6 輸出PWM電壓為3
輸入類比值得到7~10 輸出PWM電壓為5
這種方式可以嗎 ?? 延遲時間需要設定??
謝謝您 ^^"
Hi 樓主大大
回覆刪除Duty Cycle = Ton/Toff (%) => Duty Cycle = Ton/Period (%) 才對喔
Duty Cycle = Ton/Toff (%),為 ON 的時間與 OFF相除的百分比
回覆刪除版主你好,我個人覺得這地方寫得怪怪的,應該是Ton/T (%),為ON的時間與總時間相除的百分比,要是Toff為零的話這個算式是不成立的