電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 42|回復(fù): 0
收起左側(cè)

STM32CubeMX之定時器輸入捕獲

[復(fù)制鏈接]

454

主題

454

帖子

2398

積分

三級會員

Rank: 3Rank: 3

積分
2398
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-3-12 21:45:00 | 只看該作者 |只看大圖 回帖獎勵 |正序?yàn)g覽 |閱讀模式
上一章介紹了STM32定時器的PWM輸出功能,定時器的幾個通道除了有輸出功能外,還可以做輸入用,可捕獲信號的上升沿或下降沿,可以用于測量信號的頻率、周期、占空比等。本篇文章將介紹用STM32的定時器輸入捕獲功能測量方波的頻率。前期準(zhǔn)備
  • STM32硬件電路板及仿真器(以STM32F072C8單片機(jī)為例)
  • Keil v5以上版本(MDK-ARM)
  • 信號發(fā)生器

    測量頻率的原理是用定時器的捕獲功能捕獲信號的上升沿,并用定時器的定時功能統(tǒng)計兩次捕獲之間的時間(兩次捕獲時計數(shù)器的差值/定時器的頻率),即為信號的周期,周期的倒數(shù)即為頻率。
    STM32CubeMX配置
    首先新建工程后,配置系統(tǒng)時鐘為48MHz(參考之前的文章STM32CubeMX之GPIO的使用)。以TIM1為例,使能TIM1的時鐘源為Internal Clock(即48MHz系統(tǒng)時鐘),設(shè)置通道1為Input Capture direct mode,可以看到對應(yīng)到PA8引腳自動被設(shè)置為TIM1_CH1功能。定時器基本參數(shù)的配置參考STM32CubeMx之TIM定時中斷,其它具體配置如下圖。

    STM32的定時器通道可以設(shè)置上升沿捕獲、下降沿捕獲或者上升沿下降沿都捕獲。當(dāng)捕獲到信號的上升沿或下降沿時,產(chǎn)生一個捕獲中斷。這里設(shè)置為上升沿捕獲。其中Prescaler Division ratio參數(shù)為可預(yù)置分頻比,可設(shè)置為不分頻或2/4/8分頻,若設(shè)置為2分頻,表示捕獲到2個上升沿才產(chǎn)生一次中斷。Input Filter為輸入濾波器參數(shù),濾波器的功能簡單來說就是多次檢測視為一次有效,也就是說連續(xù)N次采樣檢測,如果都是高電平,則說明這是一個有效的電平信號,這樣便可以過濾掉那些因?yàn)槟承┒蓴_產(chǎn)生的一些信號。設(shè)置完成后,打開定時器的溢出中斷和捕獲中斷。

    之所以需要打開溢出中斷,是因?yàn)閮纱尾东@之間,定時器可能會溢出,需要在中斷中記錄溢出次數(shù),才能統(tǒng)計兩次捕獲之間的總時間。點(diǎn)擊 Generate Code生成代碼。程序編寫
    在初始化后添加以下代碼:
  •   HAL_TIM_Base_Start_IT(&htim1);//啟動定時器1中斷  HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_1);//開啟定時器1通道1捕獲中斷編寫兩個中斷回調(diào)函數(shù),定時器溢出中斷用于統(tǒng)計溢出次數(shù),在捕獲中斷中記錄當(dāng)前的捕獲值,兩次捕獲的總計數(shù)值=溢出次數(shù)*65535+兩次捕獲的差值。程序如下:
  • uint32_t TIM1_Over_Cnt=0;//溢出次數(shù)計數(shù)uint8_t TIM1_Cap_Flag=0;//捕獲標(biāo)志0 表示第一次捕獲  1表示第二次捕獲uint32_t TIM1_Cap_Value[2]={0,0};//兩次捕獲的定時器計數(shù)值uint32_t TIM1_Counter=0;//兩次捕獲的計數(shù)差值//定時器溢出中斷回調(diào)函數(shù)void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){    if (htim == (&htim1))    {        TIM1_Over_Cnt++;//溢出次數(shù)+1    }}
    //定時器捕獲中斷void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
      if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)  {    if(TIM1_Cap_Flag==0 )//上次測量值已經(jīng)處理完,第一次捕獲    {      TIM1_Cap_Flag=1;      TIM1_Cap_Value[0]=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);      TIM1_Over_Cnt=0;    }    else if(TIM1_Cap_Flag==1)//第2次捕獲    {          TIM1_Cap_Value[1]=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);        TIM1_Counter = (TIM1_Over_Cnt16) + TIM1_Cap_Value[1] - TIM1_Cap_Value[0];//溢出次數(shù)        TIM1_Cap_Flag=2;//兩次捕獲完成 開始計算    }  }}第二次捕獲完成后,可以計算信號的頻率:
  •     if(TIM1_Cap_Flag==2)//通道1捕獲完成標(biāo)志    {      Frequence = (float)48000000 / TIM1_Counter;      TIM1_Cap_Flag = 0;//重新開始下次捕獲標(biāo)志    }采用這種計數(shù)方式測量頻率屬于測周法(測量周期),存在±1誤差,當(dāng)信號的頻率較高時,TIM1_Counter值會變小,±1誤差的影響將會被放大。因此,被測信號的頻率越高,這種方法的測量誤差越大。
    另外一種方法為測頻法,用定時器設(shè)定一個確定的閘門時間(比如1秒),在1秒內(nèi)記錄捕獲到的上升沿的次數(shù)。捕獲次數(shù)/閘門時間即為被測信號的頻率。這種方式同樣存在±1誤差,被測信號頻率越低,誤差的影響就越大。兩種方法互補(bǔ),工程師可根據(jù)被測信號的頻率范圍決定使用哪種方法。下一章將介紹另外一種頻率測量的方法,等精度測頻。顧名思義,該方法的測量誤差不受被測信號的影響,在全頻率段內(nèi)精度一致。
  • 回復(fù)

    使用道具 舉報

    發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表