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

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

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

3天內不再提示

利用TIMER測量信號周期及占空比的精度

茶話MCU ? 來源:茶話MCU ? 2024-02-25 10:11 ? 次閱讀

有人使用STM32G4系列的通用型TIMER基于捕獲功能對外來信號進行周期及占空比的測量。他用TIM3產生頻率、占空比可調的PWM輸出做為被測信號。TIM4用來進行頻率測量,工作在復位從模式,被測信號接到其通道2的輸入腳。然后經內部邊沿檢測和內部濾波電路后,兵分兩路分別連接到IC1和IC2。顯然IC2使用直接輸入模式,IC1使用間接輸入模式,如下圖功能框圖示意。

94a4bf2a-d382-11ee-a297-92fbcf53809c.png

但他發現被測信號頻率較高時,誤差就明顯變大了。當然,他也知道,任何測量肯定是有極限的。他現在就是想知道,能否基于現有方案將測量極限拉高點。比方說,他現在測量20KHz信號時就明顯誤差過大,導致測算結果難以采用。是否可以將可靠的測量結果提升到25KHz或更高呢。

94a8d236-d382-11ee-a297-92fbcf53809c.png

我們不妨一起看看這個問題。依然保持相同的測量方案,TIM4工作在復位從模式,TIM3輸出的被測信號連接到TIM4的CH2,然后兵分兩路連接都TIM4的IC1與IC2。

顯然,我們先要確定測量的計時起點。可以采用IC2的上沿捕獲事件作為測量起點,即進入測試狀態。也可以基于上沿觸發信號產生定時器復位導致的更新事件觸發事件作為測量起點,我在下面就是使用后者來進行測量并組織相應代碼。

IC1的下降沿觸發捕獲,捕獲到的計數器值存放于變量Value_1stCap【結合上圖來看】。

IC2的上升沿作為TIM4的觸發復位信號,且基于上升沿事件進行捕獲, 捕獲值存于Value_2ndCap。

從發生復位事件到發生第2次捕獲期間,對TIM4的更新事件次數進行統計,總的更新事件次數計為Total_Num_OvEvent。

從發生復位事件到發生第1次捕獲期間,對TIM4的更新事件次數進行統計后,計為Front_Num_OvEvent。

現在使用STM32CubeMx進行配置。重點關注TIM4的配置。TIM4的時基和捕獲配置參數如下:

94be2276-d382-11ee-a297-92fbcf53809c.png

結合上面配置我們不難看出,TIM4的溢出周期為20ms,TI2FP2作為TIM4的復位觸發信號,上沿觸發,同時IC2針對輸入信號的上沿進行捕獲。IC1針對輸入信號的下沿進行捕獲。

至于TIM3的配置沒啥特別的,就是產生PWM輸出信號,在代碼里將調整其PSC分頻系數和ARR參數以及CCR參數,以改變其頻率和占空比。選擇其通道1做PWM輸出。下面測試中,TIM3輸出的PWM波形的占空比固定為40%。

94c2bcd2-d382-11ee-a297-92fbcf53809c.png

另外,STM32G4的系統主頻配置為170MHz,使用HSE 時鐘源。開啟TIM4的中斷響應使能。完成配置后創建工程。添加必要的用戶初始及啟動代碼。

__IO uint32_t            Vaule_2ndCap = 0u;
__IO uint32_t            Vaule_1stCap = 0u;


__IO    float          Signal_Cycle= 0.0f;
__IO    float          Signal_Duty = 0.0f;
__IO    float          Signal_Freq = 0.0f;


__IO uint32_t Total_Num_OvEvent=0u;
__IO uint32_t Front_Num_OvEvent=0u;


__IO uint32_t  Num_OvEvent =0u ;
__IO uint32_t  Measure_State = 0u;


