本項目通過單片機I/O口輸出一個PWM脈寬調制信號來控制輸送到LED燈的電壓變化,從而實現控制發(fā)光二極管亮度的效果。通過兩個按鍵控制燈的亮度。系統(tǒng)上電時,燈在最暗狀態(tài),按住其中一個鍵,燈的亮度逐漸增強,增到最亮時,再回到最暗;按住另外一個鍵,燈的亮度逐漸減弱,減到最暗時,再回到最亮。
1、PWM信號
PWM,英文名Pulse Width Modulation,是脈沖寬度調制縮寫,也就是一種周期一定而高低電平可調的方波信號,在一個信號周期中,高電平持續(xù)時間的為T1,低電平持續(xù)時間的為T2 。
占空比:在一個信號周期中,高電平持續(xù)時間與信號周期的比值,即T1/Time。比如,Time=40,T1=20,則占空比=20/40=50%,即方波信號的占空比就是50%.
當輸出脈沖的頻率(周期的倒數)一定時,輸出脈沖的占空比越大,其高電平持續(xù)的時間越長,只要改變T1和T2的值,即改變波形的占空比,達到PWM脈寬調制的目的。
**2、如何實現PWM信號輸出
**
實現PWM信號輸出有兩種方式可實現:一是可以直接通過芯片內部模塊輸出PWM信號,前提是這個I/O口要有集成模塊,只需要配置好頻率和占空比,簡單幾步就好了。這種自帶有PWM輸出的功能模塊在程序設計更簡便,同時數據更精確。如下圖所示,引腳標明PWM的表示硬件支持;
二是通過軟件模擬實現PWM輸出。如果對PWM頻率要求不是很高的話,可以利用I/O口設置一些參數來輸出PWM信號。因為PWM信號其實就是一高一低的一系列電平組合在一起。具體方法是通過定時器控制I/O的高低電平,對于你要求輸出的PWM信號頻率與你的定時器一致,用定時器中斷來計數,通過調整計數值來改變占空比,當然如果要求不高也可以通過軟件延時來實現。
3、PWM信號應用--調光燈案例
交流調光電路,高電平占多一點,也就是占空比大一點亮度就亮一點,占空比小一點亮度就減弱,前提是PWM的頻率要大于我們人眼識別頻率,要不然會出現閃爍現象。下面用單片機控制LED亮度,模擬調光燈效果。調光燈電路原理圖如下所示,通過S2和S3調整LED的亮度。
軟件流程圖:單片機上電,首先初始高電平、低電平延時初始值T1=0,T2=500。然后點亮LED,通過軟件實現延時時間T1;然后熄滅LED,延時時間T2。由于此時T1=0,占空比最小,此時燈在最暗狀態(tài)。
全部實現代碼如下:
#include
//定義三個位變量,分別對應按鍵S2、S3
sbit key_plus=P3^2;//LED——count+1
sbit key_minus=P3^3;//LED——count-1
sbit LED=P1^3;
//延時函數
void delay(unsigned int i)
{
unsigned int k;
for(k=0;k
}
void main()
{
//定義一個記錄LED亮燈個數變量
int T1,T2;
T1=0;//低電平持續(xù)時間
T2=500;//高電平持續(xù)時間
//循環(huán)處理按鍵,控制LED亮度
while(1)
{
LED=0;//點亮LED
delay(T1);//亮燈延時時間
LED=1;//熄滅LED
delay(T2);//熄滅延時時間
//判斷按鍵S2的狀態(tài),占空比增加
if(0==key_plus)
{
delay(100);//10ms消抖
if(0==key_plus)//再次檢測按鍵是否按下
{
T1++;
T2--;
if(0==T2)//如果LED燈已經最亮,使其變?yōu)樽畎?/span>
{
T1=0;//低電平持續(xù)時間
T2=500;//高電平持續(xù)時間
}
}
}
//判斷按鍵S3的狀態(tài),占空比減小
if(0==key_minus)
{
delay(100);//10ms消抖
if(0==key_minus)//再次檢測按鍵是否按下
{
T1--;
T2++;
if(0==T1)//如果LED燈已經最亮,使其變?yōu)樽畎?/span>
{
T1=500;//低電平持續(xù)時間
T2=0;//高電平持續(xù)時間
}
}
}
}
}
收錄于合集 **#**單片機
47個
上一篇PWM工作原理----調光燈案例下一篇實用:牛人總結的單片機三種應用程序架構!
-
PWM
+關注
關注
114文章
5121瀏覽量
213227 -
發(fā)光二極管
+關注
關注
13文章
1192瀏覽量
66154 -
電平
+關注
關注
5文章
357瀏覽量
39817 -
脈寬調制
+關注
關注
3文章
215瀏覽量
38272
發(fā)布評論請先 登錄
相關推薦
評論