STM32F407 CubeMx使用定时器测量信号频率 分辨率0.001Hz
一、需求
使用STM32F407 測量外部輸入方波信號的周期,信號變化范圍:45HZ~55HZ,測量分辨率0.001HZ。
二、配置
- stm32Cubemx:version 6.1.1
- HAL庫:1.25.2
- MDK:5.34
- C Compiler:ARMCC 6.16?
三、分析
采用定時器的PWM輸入捕獲模式,讀取定時器在兩個信號脈沖上升沿之間計數值,即可。
50Hz測量分辨率為0.001Hz,即測量頻率精確到小數點后三位,測量精度非常高,因此必須盡可能提高定時器的運行頻率。此外,還要考慮定時器的位數,防止計數超過定時器的最大計數值。
參考STM32F407的技術手冊,定時器TIM2~TIM5、TIM12~TIM14受限于APB1總線的最大時鐘(42MHz),定時器TIM1、TIM8~TIM11受限于APB1總線的最大時鐘(84MHz)。
送到Timer的時鐘還會被系統二倍頻,因此,TIM2~TIM5、TIM12~TIM14的最大時鐘為84MHz,TIM1、TIM8~TIM11的最大時鐘為168MHz。
還需要考慮計數值的最大計數范圍,例如在最大時鐘168MHz運行時,到50HZ的計數值應該為168M/50 = 3360000,這遠超過16位計數器的65535。因此,需要折中考慮。
經過分析,32位定時器TIM5,運行在84MHZ時,是比較滿足要求的,50HZ此時的計數值為84M/50 = 1680000, 32位計數器能hold住。
四、cubeMx配置
4.1 時鐘設置
TIM5掛在APB1上,保證APB1最大速度42MHz,可得到APB1的Timer時鐘84MHz。
4.2 TIM設置
選擇TIM5,使用PWM 的通道1輸入:
定時器的預分頻系數PSC設置為0,即不分頻。PWM設置為TI1FP1上升沿觸發,SlaveModeController設置ResetMode,即捕獲到上升沿就重置計數。InputFilter用于設置輸入濾波,當識別到多少個電平信息后認為是穩定的邊沿到達。
然后開啟全局中斷
設置CH1的GPIO為下拉,以保證穩定外部觸發。
其他配置包括串口UART之類的,正常配置即可。保存,生成工程代碼。
五、計算頻率
- 在MDK工程中,使用 HAL_TIM_IC_Start_IT(&htim5,TIM_CHANNEL_1),啟用定時器的PWM捕獲功能。
- 在void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) 中斷函數中獲取定時器的計數值,并計算出頻率。
- 使用HAL_TIM_ReadCapturedValue讀取計數值。
main.c代碼如下:
中斷處理函數如下:
主函數main.c中每500ms打印一次頻率測量值。
信號發生器輸出頻率50Hz,實際測得的值為49.99672699HZ,一直很穩定,小數點后4位不變化,說明精度可以保證到0.0001Hz,固定誤差是0.004Hz,在輸出結果時進行誤差補償即可,這部分誤差有可能是信號發生器本身或者連接線的問題,是可以滿足測量任務的。
總結
以上是生活随笔為你收集整理的STM32F407 CubeMx使用定时器测量信号频率 分辨率0.001Hz的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: winform直接控制云台_速学指南,2
- 下一篇: hades武器第四形态解锁_凯多的第四个