女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2022-02-10 10:12 ? 次閱讀

PWM(Pulse Width Modulation),一般指脈沖寬度調節,是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術,廣泛應用在從測量、通信到功率控制與變換的許多領域中,比如LED亮度調節、電機轉速控制等。

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

1. 阻塞方式

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

等待上升沿到來,然后開啟定時器,開始計時;

等待下降沿到來,記錄下定時器的計數值,即得到PWM的高電平時間H;

同時,清零定時器,重新開始計數;

等待上升沿到來,記錄下定時器的計數值,即得到PWM的低電平時間L;

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

阻塞方式原理簡單,而且只需要MCU有一個定時器的資源即可實現;但采集時阻塞CPU運行,阻塞的時間和輸入PWM的周期相關,只適用于實時性較低的系統。

另外,上述流程中存在著一個嚴重的BUG,即當輸入的PWM占空比為0%或者100%時,程序會被一直阻塞,等待上升沿/下降沿的到來。所以解決方法是,在等待上升沿/下降沿的過程中,實時提取定時器的值,一旦定時時間超過1個周期的限定(一般可定義為2-3個周期時間),即退出等待,并根據端口電平判斷此時占空比為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 //當前為低電平,則開始等待高電平

{

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外部中斷觸發不支持上升和下降沿中斷,則先開啟上升沿中斷,在中斷處理中切換中斷觸發條件。

處理方法:在中斷處理函數中,根據當前電平狀態,記錄下定時器的值,并清零定時器的值,重新開始下一輪計時。

0%和100%的處理:設定一個定時遞增的變量,同時在外部中斷中執行清零操作。若該變量超過一定值(說明外部中斷有較長時間沒有觸發),則判定為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),在外部中斷中清零

//在主程序中判斷,超過一定值時認為PWM占空比為0%或100%

pwm_time_out = 0;

return;

}

注:使用中斷方式,則占空比計算不建議放在中斷中處理;同時,為了保證占空比的準確性,可以連續2-3次計算結果一致時,再確定當前占空比的結果。

3. MCU捕獲方式

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

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

100058870-112761-1.png

下面以某顆51內核的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中斷標志位

{

CCCON &= 0xFD; //清除中斷標志

if (PWM_IN()) //上升沿觸發

{

pwm_rise = CC1; //獲取捕獲寄存器中的值

pwm_L = pwm_rise - pwm_fall;

}

else

{

pwm_fall = CC1; //獲取捕獲寄存器中的值

pwm_H = pwm_fall - pwm_rise;

}

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

//在主程序中判斷,超過一定值時認為PWM占空比為0%或100%

pwm_time_out = 0;

}

}

注: pwm_rise/pwm_fall/pwm_L/pwm_H都必須使用無符號數,否則相減時可能得到錯誤的值。

總結

方式一:任何單片機都可以實現,但是阻塞方式會使系統的實時性變差;

方式二:在使用時,需要保證外部中斷的最高優先級,不可以被其他中斷打斷,以保證其準確性;

方式三:的穩定性和準確性都較高,但是需要MCU硬件支持。

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

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

