在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

電子發燒友App

硬聲App

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

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

3天內不再提示
電子發燒友網>電子資料下載>嵌入式開發>單片機測量PWM占空比的三種方法

單片機測量PWM占空比的三種方法

2021-01-27 | pdf | 111.83KB | 次下載 | 3積分

資料介紹

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硬件將定時器/計數器的值保存在一個影子寄存器中,并產生捕獲中斷。

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

下面以某顆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



下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1TPS54202H降壓轉換器評估模塊用戶指南
  2. 1.02MB   |  7次下載  |  免費
  3. 2華瑞昇CR215芯片數字萬用表原理圖
  4. 0.21 MB   |  1次下載  |  3 積分
  5. 3SMD LED選型目錄 燈珠手冊
  6. 5.36 MB   |  1次下載  |  免費
  7. 4Tiva C系列DK-TM4C129X入門指南
  8. 1.69MB   |  1次下載  |  免費
  9. 5電涌保護器(SPD)的選擇、安裝以及裝配
  10. 4.57 MB   |  1次下載  |  免費
  11. 6時源芯微EMC前車燈案例
  12. 458.59 KB  |  1次下載  |  免費
  13. 7bq25890、bq25892雙級聯充電器EVM(PWR692)用戶指南
  14. 2.02MB   |  1次下載  |  免費
  15. 8TPS54426降壓轉換器評估模塊用戶指南
  16. 847.7KB   |  次下載  |  免費

本月

  1. 1ADI高性能電源管理解決方案
  2. 2.43 MB   |  156次下載  |  免費
  3. 22024PMIC市場洞察
  4. 2.23 MB   |  63次下載  |  免費
  5. 3開關電源設計原理手冊
  6. 1.83 MB   |  30次下載  |  免費
  7. 4智能門鎖原理圖
  8. 0.39 MB   |  28次下載  |  免費
  9. 5OAH0428最新規格書(中文)
  10. 2.52 MB   |  15次下載  |  7 積分
  11. 6ST7789V2單芯片控制器/驅動器英文手冊
  12. 3.07 MB   |  9次下載  |  1 積分
  13. 7LTH7充電電路和鋰電池升壓5V輸出電路原理圖
  14. 0.04 MB   |  7次下載  |  免費
  15. 8TPS54202H降壓轉換器評估模塊用戶指南
  16. 1.02MB   |  7次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935119次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
  4. 1.48MB  |  420061次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233084次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191367次下載  |  10 積分
  9. 5十天學會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183334次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81581次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73807次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65987次下載  |  10 積分
主站蜘蛛池模板: 日本簧片在线观看| 男人午夜视频在线观看| jizz 大全欧美| 亚洲精品卡1卡二卡3卡四卡| 免费大片黄在线观看日本| 天天拍天天色| 老司机精品免费视频| 日本高清网站| 午夜小视频网站| 亚洲一区三区| 欧美三级视频在线| 我不卡午夜| 欧美精品人爱a欧美精品| 牛牛a级毛片在线播放| 奇米7777第四色| 高清视频一区二区三区| 黄 色 录像成 人播放免费 | 一区国产传媒国产精品| 久久综合九色综合网站| 玖玖福利| 亚洲男人的天堂成人| 成人做视频免费| 丁香婷婷激情五月| 欧美一级视频在线观看欧美| 视频在线观看高清免费看| 国产精品国产三级在线高清观看 | 国产 日韩 欧美 高清| 91福利网| 色多多在线播放| 深夜国产成人福利在线观看女同| 男人的亚洲天堂| 黄页网址免费观看18网站| se综合| 色婷亚洲| 天天看天天做| 伊人久久香| 永久免费在线观看视频| 男女艹逼软件| 甘婷婷一级毛片免费看| 亚洲欧洲一区二区三区在线观看| 毛片不卡一区二区三区|