2014年4月23日 星期三

[Arduino] 脈衝寬度調變 (PWM) 與 Arduino – Pulse Width Modulation

image
看過 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 的原理是甚麼?想像我們用點亮一盞燈,用肉眼快到不能察覺的速度,開關開關開關開關開關開關開關~~~~
image
當快到不行的時候,我們其實就會看到燈光較暗,而看不到一閃一閃光;當我們微調開與關的長度比例變成,開--關開--關開--關開--關開--關開--關開--關開--關~
image
我們就會看到燈光稍微的變亮了。這就是 PWM 的原理,藉由數位訊號高頻率的切換,調整開關的比例,我們可以模擬出我們需要的類比訊號。

藉由上面的例子,介紹幾個專有名詞:
image
  • 切換週期 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 為最大可輸出的電壓,這時候電燈會最亮
image

注意看一下 Arduino 的 digital pin 會發現,有些編號旁有 "~" 符號,這些 pin 就是可以使用 PWM pin。
image
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 訊號,有興趣可以參考看看)





6 則留言:

  1. 請問:
    可以進行PWM轉換的數位接角和其他的接角差在哪啊?
    我想問的是確切電路上的差異

    謝謝

    回覆刪除
    回覆
    1. 你好!
      確切的電路圖可以參考,http://arduino.cc/en/uploads/Main/arduino-uno-schematic.pdf 這份文件,老實說我功力不太夠,看不太懂...

      刪除
  2. 我想詢問的是 我PWM想要輸出20KHZ 然後DUTY可以變動
    請問我該怎麼寫

    回覆刪除
  3. 您好
    請教您一下
    假使我是用外接感測器,獨到的輸入值
    例如程式設定為, 0~10
    輸入類比值得到0~3 輸出PWM電壓為0
    輸入類比值得到4~6 輸出PWM電壓為3
    輸入類比值得到7~10 輸出PWM電壓為5

    這種方式可以嗎 ?? 延遲時間需要設定??
    謝謝您 ^^"

    回覆刪除
  4. Hi 樓主大大
    Duty Cycle = Ton/Toff (%) => Duty Cycle = Ton/Period (%) 才對喔

    回覆刪除
  5. Duty Cycle = Ton/Toff (%),為 ON 的時間與 OFF相除的百分比

    版主你好,我個人覺得這地方寫得怪怪的,應該是Ton/T (%),為ON的時間與總時間相除的百分比,要是Toff為零的話這個算式是不成立的

    回覆刪除

Anything That's Worth Chatting

Related Posts Plugin for WordPress, Blogger...