綿綿STM32學習 輸入捕獲

2021-10-01 04:04:02 字數 2926 閱讀 2655

stm32學習——輸入捕獲

輸入捕獲模式可以用來測量脈衝寬度或者測量頻率。stm32 的定時器,除了 tim6 和 tim7,其他定時器都有輸入捕獲功能。

它的基本工作過程就是先捕捉timx_chx上的邊沿訊號,在邊沿訊號發生跳變(比如上公升沿/下降沿)的時候,計數器開始計時,等待著捕捉到脈衝跳變,計數器停止計數,將當前定時器的值(timx_cnt)存放到對應的捕獲/比較暫存器(timx_ccrx)裡面。

先設定輸入捕獲為上公升沿(下降沿)捕獲,記錄傳送訊號跳變時timx_cnt的值,然後將輸入捕獲設定為下降沿(上公升沿),當下乙個訊號跳變時,發生捕獲,並記錄此時timx_cnt的值。將前後兩次捕獲的值做差,算出高電平的脈寬。同時加上我們設定好了的timx的計數頻率,就可以算出高電平的時間了。

t=1/f , 脈寬 x t = 高電平時間。

這兩個暫存器用來設自動重裝載值和 timx 的時鐘分頻。

void

tim3_int_init

(u16 arr,u16 psc)

捕獲/比較模式暫存器:各位描述如圖:

當在輸入捕獲模式下使用的時候,對應圖 第二行描述,從圖中可以看出,timx_ccmr1 是針對 2 個通道的配置,低八位[7: 0]用於捕獲/比較通道 1 的控制,而高八位[15: 8]則用於捕獲/比較通道 2 的控制,因為 timx 還有 ccmr2 這個暫存器,可知道ccmr2 是用來控制通道 3 和通道 4。

實驗使用tim2 的捕獲/比較通道 1,重點介紹 timx_cmmr1 的[7:0]位:

cc1s[1:0]:這兩個位用於 ccr1 的通道方向配置, 這裡我們設定 ic1s[1:0]=01,即

是配置為輸入,且 ic1 對映在 ti1 上, cc1 即對應 timx_ch1。

ic1psc[1:0]:輸入捕獲 1 預分頻器。這裡是 1 次邊沿就觸發 1 次捕獲,所以選擇 00 就是了。

ic1f[3:0]:輸入捕獲 1 濾波器。這個用來設定輸入取樣頻率和數字濾波器長度。其中,fck_int 是定時器的輸入頻率(timxclk),一般為 72mhz,而 fdts 則是根據 timx_cr1 的 ckd[1:0]的設定來確定的,如果 ckd[1:0]設定為 00,那麼fdts=fck_int 。 n 值就是濾波長度,舉個簡單的例子:假設 ic1f[3:0]=0011,並設定 ic1 對映到通道 1 上,且為上公升沿觸發,那麼在捕獲到上公升沿的時候,再以 fck_int的頻率,連續取樣到 8 次通道 1 的電平,如果都是高電平,則說明確實是乙個有效的觸發,就會觸發輸入捕獲中斷(如果開啟了的話)。這樣可以濾除那些高電平脈寬低於 8 個取樣週期的脈衝訊號,從而達到濾波的效果。這裡,我們不做濾波處理,所以設定 ic1f[3:0]=0000,只要採集到上公升沿,就觸發捕獲。

在程式中輸入捕獲的設定時通過結構體tim_icinittypedef定義的。

typedef struct

tim_icinittypedef;

捕獲/比較使能暫存器,此處使用到這個暫存器的最低 2 位, cc1e 和 cc1p 位。如下圖:

dma/中斷使能暫存器。

我們同樣僅關心它的第 0 位, 該位是更新中斷允許位, 當定時器的更新中斷, 該位要設定為 1,來允許由於更新事件所產生的中斷。

捕獲/比較暫存器 1。該暫存器用來儲存捕獲發生時, timx_cnt的值,我們從 timx_ccr1 就可以讀出通道 1 捕獲發生時刻的 timx_cnt 值,通過兩次捕獲(一次上公升沿捕獲,一次下降沿捕獲)的差值,就可以計算出高電平脈衝的寬度。

是用來記錄捕獲狀態,把它當成乙個暫存器那樣

來使用。 tim2ch1_capture_sta 各位描述下表 所示:

則用來記錄捕獲到下降沿的時候, tim2_cnt的值。

void

tim3_int_init

(u16 arr,u16 psc)

void

tim3_irqhandler

(void

)//tim3中斷

}//pwm輸出初始化

//arr:自動重灌值

//psc:時鐘預分頻數

void

tim3_pwm_init

(u16 arr,u16 psc)

//定時器5通道1輸入捕獲配置

tim_icinittypedef tim5_icinitstructure;

void

tim5_cap_init

(u16 arr,u16 psc)

u8 tim5ch1_capture_sta=0

;//輸入捕獲狀態

u16 tim5ch1_capture_val

;//輸入捕獲值

//定時器5中斷服務程式

void

tim5_irqhandler

(void

)else

tim5ch1_capture_sta++;

}}if(

tim_getitstatus

(tim5

,tim_it_cc1)!=

reset

)//捕獲1發生捕獲事件

else

//還未開始,第一次捕獲上公升沿}}

tim_clearitpendingbit

(tim5

,tim_it_cc1

|tim_it_update)

;//清除中斷標誌位

}

參考:

stm32 輸入捕獲

根據定時器的計數頻率,我們就可以算出t1 t2的時間,從而得到高電平脈寬 計算公式 n arr ccrx2首先設定定時器通道為上公升沿捕獲,這樣在t1時刻,就會捕獲到當前的cnt值,然後立即清零cnt,並設定定時器通道為下降沿捕獲,這樣到t2時刻,又會發生捕獲事件,得到此時的cnt值,記為ccrx2...

stm32 輸入捕獲

stm32f1 除了基本定時器 tim6 和 tim7,其他定時器都具有輸入捕 獲功能。輸入捕獲可以對輸入的訊號的上公升沿,下降沿或者雙邊沿進行捕獲,通 常用於測量輸入訊號的脈寬 測量 pwm 輸入訊號的頻率及占空比 原理 輸入捕獲模式下,u8 tim5 ch1 capture sta 輸入捕獲狀態...

stm32輸入捕獲

輸入捕獲模式可以用來測量脈衝寬度或者測量頻率。除tim6和tim7其他定時器都有輸入捕獲功能。工作過程 簡單的說就是通過檢測 timx chx 上的邊沿訊號,在邊沿訊號發生跳變 比如上公升沿 下降沿 的時候,將當前定時器的值 timx cnt 存放到對應的通道的捕獲 比較暫存器 timx ccrx ...