__IO uint32_t  Clk_Internal;




    __HAL_TIM_CLEAR_IT(&htim4, TIM_IT_UPDATE);
    __HAL_TIM_ENABLE_IT(&htim4, TIM_IT_UPDATE);  


    HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_2); //enable IC1 interrupt of TIM4
    HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_1); //enable IC2 interrupt of TIM4


  __HAL_TIM_CLEAR_IT(&htim4, TIM_IT_UPDATE);
  __HAL_TIM_CLEAR_IT(&htim4, TIM_IT_TRIGGER);//enable Update interrupt of TIM4

Clk_Internal=HAL_RCC_GetHCLKFreq();//170MHzforG4Series


  Measure_State = 0x00;  //initial state of Measuring
  Num_OvEvent = 0x00;    //initial value of update count of TIM4




  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);

TIM4事件的所有中斷共用同一個中斷矢量入口。為了盡可能地測得較高的信號頻率,中斷處理代碼盡量要簡潔些,避免過多、過深的函數調用。

94c7f53a-d382-11ee-a297-92fbcf53809c.png

有關TIM4的捕獲中斷及更新中斷的處理代碼如下,包括IC1、IC2的捕獲中斷處理和更新中斷處理代碼,以及相關計算處理代碼。

void HAL_TIM4_PWM_Measure_IRQ(TIM_HandleTypeDef *htim)
{


if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET)
  {
      __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);


if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_TRIGGER) != RESET)
      {
          __HAL_TIM_CLEAR_IT(htim, TIM_IT_TRIGGER);


if (Measure_State == 0)


          { 
            Num_OvEvent = 0;      // prepare count overflow events
            Measure_State = 0x01;   //start measurement
          }
         }


else
    {
if(Measure_State != 0)  
      {
       Num_OvEvent++;
      }  
    }
  }


/* Capture compare 1 event */
if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) != RESET)
  {


        __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1); 




if (Measure_State == 0x01)
          {    
            Front_Num_OvEvent = Num_OvEvent;
            Measure_State =0x02;
           }  


  }


/* Capture compare 2 event */
if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2) != RESET)
{
      __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2);




if(Measure_State == 0x02)
        {
          Measure_State =0x03;
          Total_Num_OvEvent = Num_OvEvent;
           HAL_TIM4_IC_CaptureCallback(htim);      //go to calculate pulse width and duty


        }      


 } 




}


void HAL_TIM4_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{


/* Get the Input Capture value */
    Vaule_1stCap = TIM4->CCR1;//HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
    Vaule_2ndCap = TIM4->CCR2;//HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);




    Signal_Duty =(float)((Vaule_1stCap+(Front_Num_OvEvent*(TIM4_PERIOD+1)))*100u)/ 
      (float)(Vaule_2ndCap+(Total_Num_OvEvent*(TIM4_PERIOD+1)));    


//  Clk_Internal = HAL_RCC_GetHCLKFreq();


    Signal_Freq =(float)(Clk_Internal/(TIM4_PSC+1))/(float)((Vaule_2ndCap+(Total_Num_OvEvent*(TIM4_PERIOD+1))));
  Signal_Cycle = (float) (1.000f/Signal_Freq) ;




      Measure_State = 0x00;
      Num_OvEvent = 0x00;
    __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1); 
    __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2); 
    __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
    __HAL_TIM_CLEAR_IT(htim, TIM_IT_TRIGGER);

}

現在基于上面的配置及用戶代碼進行測量驗證。我們發現當TIM3輸出的待測信號頻率達到25KHz時,測得的頻率及占空比就發生了明顯的偏差。見下圖標注問號的第4欄信息

94cc9d74-d382-11ee-a297-92fbcf53809c.png

即當被測頻率為25KHz,占空比為40%時,測得結果是下面的樣子,明顯偏差過大。

94e7c126-d382-11ee-a297-92fbcf53809c.png

如果說被測信號頻率進一步提升的話,誤差會變得更大。那么,這種情形是否有改善機會呢?即在當前的測試方案下,可準確測量的被測信號頻率是否可以提高。

目前的中斷處理代碼應該說比較精簡,沒有什么可以優化的余地了。

