準備器材:
開發板(Arduino UNO)麵包板1塊麵包板跳線LED燈:1個220Ω電阻:1個電位器:1個(可選)
PWM
脈衝寬度調製(Pulse Width Modulation,PWM),簡稱脈寬調製。是將模擬信號變為脈衝的一種技術(用數字來控制模擬輸出的一種手段)。PWM可以控制LED亮度、控制馬達速度、控制直流電動機的速度等
Arduino數字引腳給我們提供了5V(高電平)和0V(低電平),輸出是方波信號。我們無法得到0-5V之間的電壓(串聯電阻可以),但是我們可以通過改變信號的開關時間來改變LED亮度(即控制佔空比)
PWM是一種方波控制信號,方波高電平的寬度在一個周期裡的佔比被稱為佔空比(Duty Cycle)。改變PWM的佔空比,可以改變輸出信號的平均電壓,實現模擬電壓的輸出。
在Arduino UNO中,可以看到板上有指明`PWN~`,也就是帶波浪號的3, 5, 6, 9, 10, 11這些數字接口是支持PWM的,我們可以通過analogWrite(pin, value)來設置佔空比,value的取值在0-255之間(255表是100%佔空比,即LED燈最亮)。(值得注意的是,也可以使用digitalWrite和delayMicroseconds來手動重複打開和關閉引腳以達到PWM的效果,這樣就不需要一定接入帶波浪號的PWM接口了,但是這種方法一旦有其他進程幹擾CPU會導致輸出的信號頻率不準)
接線
跟之前一樣,常規的LED接線圖
在Arduino中,我們只需要不斷改變analogWrite的value(0-255),就能改變佔空比進而改變LED燈的亮度,實現呼吸燈的效果
代碼 & 效果
接好線檢查一下,然後打開Arduino IDE敲代碼
int ledPin = 6;void setup() {pinMode(ledPin, OUTPUT);}void loop() { for(int i=0; i<255; i++) { analogWrite(ledPin, i); delay(5); } for(int i=255; i>0; i--) { analogWrite(ledPin, i); delay(5); }}
這邊兩個for循環,是的analogWrite輸出的value從0變到255,再從255變到0,這樣就有呼吸燈的效果(當執行analogWrite後,埠會輸出一個穩定佔空比的方波,直到下一個命令來改變它)。值得注意的是這邊每次analogWrite之後都要有一個短暫的delay(不設置的話看不到效果,LED燈會常亮,設置大呼吸就慢,設置小呼吸就快)
效果如下:
電位器
電位器是可調電阻、可變電阻(VR,Variable Resistor),就是能動態調整電阻阻值大小的一種元器件。電位器有三個針腳,其中兩個(兩邊針腳)是固定的,一個(中間針腳)是滑動可變的。電位器不分正負極,只要將兩邊引腳分別接入正負極,中間接入元器件即可
擴展
我們將接入電位器(接入電位器可能要稍微用一點點力氣將3個針腳壓入),實現使用電位器來控制LED燈的亮度(當然也可以通過電位器改變LED燈的呼吸頻率)
接好線檢查一下,然後打開Arduino IDE敲代碼
// led接入數字針腳int ledPin = 6;// 電位器接入模擬針腳int potPin = A0;// 從電位器讀取到int readValue;// 輸出到led的佔空比的值int ledValue;void setup() {pinMode(ledPin, OUTPUT);}void loop() { // 從電位器讀取模擬信號 readValue = analogRead(potPin); // 等比映射,將位於[0, 1023]之間的readValue映射到[0, 255]. ledValue = map(readValue, 0, 1023, 0, 255); analogWrite(ledPin, ledValue);// delay(1);}
因為analogRead從模擬引腳讀取的值的範圍為0-1023之間,但是analogWrite的模擬值範圍為0-255之間,因此需要用map函數來進行等比映射,將0-1023之間的值映射成0-255之間的值,當然你也可以自己用除法去轉換。
實驗效果如下: