使用STM32開發板和mbed平台實現的一個呼吸燈。材料,LED燈,電阻,STM32開發板。
先上一張效果圖。
背景:
我們之前設置GPIO口使用了DigitalOut,數字信號輸出。只能是GPIO口為0或1兩個值。在LED上體現的即是滅和亮。然而現實世界大量的信號都是模擬信號,如溫度、聲音、加速度等。百度上:“模擬信號是指信息參數在給定范圍內表現為連續的信號。 或在一段連續的時間間隔內,其代表信息的特征量可以在任意瞬間呈現為任意數值的信號。”
理論知識(可以跳過):
模擬信號即可以簡單理解為,模擬信號輸出的值,可以是0~1里面連續的值,LED的亮度會隨着電壓的升高而變量,所以說,給LED賦值0~1,就能實現亮度漸變的效果。
但並不是所有微處理器都支持模擬信號輸出的,所以有一種PWM輸出功能,可以實現模擬輸出。
簡單來說就是通過一個時鍾周期內高低電平的不同占空比來表征模擬信號。
簡單的理解就是:連續的電壓,可以用分立的電壓來模擬,只要控制好高電平的持續時間,就能近似的模擬出來。
思路:
1、為LED設置一個PWM輸出口,輸出模擬信號。
2、先讓led為0,即燈滅,再讓燈每隔0.05s 執行led+0.05的亮度,這一步可以實現讓led漸漸變亮。
3、燈全亮,即led=1,然后每隔0.05s,讓led-0.05的亮度。這一步能實現讓led漸漸變暗。
實例代碼:
#include "mbed.h" //PWM輸出口 PwmOut PWM1(D8); //計算亮度 float pv=0; int main() { //一個死循環 while(1){ //如果燈沒有全亮 while (pv<=1) { PWM1=pv; //每隔0.05s變亮0.05 pv=pv+0.05; wait(0.05); } //燈全亮 //如果燈沒滅 while(pv>0){ PWM1=pv; //每隔0.05s變暗0.05 pv=pv-0.05; wait(0.05); } } }
這是模擬信號輸出最簡單的一個應用,如果覺得燈的呼吸效果不明顯的話,可以換一個小的電阻(使全亮時亮度更大),或者調整一下亮度的變化率。