聊到這里,有人可能發現了,我前面配置TIM4時,它是用來完成測量任務的,它的分頻系數PSC為169。即TIM4的計數器計數時鐘為1MHz,其計數分辨率為1us。不難理解,這個PSC系數應該會直接影響TIM4的計數精度,按理會影響到測量結果,尤其被測信號頻率較高時。

既然這樣,我們將TIM4的PSC系數改為0,并適當調整其ARR值再來實施測量,看看結果會怎么樣。見下圖,TIM3輸出的信號頻率仍然是占空比為40% 、頻率為25KHz的PWM信號。測量結果顯著地明顯改善,應該說此時結果是可以接受的,畢竟浮點運算也會帶來些偏差。

94ebf372-d382-11ee-a297-92fbcf53809c.png

我們不妨在保持TIM3的PSC為0的條件下,將輸出頻率提升到50KHz、100KHz。繼續看看測量結果,見下圖:

94efc088-d382-11ee-a297-92fbcf53809c.png

從測試結果來看,當被測信號頻率提升到50KHz,測量結果仍然很好,完全可以采用。即使當被測信號頻率提升到100KHz時,測量結果雖發生了一些偏差,但此時的偏差相比PSC=169、被測信號為25KHz時的測試結果還要好得多。我把二者單列出來一起比較,見下圖:

94f39cee-d382-11ee-a297-92fbcf53809c.png

經過上面的討論和驗證,我們知道,在使用TIMER做信號的頻率及占空比的測量時,當確定好測試方案后,為了盡可能地提升可以準確測試信號的頻率,一方面代碼要盡可能精簡、優化,另一方面,因測試TIMER的分頻系數會影響測試結果的精度及準確性,此時測試TIMER的分頻系數要盡可能設置小、或不做分頻,這點結合具體應用場景來定。

關于上面的的話題,其實還可以有很多繼續延伸的空間,因時間和篇幅問題,就先聊到這里。有興趣的話,可以基于上面配置和分享的參考源碼做些快速測試驗證,也歡迎進一步地討論交流。

審核編輯:湯梓紅

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

    關注

    146

    文章

    17148

    瀏覽量

    351213
  • 占空比
    +關注

    關注

    0

    文章

    109

    瀏覽量

    29090
  • 定時器
    +關注

    關注

    23

    文章

    3248

    瀏覽量

    114816
  • Timer
    +關注

    關注

    1

    文章

    64

    瀏覽量

    12788

原文標題:利用TIMER測量信號周期及占空比的精度話題

