資料介紹
PWM(Pulse Width Modulation),一般指脈沖寬度調(diào)節(jié),是利用微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種非常有效的技術(shù),廣泛應(yīng)用在從測量、通信到功率控制與變換的許多領(lǐng)域中,比如LED亮度調(diào)節(jié)、電機(jī)轉(zhuǎn)速控制等。
而在某些特殊應(yīng)用中,我們也需要通過測量輸入PWM的占空比,來實現(xiàn)不同的輸出控制,這就需要使用到PWM占空比的測量方法。這里介紹三種不同的測量方法:阻塞方式、中斷方式以及定時器捕獲功能。
1. 阻塞方式
MCU阻塞方式測量PWM占空比的原理比較簡單,也只需要使用到一個普通的IO端口(設(shè)置為輸入模式,對于51而言那就是一個普通的雙向口具體實現(xiàn)流程為:
- 等待上升沿到來,然后開啟定時器,開始計時;
- 等待下降沿到來,記錄下定時器的計數(shù)值,即得到PWM的高電平時間H;
- 同時,清零定時器,重新開始計數(shù);
- 等待上升沿到來,記錄下定時器的計數(shù)值,即得到PWM的低電平時間L;
- 計算得出占空比:duty = H / (H + L);
阻塞方式原理簡單,而且只需要MCU有一個定時器的資源即可實現(xiàn);但采集時阻塞CPU運(yùn)行,阻塞的時間和輸入PWM的周期相關(guān),只適用于實時性較低的系統(tǒng)。
另外,上述流程中存在著一個嚴(yán)重的BUG,即當(dāng)輸入的PWM占空比為0%或者100%時,程序會被一直阻塞,等待上升沿/下降沿的到來。所以解決方法是,在等待上升沿/下降沿的過程中,實時提取定時器的值,一旦定時時間超過1個周期的限定(一般可定義為2-3個周期時間),即退出等待,并根據(jù)端口電平判斷此時占空比為0%(低電平)或100%(高電平)。
示例代碼,僅供參考:
//獲取PWM輸入腳的電平 #define PWM_IN() xxxxxx //定義超時時間(如2-3倍PWM周期) #define T1_TIMEOUT xxxxxx uint8_t PWM_Analyse(void) { uint8_t duty = 0xFF; uint16_t pwm_H = 0; uint16_t pwm_L = 0; if (PWM_IN()) //初始為高電平,則開始等待低電平 { TH1 = 0; while (PWM_IN()) //等待下降沿 { if (TH1 >= T1_TIMEOUT) //下降沿沒有到來,判定為100%占空比 { duty = 100; return duty; } } TH1 = 0; TL1 = 0; while (!PWM_IN()) //等待上升沿 { if (TH1 >= T1_TIMEOUT) //上升沿沒有到來,判定為0%占空比 { duty = 0; return duty; } } pwm_L = (TH1 << 8) | TL1; TH1 = 0; TL1 = 0; while (PWM_IN()) //等待下降沿 { if (TH1 >= T1_TIMEOUT) //下降沿沒有到來,判定為100%占空比 { duty = 100; return duty; } } pwm_H = (TH1 << 8) | TL1; duty = pwm_H * 100 / (pwm_H + pwm_L); return duty; } else //當(dāng)前為低電平,則開始等待高電平 { TH1 = 0; while (!PWM_IN()) //等待上升沿 { if (TH1 >= T1_TIMEOUT) //上升沿沒有到來,判定為0%占空比 { duty = 0; return duty; } } TH1 = 0; TL1 = 0; while (PWM_IN()) //等待下降沿 { if (TH1 >= T1_TIMEOUT) //下降沿沒有到來,判定為100%占空比 { duty = 100; return duty; } } pwm_H = (TH1 << 8) | TL1; TH1 = 0; TL1 = 0; while (!PWM_IN()) //等待上升沿 { if (TH1 >= T1_TIMEOUT) //上升沿沒有到來,判定為0%占空比 { duty = 0; return duty; } } pwm_L = (TH1 << 8) | TL1; duty = pwm_H * 100 / (pwm_H + pwm_L); return duty; } return 0xFF; }
2. 中斷方式
中斷方式的PWM采集原理與阻塞方式相同,只是將判定移動至外部中斷中。開啟MCU端口的外部中斷(上升沿和下降沿中斷);如果MCU外部中斷觸發(fā)不支持上升和下降沿中斷,則先開啟上升沿中斷,在中斷處理中切換中斷觸發(fā)條件。
處理方法:在中斷處理函數(shù)中,根據(jù)當(dāng)前電平狀態(tài),記錄下定時器的值,并清零定時器的值,重新開始下一輪計時。
0%和100%的處理:設(shè)定一個定時遞增的變量,同時在外部中斷中執(zhí)行清零操作。若該變量超過一定值(說明外部中斷有較長時間沒有觸發(fā)),則判定為0%或100%。
uint16_t pwm_H = 0; uint16_t pwm_L = 0; uint16_t pwm_time_out = 0; void EXT1_ISR(void) interrupt EXTI1_VECTOR { if (PWM_IN()) { pwm_L = (TH1 << 8) | TL1; //記錄低電平時間 TH1 = 0; TL1 = 0; } else { pwm_H = (TH1 << 8) | TL1; //記錄高電平時間 TH1 = 0; TL1 = 0; } //該變量定時遞增(如1ms遞增1),在外部中斷中清零 //在主程序中判斷,超過一定值時認(rèn)為PWM占空比為0%或100% pwm_time_out = 0; return; }
注:使用中斷方式,則占空比計算不建議放在中斷中處理;同時,為了保證占空比的準(zhǔn)確性,可以連續(xù)2-3次計算結(jié)果一致時,再確定當(dāng)前占空比的結(jié)果。
3. MCU捕獲方式
采用捕獲方式的前提是MCU支持捕獲功能。當(dāng)前部分廠家推出的51內(nèi)核單片機(jī),會包含一個定時器2,其擁有捕獲功能;或者采用32位單片機(jī),一般都帶有捕獲功能。捕獲的原理很簡單,當(dāng)上升沿或下降沿來臨時,MCU硬件將定時器/計數(shù)器的值保存在一個影子寄存器中,并產(chǎn)生捕獲中斷。
通過固定每次上升/下降沿的計數(shù)器值,相減即可分別得出高電平值和低電平值,從而計算出占空比。
下面以某顆51內(nèi)核的MCU為例,提供示例代碼:
unsigned int pwm_fall = 0, pwm_rise = 0; volatile unsigned int pwm_H; volatile unsigned int pwm_L; volatile unsigned char pwm_time_out; //------------------------------------------------------------ void T2_interrupt(void) interrupt 5 //定時器2中斷; { if (CCCON & 0x02) //CC1中斷標(biāo)志位 { CCCON &= 0xFD; //清除中斷標(biāo)志 if (PWM_IN()) //上升沿觸發(fā) { pwm_rise = CC1; //獲取捕獲寄存器中的值 pwm_L = pwm_rise - pwm_fall; } else { pwm_fall = CC1; //獲取捕獲寄存器中的值 pwm_H = pwm_fall - pwm_rise; } //該變量定時遞增(如1ms遞增1),在外部中斷中清零 //在主程序中判斷,超過一定值時認(rèn)為PWM占空比為0%或100% pwm_time_out = 0; } }
注: pwm_rise/pwm_fall/pwm_L/pwm_H都必須使用無符號數(shù),否則相減時可能得到錯誤的值。
總結(jié)
方式一:任何單片機(jī)都可以實現(xiàn),但是阻塞方式會使系統(tǒng)的實時性變差;
方式二:在使用時,需要保證外部中斷的最高優(yōu)先級,不可以被其他中斷打斷,以保證其準(zhǔn)確性;
方式三:的穩(wěn)定性和準(zhǔn)確性都較高,但是需要MCU硬件支持。
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/crazy_kismet/article/details/102756206
- 基于51單片機(jī)的占空比可調(diào)方波(PWM)例程源代碼 26次下載
- 單片機(jī)測量PWM占空比的三種方法
- 單片機(jī) PWM 占空比計算
- 51單片機(jī)用三種方法實現(xiàn)流水燈(超詳細(xì))
- AVR單片機(jī)在電機(jī)轉(zhuǎn)速測量中兩種方法總結(jié)
- 單片機(jī)軟件模擬PWM調(diào)光程序下載 65次下載
- 三種常見的STM32單片機(jī)的燒寫方法 34次下載
- python統(tǒng)計詞頻的三種方法 2次下載
- 單片機(jī)實現(xiàn)流水燈功能的三種常用方法資料下載
- 51單片機(jī)模擬PWM輸出占空比可調(diào)的源代碼程序免費(fèi)下載 105次下載
- 使用51單片機(jī)按鍵控制輸出PWM的占空比的資料和程序免費(fèi)下載
- 使用單片機(jī)PWM信號控制進(jìn)行智能小車的實現(xiàn)方法資料說明 19次下載
- 配比鹽霧試驗所用鹽水溶液的三種方法及教程 0次下載
- 51系列單片機(jī)輸出PWM的兩種方法 11次下載
- 單片機(jī)軟件產(chǎn)生高頻方波的一種方法
- MCUXpresso IDE下在線聯(lián)合調(diào)試雙核MCU工程的三種方法 636次閱讀
- 三菱M70 PLC增加注解的三種方法簡析 1129次閱讀
- 傳統(tǒng)激光功率衰減的三種方法 1827次閱讀
- 如何用三種不同的方法來用按鈕控制燈光 2984次閱讀
- 噪聲系數(shù)測量的三種方法 1346次閱讀
- 獲得更高輸出電流的三種方法 6255次閱讀
- 如何測量PWM波占空比 1.8w次閱讀
- 單片機(jī)大致應(yīng)用程序的三種架構(gòu)總結(jié)、方法的利弊和適應(yīng)范圍 3295次閱讀
- plc控制變頻器的三種方法 2.8w次閱讀
- 單片機(jī)加密的三種方法詳細(xì)說明 1.4w次閱讀
- 51單片機(jī)實現(xiàn)PWM輸出功能的兩種方法解析 2.1w次閱讀
- 電感變壓器漆包線快速去漆的三種方法盤點 1.5w次閱讀
- 51單片機(jī)模擬串口的三種方法 3w次閱讀
- (純干貨)使用STM32測量頻率和占空比的幾種方法 4.3w次閱讀
- MCS-51單片機(jī)控制跑馬燈的三種方法 4.6w次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費(fèi)
- 2開關(guān)電源基礎(chǔ)知識
- 5.73 MB | 6次下載 | 免費(fèi)
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計
- 0.60 MB | 3次下載 | 免費(fèi)
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計與實現(xiàn)
- 0.61 MB | 2次下載 | 免費(fèi)
- 6基于FPGA的C8051F單片機(jī)開發(fā)板設(shè)計
- 0.70 MB | 2次下載 | 免費(fèi)
- 751單片機(jī)窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費(fèi)
- 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計實例指南
- 未知 | 21548次下載 | 免費(fèi)
- 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動電路設(shè)計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191185次下載 | 免費(fèi)
- 7十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183278次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評論
查看更多