PWM 是“脈沖寬度調(diào)制”的意思。
PWM 實(shí)際上是在單片機(jī)的某個(gè)引腳輸出一系列的矩形波,其周期一般是固定的;而其高電平、低電平所占用的時(shí)間,是可以受控調(diào)整的。
高電平、低電平所占用的時(shí)間之比,稱為占空比,其值為0~1之間。
PWM 的應(yīng)用很廣,簡(jiǎn)單的說(shuō),它可以控制燈光的亮度、可以控制直流電機(jī)的轉(zhuǎn)速,甚至還可以輸出語(yǔ)音信號(hào)。
新型的單片機(jī),往往都含有硬件的 PWM 模塊,編寫程序就很簡(jiǎn)單;而老式的MCS-51系列,就不具備這個(gè)條件。
其實(shí),在沒(méi)有 PWM 硬件的單片機(jī)上實(shí)現(xiàn) PWM,也并不難,只需一個(gè)定時(shí)器,令其工作在中斷方式即可。
下面以網(wǎng)上的一個(gè)題目為例,說(shuō)明實(shí)現(xiàn) PWM 方法。
要求:
1。單片機(jī)的晶振是12MHz,輸出周期為1s。
2。用兩個(gè)開(kāi)關(guān)控制占空比的增加和減少,分20等級(jí)。
針對(duì)這個(gè)題目,做而論道設(shè)計(jì)了一個(gè)簡(jiǎn)單的實(shí)驗(yàn)電路:
在 P2 口的 8 條線輸出 PWM 波形;
在 /INT1、/INT0 外接了兩個(gè)按鍵,用來(lái)調(diào)整占空比;
在 P0 口外接了兩個(gè) BCD 數(shù)碼顯示器,用來(lái)顯示當(dāng)前的占空比的等級(jí)。
實(shí)驗(yàn)的時(shí)候,可以使用示波器來(lái)觀察 P2 口輸出的波形。
如果把 PWM 波形的頻率提高,也可以用 LED 觀察到漸亮漸暗的效果,目前看,只是閃爍的時(shí)間發(fā)生變化。
//程序如下:
//==========================================
#include
unsigned int a, b;
//------------------------------------------
void main()
{
TMOD = 0x01;//T0定時(shí)方式1
TH0 = (65536-50000) / 256;//50ms@12MHz
TL0 = (65536-50000) % 256;
TR0 = 1;
ET0 = 1;
EX0 = 1; EX1 = 1;
IT0 = 1; IT1 = 1;
EA = 1;
a = 0;
b = 10;
while(1);
}
//------------------------------------------
void time0() interrupt 1
{
TL0 = (65536-50000) % 256;
TH0 = (65536-50000) / 256;//50ms@12MHz
a++;
if(a == 20) a = 0;//在這里調(diào)整周期。
if(a 《 b) P2 = 0xff;//在這里調(diào)整占空比。
elseP2 = 0x00;
P0 = ((b / 10) 《《 4) + b % 10; //顯示占空比等級(jí)
}
//------------------------------------------
void X0_INT() interrupt 0
{
b++;
if(b 》 19) b = 19;//占空比等級(jí)最大為19
}
//------------------------------------------
void X1_INT() interrupt 2
{
b--;
if(b 《 1) b = 1;//占空比等級(jí)最小為1.
}
//==========================================
//電路以及仿真效果如下圖:
這個(gè)程序時(shí)我在剛學(xué)單片機(jī)是轉(zhuǎn)來(lái)的,今天我想就這個(gè)程序說(shuō)兩句。按功能要求來(lái)說(shuō)這個(gè)程序是沒(méi)有問(wèn)題的,我想說(shuō)的是——用pwm控制直流電機(jī)在你用硬件調(diào)試調(diào)試這個(gè)程序時(shí),你會(huì)發(fā)現(xiàn)個(gè)問(wèn)題:當(dāng)你按下按鈕減小占空比時(shí)直流電機(jī)是轉(zhuǎn)一下停一下的用眼睛或者耳朵都是能分辨的。當(dāng)然用pwm控制直流電機(jī)本來(lái)就是轉(zhuǎn)下停下的,因?yàn)閜wm就是有連續(xù)的一高一低電平。當(dāng)他為高電平時(shí)電機(jī)轉(zhuǎn)低電平時(shí)就停。我們現(xiàn)在要做的就是讓電機(jī)的轉(zhuǎn)動(dòng)給我們的感覺(jué)是連續(xù)的,當(dāng)然這肯定還是要從pwm下手。
要做到電機(jī)流暢的轉(zhuǎn)動(dòng)其實(shí)很簡(jiǎn)單,只要將pwm電平的周期縮短(頻率升高)就行了也就是減小產(chǎn)生中斷的時(shí)間(初值設(shè)大點(diǎn))。
這個(gè)程序還是有很大的缺陷的,在protues上仿真有些問(wèn)題是發(fā)現(xiàn)不了的。而這里出現(xiàn)的問(wèn)題也是典型的——按鍵消抖。這個(gè)程序里是沒(méi)有消抖的(如果進(jìn)行了硬件消抖,這是沒(méi)有問(wèn)題的)。用按鍵來(lái)產(chǎn)生一個(gè)中斷肯定是要消抖的,不管是硬件的還是軟件的。在protues上兩樣都不用的話,仿真也是能通過(guò)的,所已說(shuō)仿真通過(guò)不一定能在硬件上實(shí)現(xiàn)你想要的功能。
以上為轉(zhuǎn)載
如果只是簡(jiǎn)單的想產(chǎn)生一定占空比的矩形信號(hào)可以對(duì)定時(shí)器這樣使用,道理同上
比如要P3^6產(chǎn)生占空比為30%的1KHZ的矩形波。
void timer() interrupt 1 //產(chǎn)生1khz的占空比為
{
TH0=(65536-100)/256; //定時(shí)產(chǎn)生0.1KHZ的波形
TL0=(65536-100)%6;
a++;
if(a==3) //定時(shí)器運(yùn)行3次指向下一句
P3^6=1;
else if (a==10) //記到10次時(shí)執(zhí)行下一句
P3^6=0;
a=0;
}
也可以將紅字設(shè)置為變量,用按鍵控制產(chǎn)生不同占空比、不同頻率的矩形波。
評(píng)論