0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

阻塞方式、中斷方式以及定時(shí)器捕獲功能

電子設(shè)計(jì) ? 來源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2022-02-10 10:12 ? 次閱讀

PWM(Pulse Width Modulation),一般指脈沖寬度調(diào)節(jié),是利用微處理器的數(shù)字輸出來對(duì)模擬電路進(jìn)行控制的一種非常有效的技術(shù),廣泛應(yīng)用在從測(cè)量、通信到功率控制與變換的許多領(lǐng)域中,比如LED亮度調(diào)節(jié)、電機(jī)轉(zhuǎn)速控制等。

而在某些特殊應(yīng)用中,我們也需要通過測(cè)量輸入PWM的占空比,來實(shí)現(xiàn)不同的輸出控制,這就需要使用到PWM占空比的測(cè)量方法。這里介紹三種不同的測(cè)量方法:阻塞方式、中斷方式以及定時(shí)器捕獲功能。

1. 阻塞方式

MCU阻塞方式測(cè)量PWM占空比的原理比較簡(jiǎn)單,也只需要使用到一個(gè)普通的IO端口(設(shè)置為輸入模式,對(duì)于51而言那就是一個(gè)普通的雙向口具體實(shí)現(xiàn)流程為:

等待上升沿到來,然后開啟定時(shí)器,開始計(jì)時(shí);

等待下降沿到來,記錄下定時(shí)器的計(jì)數(shù)值,即得到PWM的高電平時(shí)間H;

同時(shí),清零定時(shí)器,重新開始計(jì)數(shù);

等待上升沿到來,記錄下定時(shí)器的計(jì)數(shù)值,即得到PWM的低電平時(shí)間L;

計(jì)算得出占空比:duty = H / (H + L);

阻塞方式原理簡(jiǎn)單,而且只需要MCU有一個(gè)定時(shí)器的資源即可實(shí)現(xiàn);但采集時(shí)阻塞CPU運(yùn)行,阻塞的時(shí)間和輸入PWM的周期相關(guān),只適用于實(shí)時(shí)性較低的系統(tǒng)。

另外,上述流程中存在著一個(gè)嚴(yán)重的BUG,即當(dāng)輸入的PWM占空比為0%或者100%時(shí),程序會(huì)被一直阻塞,等待上升沿/下降沿的到來。所以解決方法是,在等待上升沿/下降沿的過程中,實(shí)時(shí)提取定時(shí)器的值,一旦定時(shí)時(shí)間超過1個(gè)周期的限定(一般可定義為2-3個(gè)周期時(shí)間),即退出等待,并根據(jù)端口電平判斷此時(shí)占空比為0%(低電平)或100%(高電平)。

示例代碼,僅供參考:

//獲取PWM輸入腳的電平

#define PWM_IN() xxxxxx

//定義超時(shí)時(shí)間(如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采集原理與阻塞方式相同,只是將判定移動(dòng)至外部中斷中。開啟MCU端口的外部中斷(上升沿和下降沿中斷);如果MCU外部中斷觸發(fā)不支持上升和下降沿中斷,則先開啟上升沿中斷,在中斷處理中切換中斷觸發(fā)條件。

處理方法:在中斷處理函數(shù)中,根據(jù)當(dāng)前電平狀態(tài),記錄下定時(shí)器的值,并清零定時(shí)器的值,重新開始下一輪計(jì)時(shí)。

0%和100%的處理:設(shè)定一個(gè)定時(shí)遞增的變量,同時(shí)在外部中斷中執(zhí)行清零操作。若該變量超過一定值(說明外部中斷有較長(zhǎng)時(shí)間沒有觸發(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; //記錄低電平時(shí)間

TH1 = 0;

TL1 = 0;

}

else

{

pwm_H = (TH1 《《 8) | TL1; //記錄高電平時(shí)間

TH1 = 0;

TL1 = 0;

}

//該變量定時(shí)遞增(如1ms遞增1),在外部中斷中清零

//在主程序中判斷,超過一定值時(shí)認(rèn)為PWM占空比為0%或100%

pwm_time_out = 0;

return;

}

注:使用中斷方式,則占空比計(jì)算不建議放在中斷中處理;同時(shí),為了保證占空比的準(zhǔn)確性,可以連續(xù)2-3次計(jì)算結(jié)果一致時(shí),再確定當(dāng)前占空比的結(jié)果。

3. MCU捕獲方式

采用捕獲方式的前提是MCU支持捕獲功能。當(dāng)前部分廠家推出的51內(nèi)核單片機(jī),會(huì)包含一個(gè)定時(shí)器2,其擁有捕獲功能;或者采用32位單片機(jī),一般都帶有捕獲功能。捕獲的原理很簡(jiǎn)單,當(dāng)上升沿或下降沿來臨時(shí),MCU硬件將定時(shí)器/計(jì)數(shù)器的值保存在一個(gè)影子寄存器中,并產(chǎn)生捕獲中斷。

通過固定每次上升/下降沿的計(jì)數(shù)器值,相減即可分別得出高電平值和低電平值,從而計(jì)算出占空比。

100058870-112761-1.png

下面以某顆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 //定時(shí)器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;

}