審核編輯:何安

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6063

    文章

    44925

    瀏覽量

    647119
  • PWM
    PWM
    +關注

    關注

    116

    文章

    5386

    瀏覽量

    218138
  • 占空比
    +關注

    關注

    0

    文章

    112

    瀏覽量

    29473
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    第十二章 SysTick——系統定時器

    本章介紹了W55MH32的SysTick系統定時器,它是24位遞減計數,含4個寄存,可配置定時中斷,用于產生時基 等。
    的頭像 發表于 05-22 17:16 ?326次閱讀
    第十二章 SysTick——系統<b class='flag-5'>定時器</b>

    MCU定時器/計數

    架構與功能特性? 定時器類型與配置? 高級控制定時器?:支持互補PWM輸出與剎車功能,適用于電機驅動等高精度控制場景。通用定時器?:集成輸入
    的頭像 發表于 04-27 13:54 ?176次閱讀

    STM32G474HRTIM使用HRTIM配置了主定時器中斷,為啥調試的跳轉到硬件中斷,進不去定時器中斷,為什么?

    各位大佬,我使用HRTIM配置了主定時器中斷,為啥調試的跳轉到硬件中斷,進不去定時器中斷 下面是我的初始化代碼
    發表于 03-13 08:17

    STM32H723使用DMA方式實現定時器輸入捕獲只能執行一次嗎?

    目的:我們希望在 STM32H723 平臺上以 DMA 模式實現定時器輸入捕獲,而不中斷當前問題:使用 Cube MX 配置相關參數,只使用 TIM4 的 CH2 作為輸入采集直接模式,Slave
    發表于 03-12 08:21

    定時器是不是有編碼輸入功能

    你好,我想請教一下定時器是不是有編碼輸入功能,是高級定時器和通用定時器都有嗎,還是不一定,具體要看手冊,能幫我看一下STM32G473有幾
    發表于 03-11 07:07

    詳解CKS32F107xx系列的定時器同步功能

    我們將圍繞定時器同步功能概述展開,并以其中一種功能為例——將定時器2給定時器3當預分頻,最終級
    的頭像 發表于 11-26 17:51 ?949次閱讀
    詳解CKS32F107xx系列的<b class='flag-5'>定時器</b>同步<b class='flag-5'>功能</b>

    STM32CUBEMX(8)--USART通過定時器中斷方式接收不定長數據

    配置 本次實驗使用的串口1進行串口通信,波特率配置為115200。 中斷 GPIO配置 板子上led為PA5端口,故設置PA5閃爍來驗證是否正確。 定時器配置 本次實驗使用的是TIM3來進行計數
    發表于 09-06 16:48

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

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

    定時器的基本組成和工作模式

    定時器是計算機或電子設備中常見的一個硬件或軟件組件,其主要功能是測量和控制時間的流逝。它在各種應用中起著至關重要的作用,如操作系統調度、多媒體播放、網絡通信、工業自動化控制以及家電設備的定時
    的頭像 發表于 08-19 18:28 ?2468次閱讀

    定時器的工作方式介紹

    定時器是計算機和嵌入式系統中常見的一種硬件模塊,用于實現定時和計數功能定時器的工作方式通常由一組寄存
    的頭像 發表于 07-12 10:29 ?1719次閱讀

    定時器相關的寄存有哪些類型

    在微控制編程中,定時器是一種非常常見的功能模塊,用于實現各種定時和計數功能定時器的工作原理是
    的頭像 發表于 07-12 10:25 ?1555次閱讀

    如何將定時器配置為計數,并在輸入引腳(傳感中斷時開始計數?

    如何將定時器配置為計數,并在輸入引腳(傳感中斷時開始計數? 需要定時器的詳細設置以及如何處
    發表于 07-05 08:00

    是否可以使用Aurix中的CCU6模塊,以非阻塞方式在檢測到GPIO下降沿時觸發中斷

    我想知道,是否可以使用 Aurix 中的 CCU6 模塊,以非阻塞方式在檢測到 GPIO 下降沿時觸發中斷? TC397 的示例代碼僅將其用于 PWM 生成和時鐘定時,但我很好奇如何將
    發表于 07-04 07:00

    三菱plc如何顯示定時器時間

    三菱PLC(Programmable Logic Controller,可編程邏輯控制)是一種廣泛應用于工業自動化領域的設備。定時器是PLC中的一種基本功能,用于實現延時控制、計時控制等功能
    的頭像 發表于 06-20 11:10 ?3120次閱讀

    PLC定時器的工作原理和應用

    在工業自動化控制系統中,PLC(Programmable Logic Controller,可編程邏輯控制)因其強大的控制功能和靈活性而得到廣泛應用。作為PLC的重要組成部分,定時器在其中扮演著
    的頭像 發表于 06-18 11:55 ?4113次閱讀