|
上一章介紹了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定時中斷,其它具體配置如下圖。
3ftqd4b5gzr64048945732.jpg (192.01 KB, 下載次數(shù): 1)
下載附件
保存到相冊
3ftqd4b5gzr64048945732.jpg
2024-10-5 23:00 上傳
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次采樣檢測,如果都是高電平,則說明這是一個有效的電平信號,這樣便可以過濾掉那些因為某些而干擾產(chǎn)生的一些信號。設(shè)置完成后,打開定時器的溢出中斷和捕獲中斷。
jaiitlemun564048945832.png (21.58 KB, 下載次數(shù): 1)
下載附件
保存到相冊
jaiitlemun564048945832.png
2024-10-5 23:00 上傳
之所以需要打開溢出中斷,是因為兩次捕獲之間,定時器可能會溢出,需要在中斷中記錄溢出次數(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)精度一致。 |
|