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 ...