前言
在本周,我們在python課上做了一個實驗,用ARDUINO使小LED燈模仿出呼吸燈的效果,實驗進行的很成功,但是機器當僅輸出高/低電平的時候是怎么樣才能做到漸亮漸暗(輸出電壓)的變化呢?在這里就用到了PWM(脈沖寬度調制)的技術.這篇博文里介紹的就是我對本周的實驗LED呼吸燈的原理通過學習進行的淺層次的理解分享.
理解PWM需要知道的知識
(1)脈沖
解釋:
電子設備中電平狀態發生的突變,通常突變時間很短,突變后極短時間后重新變為為原來的電平狀態.(突變狀態很短,兩次突變間的時間相對較長)
(2)脈沖循環
解釋:
可以理解為一次突變到下一次突變所花的時間如下圖:
(3)*(重點)占空比
解釋:
一個脈沖循環內通電時間所占的比例.,如下圖:
舉個例子:脈沖寬度1μs,信號周期5μs的脈沖序列即t=1,T=5,經過公式-占空比=t/T可以得到占空比為0.2.
(4)濾波器
解釋:
濾波器的組成為電感,電容,電阻等元器件.雖然PWM能通過通過改變占空比的方法.使電壓的平均值達到穩壓值,但輸出穩定電壓是靠PWM之后接的的濾波器來實現的.
(5)平均電壓/輸出電壓
解釋:
平均電壓電壓在一個周期T內積分之后再除以T.
也可以等同於寫成:
輸出電壓 = (接通時間 / 脈沖時間)* 最大電壓值
計算方式(平均電壓)的示意圖如下:
PWM的定義
PWN(Pulse-width modulation)的中文名是脈沖寬度調制.那么我們來看一下wikipedia對它的定義:
脈沖寬度調制(英語:Pulse Width Modulation,縮寫:PWM),簡稱脈寬調制,是將模擬信號變換為脈沖的一種技術,一般變換后脈沖的周期固定,但脈沖的占空比會依模擬信號的大小而改變.在模擬電路中,模擬信號的值可以連續進行變化,在時間和值的幅度上都幾乎沒有限制,基本上可以取任何實數值,輸入與輸出也呈線性變化。所以在模擬電路中,電壓和電流可直接用來進行控制對象,例如家用電器設備中的音量開關控制、采用鹵素燈泡燈具的亮度控制等等
計算PWN等效電壓
PWM的等效電壓計算公式為:
(此處我認為因為是方波所以可以將其視作平均電壓)
U =(T1*Umax)/(T1+T2) T1:導通時間 T2:斷流時間 T1+T2 脈沖周期 Umax:電壓幅值
所以根據公式可知,由於T1/(T1+T2)正是空占比,所以改變空占比就等於改變了等效電壓,所以使得燈泡的亮度發生了變化
為什么Analogwrite的值是0-255?
LED亮度通過調節LED驅動器的PWM占空比來對亮度控制,一個PWM周期可以划分成2的控制位的次方個時鍾周期而對大部分LED而言,控制位通常是8位,所以8位PWM能夠提供256個亮度級的電平,因此PWM周期由256個時鍾周期組成.
脈沖周期/頻率和人眼的關系
LED的典型時鍾頻率是32kHz,那么根據公式PWM周期為256/32kHz=8ms.那么這樣對於人眼而言這個閃爍頻率很安全的避免了人眼能夠覺察的閃爍.
在ARDUINO中使用PWM控制LED燈模擬呼吸燈的實驗
實驗准備:
實驗主設備: Arduino UNO R3(圖片來自NRIOBOT)
其他:
LED燈(若干)
面包板(一塊)
杜邦線(雙頭公若干)
電阻(若干)(可選擇/非必需)
連接圖示意(通過Fritzing軟件制作的簡易電路圖)
實驗代碼:
/*先要介紹一下analogwrite的用法
將模擬值(PWM波)輸出到管腳。可用於在不同的光線亮度調節發光二極管亮度或以不同的速度驅動馬達。調用analogWrite()后,該引腳將產生一個指定占空比的穩定方波,直到下一次調用analogWrite()(或在同一引腳調用digitalRead()或digitalWrite())
這種方法也叫快速PWM方式*/
需要上傳到ARDUINO中的代碼:
//設定使用9號口 void setup (){ pinMode(9,OUTPUT); } void loop(){ //由於上文中提到的所以為256種亮度 for (int a=0; a<=255;a++) //控制PWM亮度的增加 { analogWrite(9,a); delay(8); } for (int a=255; a>=0;a--) //控制PWM亮度減小 { analogWrite(9,a); delay(8); } delay(300); //完成一個循環 }
Analogwrite和占空比的關系
analogwrite(x,y)
X是管腳,而y(value)就是亮度級(在LED中)
占空比的計算方法就是:
占空比=y/256
對於Analogwrite占空比的一個特殊之處的解釋
對於快速PWM模式,如果我們代碼用了analogWrite(9, 0)即Y(value)=0,實際上應該有1/256的占空比,然而實際輸出的電平為0.這是因為在Arduino的強制設定,當檢測到AnalogWrite的value為0,那么就等於關閉了PWM.所以帶來的問題是,如果我們設置analogWrite(9, 1),那么占空比2/256,所以在0到1之間產生了一個跳躍,丟棄了占空比為1/256的情況.
總結
這次的python實驗中,讓我們嘗試了怎么使用Arduino和LED燈做出呼吸燈的效果,因為對於機器是怎么輸出高電平(5v)和低電平(0v)之間的電壓好奇,所以探究了一下原理,總結來說就是機器通過pwm在管腳產生了一定占空比的方波,改變空占比就等同於改變了等效電壓,所以使得燈泡的亮度發生了變化.