//該變量定時(shí)遞增(如1ms遞增1),在外部中斷中清零

//在主程序中判斷,超過一定值時(shí)認(rèn)為PWM占空比為0%或100%

pwm_time_out = 0;

}

}

注: pwm_rise/pwm_fall/pwm_L/pwm_H都必須使用無符號(hào)數(shù),否則相減時(shí)可能得到錯(cuò)誤的值。

總結(jié)

方式一:任何單片機(jī)都可以實(shí)現(xiàn),但是阻塞方式會(huì)使系統(tǒng)的實(shí)時(shí)性變差;

方式二:在使用時(shí),需要保證外部中斷的最高優(yōu)先級(jí),不可以被其他中斷打斷,以保證其準(zhǔn)確性;

方式三:的穩(wěn)定性和準(zhǔn)確性都較高,但是需要MCU硬件支持。

版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/crazy_kismet/article/details/102756206

審核編輯:何安

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6040

    文章

    44594

    瀏覽量

    636941
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    114

    文章

    5196

    瀏覽量

    214373
  • 占空比
    +關(guān)注

    關(guān)注

    0

    文章

    109

    瀏覽量

    29126
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32CUBEMX(5)--自定義紅外NEC解碼,定時(shí)器TIM捕獲方式

    (TIM_HandleTypeDef *htim) { uint32_t fallingCount = 0 ; // 下降沿計(jì)數(shù) uint8_t temp = 0 ; // 判斷是否是定時(shí)器1的外部捕獲口2
    發(fā)表于 09-05 16:19

    定時(shí)器的基本組成和工作模式

    定時(shí)器是計(jì)算機(jī)或電子設(shè)備中常見的一個(gè)硬件或軟件組件,其主要功能是測(cè)量和控制時(shí)間的流逝。它在各種應(yīng)用中起著至關(guān)重要的作用,如操作系統(tǒng)調(diào)度、多媒體播放、網(wǎng)絡(luò)通信、工業(yè)自動(dòng)化控制以及家電設(shè)備的定時(shí)
    的頭像 發(fā)表于 08-19 18:28 ?1537次閱讀

    定時(shí)器的工作方式介紹

    定時(shí)器是計(jì)算機(jī)和嵌入式系統(tǒng)中常見的一種硬件模塊,用于實(shí)現(xiàn)定時(shí)和計(jì)數(shù)功能。定時(shí)器的工作方式通常由一組寄存
    的頭像 發(fā)表于 07-12 10:29 ?1061次閱讀

    定時(shí)器相關(guān)的寄存有哪些類型

    在微控制編程中,定時(shí)器是一種非常常見的功能模塊,用于實(shí)現(xiàn)各種定時(shí)和計(jì)數(shù)功能。定時(shí)器的工作原理是
    的頭像 發(fā)表于 07-12 10:25 ?1028次閱讀

    使用定時(shí)器的編碼接口模式,打開定時(shí)器的溢出中斷,當(dāng)定時(shí)器上溢出和下溢出是,是否都會(huì)產(chǎn)生溢出中斷?

    使用定時(shí)器的編碼接口模式,打開定時(shí)器的溢出中斷,當(dāng)定時(shí)器上溢出和下溢出是,是否都會(huì)產(chǎn)生溢出中斷
    發(fā)表于 05-24 07:41

    求助,關(guān)于STM32定時(shí)器級(jí)聯(lián)做計(jì)數(shù)的問題求解

    最近在做一個(gè)設(shè)計(jì),使用STM32L1的定時(shí)器做一個(gè)大的計(jì)數(shù),每當(dāng)外部PPS信號(hào)進(jìn)來后,利用捕獲功能來計(jì)算捕獲值。這個(gè)計(jì)數(shù)
    發(fā)表于 05-10 06:15

    STM32的GPIO引腳能同時(shí)用作外部中斷定時(shí)器輸入捕獲嗎?

    今天突然在項(xiàng)目中想到一種用法,將GPIO的某一個(gè)引腳,同時(shí)配置外部中斷(在中斷中做一些邏輯)和復(fù)用為定時(shí)器的輸入捕獲引腳。 查看GPIO的原理框圖,感覺可行。找個(gè)機(jī)會(huì)試試這種用法,于是
    發(fā)表于 05-09 08:22

    如何實(shí)現(xiàn)一個(gè)軟件定時(shí)器?

    在Linux,uC/OS,F(xiàn)reeRTOS等操作系統(tǒng)中,都帶有軟件定時(shí)器,原理大同小異。典型的實(shí)現(xiàn)方法是:通過一個(gè)硬件定時(shí)器產(chǎn)生固定的時(shí)鐘節(jié)拍,每次硬件定時(shí)器中斷到,就對(duì)一個(gè)全局的時(shí)間
    的頭像 發(fā)表于 04-29 11:00 ?708次閱讀

    使用dma的方式來傳輸定時(shí)器輸入捕獲的數(shù)據(jù),是不是每隔100ms會(huì)觸發(fā)dma的傳輸完成中斷?

    目前使用dma的方式來傳輸定時(shí)器輸入捕獲的數(shù)據(jù),內(nèi)存數(shù)據(jù)大小為2,使用normal模式,100ms打開dma模式,請(qǐng)問,這種情況下,是不是每隔100ms會(huì)觸發(fā)dma的傳輸完成中斷? 這
    發(fā)表于 04-18 07:47

    在使用一個(gè)定時(shí)器捕獲兩路PWM的頻率時(shí),中斷函數(shù)應(yīng)該如何配置呢?

    在使用一個(gè)定時(shí)器捕獲兩路PWM的頻率時(shí),中斷函數(shù)應(yīng)該如何配置呢?? 我采用如下的方式去獲取,但得到的PWM信號(hào)的占空比其中有一路為200,一路為50, __IO uint16_t I
    發(fā)表于 03-22 06:39

    如果STM32定時(shí)器外接了正交編碼,該剩余通道是否能做PWM輸出呢?

    其實(shí),對(duì)于STM32芯片,編碼輸入信號(hào)就是定時(shí)器的計(jì)數(shù)時(shí)鐘源之一。定時(shí)器外接了編碼輸入,若還有剩余通道的話,剩余通道依然可以實(shí)現(xiàn)輸入捕獲或輸出比較功能。
    的頭像 發(fā)表于 03-21 09:06 ?1895次閱讀
    如果STM32<b class='flag-5'>定時(shí)器</b>外接了正交編碼<b class='flag-5'>器</b>,該剩余通道是否能做PWM輸出呢?

    使用STM32F407定時(shí)器中斷周期不準(zhǔn)怎么解決?

    外置晶振是8M,使用最高的系統(tǒng)時(shí)鐘168M,然后使用定時(shí)器TIM8作為定時(shí)器更新中斷,程序的寄存PLL_N = 336;PLL_P = 2;PLL_M = 8;要配置一個(gè)16KHz,
    發(fā)表于 03-15 07:28

    使用555定時(shí)器的可調(diào)雙定時(shí)器電路

    定時(shí)器 IC 555 是最通用和最常用的 IC 之一,因?yàn)樗膽?yīng)用范圍更廣,如 PWM放大器、延遲定時(shí)器、開關(guān)電路、占空比選擇、時(shí)鐘脈沖發(fā)生等。這也可用于各種應(yīng)用,如精確
    的頭像 發(fā)表于 02-25 15:16 ?2326次閱讀
    使用555<b class='flag-5'>定時(shí)器</b>的可調(diào)雙<b class='flag-5'>定時(shí)器</b>電路

    單片機(jī)外部中斷定時(shí)器中斷的區(qū)別和用法

    單片機(jī)外部中斷定時(shí)器中斷在觸發(fā)來源、應(yīng)用場(chǎng)景以及功能特點(diǎn)上存在明顯差異** **。
    的頭像 發(fā)表于 01-28 17:35 ?3238次閱讀

    555定時(shí)器的基本功能 555定時(shí)器的工作原理及其應(yīng)用

    555定時(shí)器是一種非常常見和常用的集成電路,它具有廣泛的應(yīng)用領(lǐng)域,例如計(jì)時(shí)、頻率分頻、脈沖寬度調(diào)制等。本文將詳細(xì)介紹555定時(shí)器的基本功能、工作原理以及應(yīng)用。 一、555
    的頭像 發(fā)表于 01-18 11:12 ?1.6w次閱讀