2013年4月4日 星期四

Arduino PWM 調整控制LED燈光亮度



Pulse Width Modulation 就是通常所說的PWM脈波寬度調變。PWM是一種對類比信號電位進行數位編碼的方法,由於電腦不能輸出類比電壓,只能輸出0 5V 的的數位電壓值,我們就通過使用高解析度計數器,利用方波的Duty cycle工作週期被調變的方法來對一個具體類比信號的電位進行編碼。

PWM 信號仍然是數位的,因為在給定的任何時刻,最大值的直流供電要是5V(ON),或是0V(OFF)。電壓或電流源是以一種導通(ON)或斷路(OFF)的重複脈波序列被加到類比負載上去的。通ON的時候即是直流供電被加到負載上的時候,斷路OFF的時候即是供電被斷開。只要頻寬足夠,任何模擬值都可以使用PWM 進行編碼。

輸出的電壓值是通過導通和斷路的時間進行計算的。輸出電壓=(導通時間/脈衝時間)*最大電壓值




PWM 被用在燈具調光、馬達調速、聲音的製作等等。

下面介紹一下PWM 的三個基本參數:

1、脈衝寬度變化幅度(最小值/最大值)
2、脈衝週期(1 秒內脈衝頻率個數的倒數)
3、電壓高度(例如:0V-5V




Arduino 控制器有6 PWM 介面分別是數位介面35691011
在編寫程式的過程中,我們會用到類比寫入analogWrite(PWM 介面,類比值)函數,對於類比寫入analogWrite()函數,此函數用法也很簡單,我們在本實驗中讀取電位計的類比值信號並將其賦給PWM 介面使LED產生相應的亮度變化,再在螢幕上顯示出讀取的類比值,大家可以理解為此程式是在類比值讀取的實驗程式中多加了將類比值賦給PWM 介面。


int potpin=0;    //定義類比介面0
int ledpin=11;   //定義數位介面11PWM 輸出)
int val=0;          // 暫存來自感測器的變數數值


void setup()
{
pinMode(ledpin,OUTPUT);//定義數位介面11 為輸出
Serial.begin(9600);//設置串列傳輸速率為9600
//注意:類比介面自動設置為輸入
}


void loop()
{
  val=analogRead(potpin);     // 讀取感測器的模擬值並賦值給val

  Serial.println(val);                //顯示val 變數

  analogWrite(ledpin,val/4);   // 打開LED 並設置亮度(PWM 出最大值255

  delay(10);    //延時0.01 秒  10mSEC
}

下載完程式,我們旋轉電位計的旋鈕不但可以看到螢幕上數值的變化還也可以清楚的看到我們麵包板上的LED的亮度也在隨之變化。


沒有留言:

張貼留言

Messaging API作為替代方案

  LINE超好用功能要沒了!LINE Notify明年3月底終止服務,有什麼替代方案? LINE Notify將於2025年3月31日結束服務,官方建議改用Messaging API作為替代方案。 //CHANNEL_ACCESS_TOKEN = 'Messaging ...