基於STM32的頻率計(採用外部中斷的方式)

2021-10-24 16:15:40 字數 1481 閱讀 5363

最近在了解電賽相關的東西,和指導老師交流一下,我決定先從最簡單的頻率計做起。

頻率計是來檢測訊號的頻率的,在做頻率計的時候可以用訊號發生器發出的訊號來進行測試。

這是最基礎的方波,我們可以通過檢測上公升沿的方式來測量其頻率。從週期的角度出發連續兩個上公升沿的時間就是這個方波的週期,那這個週期分之一就是這個方波的頻率了。

在思考了一段時間~~(我是萌新。。)~~ 我覺得有兩個方法可以實現,第乙個是採用stm32定時器的輸入捕獲功能,第二個就是用外部中斷來實現這個功能。正如標題,我這次採用外部中斷的方法來實現這個功能。

具體原理如下:

將外部中斷的引腳設定為上公升沿檢測並且配置為下拉模式。每當檢測到上公升沿,就將計數值加一,這樣一秒鐘之內計數器的值就是頻率

我是採用cubemx的方式來程式設計的。(教學資源還是挺多的)

主函式部分

while(1

)

外部中斷部分

void hal_gpio_exti_callback (uint16_t gpio_pin)

一開始我是採用hal庫自帶的延時函式來進行定時1s的。正如上文所述,在上公升沿到達的時候計數器pwm_value 的值執行加一操作。1s之後就是該方波的頻率了

在測量的時候我發現當頻率大於200000hz的時候~~(差不多這個範圍)~~ 串列埠就無法進行傳送資料了,而且在1000hz的時候就出現了百分之零點五左右的誤差(這個誤差不能忽視!!)。

一開始我覺得是因為外部中斷只能達到這個程度,但是後來我發現在150000hz的時候其實串列埠是有資料的,只不過串列埠不再是一行一行的傳送資料,而是乙個字乙個字的傳送,這引起了我的注意,後來得知這是因為串列埠的收發速度小於了當時進入外部中斷的頻率所導致的。

所以我決定配置乙個1s鐘的定時器,在定時器中斷到來的時候進行串列埠傳送資料。(定時器中斷優先順序大於外部中斷的優先順序)

定時器部分

void

hal_tim_periodelapsedcallback

(tim_handletypedef *htim)

我把主函式的部分移動到了這個1s的定時器中斷裡。

採用定時器中斷,這個頻率計的精度提高了,並且可以檢測1mhz的頻率。

這個量程範圍還是不夠的,我打算再用外部中斷的方法來試試,然後我還會去學習一下輸入捕獲的知識,用輸入捕獲的方式來實現這個專案。

ps:當我將方波換成正弦訊號的時候驚奇的發現上公升沿檢測的方式仍然可以使用,後來去查了一下上公升沿檢測的概念,發現只要到達一定閾值就可以被檢測,而不是我想的那樣需要乙個上公升沿的到來。(這個真是很大的收穫!)

STM32外部中斷的使用

1 基本概念 arm coetex m3核心共支援256個中斷,其中16個內部中斷,240個外部中斷和可程式設計的256級中斷優先順序的設定。stm32目前支援的中斷共84個 16個內部 68個外部 還有16級可程式設計的中斷優先順序的設定,僅使用中斷優先順序設定8bit中的高4位。stm32可支援...

STM32外部中斷的錯誤

今天在玩stm32的外部中斷的時候遇到下邊問題 compiling stm32f10x nvic.c.linking.exit.axf error l6218e undefined symbol basepriconfig referred from stm32f10x nvic.o exit.ax...

stm32的外部中斷問題

stm32 的每個線0 15均可以程式設計為外部中斷,線0,1,2,3,4分別對應io的gpiox 0 4 他們分別有各自的中斷入口exti0 irqhandler 到 exti4 irqhandlergpiox5 9特通過乙個入口exti9 5 irqhandler 然後進入中斷後在通過比較來判斷...