輸入捕獲模式可以用來測量脈衝寬度或者測量頻率。除tim6和tim7其他定時器都有輸入捕獲功能。
工作過程:
簡單的說就是通過檢測 timx_chx 上的邊沿訊號,在邊沿訊號發生跳變(比如上公升沿/下降沿)的時候,將當前定時器的值(timx_cnt)存放到對應的通道的捕獲/比較暫存器(timx_ccrx)裡面,完成一次捕獲。同時還可以配置捕獲時是否觸發中斷/dma 等。所用暫存器:上公升下降沿->存值->做差求時間
timx_arr
設自動重裝載值timx_psc
timx 的時鐘分頻timx_ccmr1|捕獲/比較模式暫存器
**timx_ccmr1 **明顯是針對 2 個通道的配置,低八位[7:0]用於捕獲/比較通道 1 的控制,而高八位[15:8]則用於捕獲/比較通道 2 的控制。
因為 timx 還有 **ccmr2 **這個暫存器,所以可以知道ccmr2 是用來控制通道 3 和通道 4。
輸入捕獲 1 預分頻器 ic1psc[1:0],這個比較好理解。我們是 1 次邊沿就觸發 1 次捕獲,所
以選擇 00 就是了。
輸入捕獲 1 濾波器 ic1f[3:0],這個用來設定輸入取樣頻率和數字濾波器長度。
timx_ccer捕獲/比較使能暫存器
要使能輸入捕獲,必須設定 cc1e=0,而 cc1p 則根據自己的需要來配置。
timx_dier dma/中斷使能暫存器
前面有介紹
timx_cr1控制暫存器
我們只用到了它的最低位,也就是用來使能定時器的。
timx_ccr1捕獲/比較暫存器
該暫存器用來儲存捕獲發生時,timx_cnt的值,我們從 timx_ccr1 就可以讀出通道 1 捕獲發生時刻的 timx_cnt 值,通過兩次捕獲(一次上公升沿捕獲,一次下降沿捕獲)的差值,就可以計算出高電平脈衝的寬度。
使用過程
開啟 tim5 時鐘和 和 gpioa 時鐘 ,置 配置 pa0為下拉輸入。
初始化 tim5, 設定 tim5 的 的 arr 和 和 psc 。
設定tim5的輸入比較引數,開啟輸入捕獲
使能捕獲和更新中斷置(設定 tim5 的 的 dier暫存器
設定中斷分組,編寫中斷服務函式
使能定時器(設定 tim5 的 的 cr1 暫存器)
//1
rcc_apb1periphclockcmd
(rcc_apb1periph_tim5, enable)
;//使能 tim5 時鐘
rcc_apb2periphclockcmd
(rcc_apb2periph_gpioa, enable)
;//使能 gpioa 時鐘
//2tim_timebaseinittypedef tim_timebasestructure;
tim_timebasestructure.tim_period = arr;
//設定計數器自動重灌值
tim_timebasestructure.tim_prescaler =psc;
//設定預分頻值
tim_timebasestructure.tim_clockdivision = tim_ckd_div1;
// tdts = tck_tim
tim_timebasestructure.tim_countermode = tim_countermode_up;
//tim 向上計數模式
tim_timebaseinit
(tim5,
&tim_timebasestructure)
;//根據指定的引數初始化 tim5
//3void
tim_icinit
(tim_typedef* timx, tim_icinittypedef* tim_icinitstruct);
//所用函式
tim_icinittypedef tim5_icinitstructure;
tim5_icinitstructure.tim_channel = tim_channel_1;
//選擇輸入端 ic1 對映到 ti1 上
tim5_icinitstructure.tim_icpolarity = tim_icpolarity_rising;
//上公升沿捕獲
tim5_icinitstructure.tim_icselection = tim_icselection_directti;
//對映到 ti1 上
tim5_icinitstructure.tim_icprescaler = tim_icpsc_div1;
//配置輸入分頻,不分頻
tim5_icinitstructure.tim_icfilter =
0x00
;//ic1f=0000 配置輸入濾波器 不濾波
tim_icinit
(tim5,
&tim5_icinitstructure)
;//4
tim_itconfig
( tim5,tim_it_update|tim_it_cc1,enable)
;//允許更新中斷和捕獲中斷
//5if
(tim_getitstatus
(tim5, tim_it_update)
!= reset)
//判斷是否為更新中斷if(
tim_getitstatus
(tim5, tim_it_cc1)
!= reset)
//判斷是否發生捕獲事件
tim_clearitpendingbit
(tim5, tim_it_cc1|tim_it_update)
;//清除中斷和捕獲標誌位
//6tim_cmd
(tim5,enable )
;//使能定時器 5
stm32 輸入捕獲
根據定時器的計數頻率,我們就可以算出t1 t2的時間,從而得到高電平脈寬 計算公式 n arr ccrx2首先設定定時器通道為上公升沿捕獲,這樣在t1時刻,就會捕獲到當前的cnt值,然後立即清零cnt,並設定定時器通道為下降沿捕獲,這樣到t2時刻,又會發生捕獲事件,得到此時的cnt值,記為ccrx2...
stm32 輸入捕獲
stm32f1 除了基本定時器 tim6 和 tim7,其他定時器都具有輸入捕 獲功能。輸入捕獲可以對輸入的訊號的上公升沿,下降沿或者雙邊沿進行捕獲,通 常用於測量輸入訊號的脈寬 測量 pwm 輸入訊號的頻率及占空比 原理 輸入捕獲模式下,u8 tim5 ch1 capture sta 輸入捕獲狀態...
STM32輸入捕獲簡介
輸入捕獲模式可以用來測量脈衝寬度或者測量頻率。stm32的定時器,除了tim6和tim7,其他定時器都有輸入捕獲功能。stm32的輸入捕獲,簡單的說就是通過檢測timx chx上的邊沿訊號,在邊沿訊號發生跳變 比如上公升沿 下降沿 的時候,將當前定時器的值 timx cnt 存放到對應的通道的捕獲 ...