AC Light Dimming

脈寬調變(PWM, Pulse Width Modulation)是一種很有趣的技術,它廣泛的應用在生活上不同的領域中,基本原理是利用微處理器所輸出的數位訊號來控制類比訊號的輸出。還記得嗎?我們之前曾在DIY智慧型垃圾桶一文中介紹了如何使用PWM來控制伺服馬達的動作,每一個20ms脈衝週期(20ms為伺服馬達標準的脈衝控制週期)的前1~2ms脈衝寛度,代表的就是馬達所要轉動的角度。

http://sourceforge.net/p/fuyard/wiki/analysis-generic-architecture-hardware/attachment/laboratoire-pic18-servo-pwm.png

因此,伺服馬達利用PWM中不同的脈衝寛度來判斷要轉動的角度,既然我們能夠透過數位訊號來控制輸出的脈衝寛度,那麼,如果把它應用在電流輸出上,透過改變電流脈衝的寛改變整體通電時間的比例,不就可以讓燈泡因電流的變化而有不同的亮度嗎?的確,這種利用PWM改變脈衝寛度讓類比電流產生變化的技術,目前已經大量運用在燈具的調光或馬達的調速上,它改善了以往使用電阻變化調整電壓的缺點(一樣耗電,多餘的電能皆轉為熱能),能夠真正達到節電的目的。

AC交流電

我們家中電源插座所提供的是交流電(AC, Alternating),這種電源不同於DC電池的直流電,它的電源大小和正負極會呈現週期性的變化,其頻率變化週期是60HZ,也就是每秒鐘變化60次。這個60HZ頻率的數字很重要,我們稍後在撰寫調光程式時會用到它。AC 60HZ用於北美、日韓及我們台灣,而在更廣泛的歐洲、紐澳、非洲及中國,用的則是50Hz的標準,因此,我們在撰寫PWM調光程式時,必須因應不同地區的標準而修改。

下方是一個標準110V 60Hz交流電的波形,每一個完整的AC波形都是由一個正半波和一個負半波組成,其中,波形和X軸(也就是0V)的交接點,我們稱為零交越點(Zero cross),跟頻率變化週期60HZ這個數字一樣,稍後的PWM調光程式也會用到零交越點的概念。

那麼經過PWM處理後的AC波形長什麼樣子呢?就像如下的圖形,綠色是原來未經處理的波形,紅色則是PWM處理後減少了一半寬度的波形,等於是通電時間只有原先的50%,因此通過的電流只有原先的一半,如果我們接的是燈泡,亮度只會是原先的一半,如果是馬達,同理也會減速一半。

http://i.stack.imgur.com/RxuQX.gif

透過PWM調控出來的AC電流在一般傳統的鎢絲燈泡上效果相當不錯,不過如果用在目前流行的LED燈泡,會發現有頻閃或閃爍的情況,無法作到無間隙的亮暗度調整,這是因為一般LED燈泡的驅動電路僅能依據電流有無作出開與關的動作,而無法配合前文提到的以零交越點為基準來調整開與關(導通時間),其原因可參考http://baike.baidu.com/view/6507467.htm或其它更專業的技術文章,其實一般透過修改LED內部驅動功能就可以實現明暗度的調節,只是大多數的LED廠商都將這個功能去掉以節省成本,因此如果我們要在LED上使用PWM調光功能,購買時就必須選擇有註明「適用傳統調光器」的LED型號,當然價格也比較貴。

PWM如何控制AC電流

我們再回頭看一下這張圖片。AC的頻率週期是60Hz,亦即1/60秒,那麼半個波就是1/120秒。

這半個波1/120秒,大約等於0.00833秒也就是8.33ms(毫秒),這個數字挺重要的,因為PWM調光程式會用得到。

假設我們希望作到128階段的調光功能,那麼可將這個8.33ms再除以128,就得到每單位為65us:8.33ms/128 ≒ 0.065ms = 65us(微秒),因此,如果我們想要輸出50%的電力,就應該要從零交越點上延遲65us x 64(因為128/2 = 64)= 4160us的時間,就可以僅僅輸出原先一半的電力,如果要輸出25%電力,那麼就要延遲65us x 32(因為128/4 = 32)= 2080us的時間,故可知延遲時間愈短,電力愈高,反之亦然。

最終,經過PWM修正的波型會長得如下::

http://www.digikey.com/en/articles/techzone/2011/jul/~/media/Images/Article%20Library/TechZone%20Articles/2011/July/Dimming%20LEDs%20with%20Traditional%20TRIAC%20Dimmers/article-2011july-dimming-leds-fig2.jpg

ARDUINO如何輸出PWM

底下是一個輸出PWM訊號的Arduino程式,其中你會發現在setup()中有定義了一個中斷處理attachInterrupt(1, zero_crosss_int, RISING),當中斷腳位一的電壓上升時便要去執行其中所指定的中斷處理函式 zero_crosss_int()。這個中斷發生代表電壓上升的時間點,其實就是前言中所謂的零交越點,所以在zero_crosss_int()函式中,我們會在該零交越點發生時,依據dimming的值讓系統經過延遲的時間後,才將電壓回復為1。

unsigned char AC_LOAD = 7;    // Output to Opto Triac pin

unsigned char dimming = 3;  // Dimming level (0-100)

unsigned char i;

void setup() {

// put your setup code here, to run once:

pinMode(AC_LOAD, OUTPUT);// Set AC Load pin as output

attachInterrupt(1, zero_crosss_int, RISING);

// Serial.begin(9600);

}

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light

{

// Firing angle calculation : 1 full 50Hz wave =1/50=20ms

// Every zerocrossing : (50Hz)-> 10ms (1/2 Cycle) For 60Hz (1/2 Cycle) => 8.33ms

// 10ms=10000us

int dimtime = (100*dimming);    // For 60Hz =>65

delayMicroseconds(dimtime);    // Off cycle

digitalWrite(AC_LOAD, HIGH);   // triac firing

delayMicroseconds(10);         // triac On propogation delay (for 60Hz use 8.33)

digitalWrite(AC_LOAD, LOW);    // triac Off

}

void loop() {

// Serial.println(pulseIn(8, HIGH));

for (i=5;i<85;i++) { dimming=i; delay(20); }   for (i=85;i>5;i–)

{

dimming=i;

delay(20);

}

}

2 Comments

迴響已關閉。