91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2022-02-10 10:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

1. 阻塞方式

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

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

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

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

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

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

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

另外,上述流程中存在著一個嚴重的BUG,即當輸入的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 //當前為低電平,則開始等待高電平

{

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ù)當前電平狀態(tài),記錄下定時器的值,并清零定時器的值,重新開始下一輪計時。

0%和100%的處理:設定一個定時遞增的變量,同時在外部中斷中執(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),在外部中斷中清零

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

pwm_time_out = 0;

return;

}

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

3. MCU捕獲方式

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

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

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 //定時器2中斷;

{

if (CCCON & 0x02) //CC1中斷標志位

{

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

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),在外部中斷中清零

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

pwm_time_out = 0;

}

}

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

總結(jié)

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

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

方式三:的穩(wě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

審核編輯:何安

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

    關注

    6077

    文章

    45513

    瀏覽量

    671434
  • PWM
    PWM
    +關注

    關注

    116

    文章

    5875

    瀏覽量

    225933
  • 占空比
    +關注

    關注

    0

    文章

    113

    瀏覽量

    30277
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    CW32定時器及其中斷介紹

    以CW32L083為例,其定時器分為6種: 基本定時器:CW32L083 內(nèi)部集成 3 個基本定時器 (BTIM),每個 BTIM 完全獨立且功能完全相同,各包含一個 16bit 自
    發(fā)表于 01-14 06:42

    LAT1173高精度定時器的同步功能應用筆記

    STM32G474 所含的高精度定時器(HRTIMER)其實包含了多個定時器,多個定時器之間可以單獨工作,也可以進行同步,且高精度定時器還能與片上的其他
    發(fā)表于 01-11 17:32 ?0次下載

    LAT1183+高精度定時器中 single-shot 計數(shù)模式不工作應用筆記

    客戶使用 STM32G474 的高精度定時器,基于 CubeMX 進行外設配置與代碼生成,將某個子定時器的計數(shù)方式設置為 retriggerable single shot 方式,發(fā)現(xiàn)
    發(fā)表于 01-11 17:28 ?0次下載

    定時器中斷什么時候自動清零TF溢出標志位?

    1.是在進入中斷的那一刻就自動清TF還是在中斷處理完后才清TF? 2.在處理中斷程序的過程中,計數(shù)還在做加1的定時計數(shù)工作嗎? 3.如果用
    發(fā)表于 01-06 06:06

    CW32通用定時器—輸出比較

    PWM,用這種方式輸出的方波也叫做PWM波。 現(xiàn)在來看使用PWM功能需要進行哪些操作。先思考,除去基本的定時器配置之外,PWM需要用到捕獲比較通道,那必然會有對比較
    發(fā)表于 12-11 06:45

    CW32A030微控制定時器

    的脈沖寬度(輸入捕獲)或者產(chǎn)生輸出波 形(輸出比較和PWM)。 3 基本定時器(BTIM1..3) 內(nèi)部集成3 個基本定時器(BTIM),每個BTIM 完全獨立且功能相同,各包含一個
    發(fā)表于 12-04 06:47

    CW32L010+定時器介紹

    。PWM信號廣泛應用于電機控制、LED調(diào)光等領域。 頻率測量:定時器還可以用于頻率測量,將未知頻率的信號作為輸入,通過測量計數(shù)的計數(shù)次數(shù)來計算輸入信號的頻率。 捕獲/比較功能
    發(fā)表于 12-01 07:53

    CW32定時器中斷介紹

    中斷、ARR自動重載匹配中斷、比較匹配中斷。 通用定時器(GTIM): 編碼計數(shù)方向變化中斷
    發(fā)表于 12-01 07:08

    單片機定時器中斷

    定時器/計數(shù)的工作方式寄存,確定工作方式功能;TCON是控制寄存
    發(fā)表于 11-24 06:22

    PWM、定時器、SysTick 區(qū)別及應用場景

    。下面我們來梳理清楚。一、基本概念定時器(Timer)MCU內(nèi)最基礎的計數(shù)外設,通過計數(shù)時鐘周期實現(xiàn)定時、計數(shù)功能。多數(shù)MCU內(nèi)部有多個通用定時器,可配置為
    的頭像 發(fā)表于 11-17 10:53 ?558次閱讀
    PWM、<b class='flag-5'>定時器</b>、SysTick 區(qū)別及應用場景

    cs32a010定時器的問題

    按照例程寫了定時器的初始化,還是無法進入中斷 比較奇怪我使用定時器為什么要用輸入捕獲? 還有周期是否該設為x-1?
    發(fā)表于 11-06 10:49

    SysTick系統(tǒng)滴答定時器簡介

    SysTick—系統(tǒng)定時器是屬于CM33內(nèi)核中的一個外設,內(nèi)嵌在NVIC中。系統(tǒng)定時器是一個24bit的向下遞減的計數(shù),計數(shù)每計數(shù)一次的時間為 1/SYSCLK,一般我們設置系統(tǒng)時
    的頭像 發(fā)表于 09-23 09:50 ?1659次閱讀
    SysTick系統(tǒng)滴答<b class='flag-5'>定時器</b>簡介

    定時器輸入捕獲模式

    AT32F4xx定時器輸入捕獲模式 支持型號: AT32F 系列 主要使用外設: TIMER、 USART 獲取示例 1 快速使用方法 1.1 硬件資源 AT-START-F403A V1.0
    發(fā)表于 09-22 09:58

    基于 AS32X601 微控制定時器模塊(TIM)技術(shù)研究與應用實踐

    闡述了高級定時器和通用定時器的計數(shù)精度、預分頻可編程性,以及輸入捕獲、輸出比較、PWM生成等
    的頭像 發(fā)表于 08-19 16:44 ?873次閱讀

    MCU定時器/計數(shù)

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