文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    周期測量頻率的方法及應用

    周期測量法是一種很靈活的頻率測量方法,通過調整被測信號周期個數可以在測量
    發表于 02-20 15:42 ?7985次閱讀
    多<b class='flag-5'>周期</b><b class='flag-5'>測量</b>頻率的方法及應用

    怎么設置TIMER周期

    我使用一個標準的定時器模塊采取了一些在設定的時間間隔的交流波形樣本;我基本上是做一個RMS電壓測量,所以需要能夠確保我取32個樣本在輸入的交流信號的半個周期利用定時器,設定采樣
    發表于 10-15 15:49

    如何利用LabVIEW測量一個心電信號周期?

    親愛的各位大神,我是來自某高校的初級電子專業學生,最近遇到一些困難想知道如何利用LabVIEW測量一個心電信號(已轉換為數字信號可在LabVIEW中輸出顯示)的
    發表于 07-12 05:55

    求有償求購周期方波信號頻率周期測量設計

    STC12C5A60S2(引腳排序及基本功能同AT89S51)作為主控芯片,設計利用單片機測量DS12C887輸出的周期方波信號的頻率和周期
    發表于 05-28 05:55

    如何利用STM32測量PWM的波頻率及占空比

    如何利用STM32測量PWM的波頻率及占空比?
    發表于 11-18 07:00

    測量方波周期以及占空比的方法是什么

    開發板:STM32H743IIT6 (HAL庫)方案1只能用于測量方波的周期,方案2能測量方波的周期占空比方案1:基本思路是:既然
    發表于 12-01 08:30

    如何測量PWM信號占空比周期?

    大家好,??我試圖建立一個項目來測量 PWM 信號占空比周期。?PWM 信號是使用 MCAL-PWM 模塊通過在其下配置一個 EMIOS
    發表于 04-12 06:02

    如何采用MSP430單片機實現PWM信號

    PWM信號是一種具有固定周期、不定占空比的數字信號。 如果Timer_A的計數器工作在增計數模式,輸出采用輸出模式7(復位/置位模式)
    發表于 06-17 15:27 ?7854次閱讀

    測量方波周期以及占空比的兩種方法介紹

    開發板:STM32H743IIT6 (HAL庫)方案1只能用于測量方波的周期,方案2能測量方波的周期占空比方案1:基本思路是:既然
    發表于 11-22 17:06 ?3次下載
    <b class='flag-5'>測量</b>方波<b class='flag-5'>周期</b>以及<b class='flag-5'>占空比</b>的兩種方法介紹

    怎樣利用示波器測量信號周期

    。 示波器可以通過測量信號周期來幫助工程師分析和調試電路。信號周期是指信號從一個點開始到下一
    的頭像 發表于 09-22 15:01 ?5658次閱讀
    怎樣<b class='flag-5'>利用</b>示波器<b class='flag-5'>測量</b><b class='flag-5'>信號</b>的<b class='flag-5'>周期</b>

    占空比什么是頻率,什么是周期

    占空比(Duty Cycle)是指一個周期內,信號處于高電平的時間占整個周期的比例。通常用百分比表示,占空比越高表示
    的頭像 發表于 12-18 14:41 ?4149次閱讀

    占空比信號和頻率信號的區別

    ,是表示周期信號中高電平出現的時間與周期的比例。占空比信號通常是一個矩形波形,具有高電平和低電平兩個狀態。
    的頭像 發表于 01-05 16:51 ?2493次閱讀

    lebview信號占空比怎么設置

    Lebview信號占空比是指在一個周期內,信號高電平占整個周期的比例。在LabVIEW中,我們可以通過設置參數來調整
    的頭像 發表于 01-09 11:19 ?1042次閱讀

    pwm如何控制占空比周期

    如果使用可編程PWM控制器,可以通過軟件來控制占空比周期。軟件可以直接修改占空比寄存器的值,以控制高電平的持續時間,從而改變占空比。還可以修改周期
    的頭像 發表于 01-17 15:00 ?5656次閱讀

    怎樣利用數字示波器測量信號周期和振幅

    在電子工程領域,信號周期和振幅是評估和分析電路性能的重要參數。數字示波器作為一種高精度、高效率的測量儀器,被廣泛用于測量
    的頭像 發表于 05-17 17:08 ?3514次閱讀
    主站蜘蛛池模板: 午夜cao| 狠狠色噜噜狠狠狠狠97| 美女扒开尿口给男人桶动态图| 四虎最新免费观看网址| 黄色片免费看视频| 免费观看黄a一级视频| 男人j进入女人免费视频| 日本aaaa视频| 午夜免费视频| 亚洲1卡二卡3卡四卡不卡| 日韩高清性爽一级毛片免费| 黄视频网站观看| 青楼社区51在线视频视频| 夜夜爽夜夜操| 亚洲一区二区三区深夜天堂| 日韩一级在线视频| 午夜国产高清精品一区免费| 最新色站| 欧美三级视频网| 免费看黄色的网站| 亚洲大尺度视频| aaaa在线观看| 1024人成软件色www| 欧美成人伊人久久综合网| 天天干天天骑| 国产精品成人aaaaa网站| 久久99精品久久久久久野外| 午夜视频福利| 日本一区二区三区四区视频| 九九久久国产精品大片| 99精品视频在线播放2| 色校园| 上色天天综合网| 亚洲综合激情六月婷婷在线观看| 很色视频| 69日本人xxxxxxxx18| 男人的天堂免费网站| 草久久久久| 日本国产视频| 国产香蕉在线精彩视频| 色视频网站大全免费|