stm32輸入捕獲

2021-10-03 21:12:49 字數 3283 閱讀 3106

輸入捕獲模式可以用來測量脈衝寬度或者測量頻率。

除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 存放到對應的通道的捕獲 ...