STM32的定時(shí)器是支持信號(hào)輸入捕獲的,何為輸入捕獲?主要做什么應(yīng)用?
輸入捕獲:通過檢測(cè)TIMx_CHx上的邊沿信號(hào),在邊沿信號(hào)發(fā)生跳變的時(shí)候,將當(dāng)前的定時(shí)器的值(TIMx_CNT)存放到對(duì)應(yīng)的捕獲比較寄存器里面,完成一次捕獲。輸入捕獲主要應(yīng)用于測(cè)量信號(hào)的脈寬或頻率。
下圖是定時(shí)器原理圖的輸入捕獲框圖部分
第一部分是設(shè)置濾波器,用來對(duì)信號(hào)進(jìn)行濾波,信號(hào)從TI1輸入,通過濾波器,輸出TIF信號(hào),正常情況下信號(hào)沒有抖動(dòng),TI1F信號(hào)等于TI1的輸入信號(hào)。
ICF[3:0]用來設(shè)置輸入采樣頻率的數(shù)字濾波器的長(zhǎng)度,如ICF=0011,會(huì)在捕獲上升沿時(shí),以fCK_INT的頻率連續(xù)采樣八次通道1的信號(hào)電平,若都為高電平,則說明這是一個(gè)有效的觸發(fā),就會(huì)觸發(fā)捕獲中斷,這樣就可以濾除那些高電平低于八個(gè)采樣周期的脈沖信號(hào),達(dá)到濾波的效果,如果不做濾波處理,設(shè)置為ICF=0000,只要檢測(cè)到跳邊沿,就會(huì)觸發(fā)捕獲。
在TIMx捕獲/比較模式寄存器(TIMx_CCMR1)的位7:4
fDTS頻率根據(jù)TIMx_CR1的CKD[1:0]設(shè)置
位9:8 CKD:時(shí)鐘分頻,此位域指示定時(shí)器時(shí)鐘(CK_INT)頻率與數(shù)字濾波器所使用的采樣時(shí)鐘(ETR、TIx)之間的分頻比。
第二部分:設(shè)置輸入捕獲極性:配置邊沿檢測(cè)器檢測(cè)上升沿還是下降沿。在TIMx捕獲/比較使能寄存器(TIMx_CCER)的
第三部分:設(shè)置輸入捕獲映射通道:通道一信號(hào)也可以映射到通道二上,同理通道二信號(hào)也可以映射到通道一上。在TIMx捕獲/比較模式寄存器(TIMx_CCMR1)的
第四部分:設(shè)置輸入輸出捕獲分頻器,就是設(shè)置檢測(cè)到幾次跳變后觸發(fā)捕獲。在TIMx捕獲/比較模式寄存器(TIMx_CCMR1)的
同時(shí)要開啟輸入捕獲1使能,在TIMx捕獲/比較使能寄存器(TIMx_CCER)的
第五部分:捕獲到有效信號(hào)開啟中斷。在DMA/中斷使能寄存器(TIMx_DIER)
二、輸入捕獲配置步驟
輸入捕獲配置的一般步驟
① 初始化定時(shí)器和通道對(duì)應(yīng)IO的時(shí)鐘。
② 初始化IO口,模式為復(fù)用:
③設(shè)置引腳復(fù)用映射:
④初始化定時(shí)器ARR,PSC
⑤初始化輸入捕獲通道
⑥如果要開啟捕獲中斷,
⑦使能定時(shí)器:
⑧編寫中斷服務(wù)函數(shù):
三、輸入捕獲編程
以TIM5_CH1為例,
//定時(shí)器5通道1輸入捕獲配置
//arr:自動(dòng)重裝值(TIM5是32位)
//psc:時(shí)鐘預(yù)分頻數(shù)
void TIM5_CH1_Cap_Init(u32 arr,u16 psc)
{
RCC- >APB1ENR|=1< 3; //TIM5 時(shí)鐘使能
RCC- >AHB1ENR|=1< 0; //使能PORTA時(shí)鐘
GPIO_Set(GPIOA,PIN0,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PD);//復(fù)用功能,下拉
GPIO_AF_Set(GPIOA,0,2); //PA0,AF2
TIM5- >ARR=arr; //設(shè)定計(jì)數(shù)器自動(dòng)重裝值
TIM5- >PSC=psc; //預(yù)分頻器
TIM5- >CCMR1|=1< 0; //CC1S=01 選擇輸入端 IC1映射到TI1上
TIM5- >CCMR1|=0< 4; //IC1F=0000 配置輸入濾波器 不濾波
TIM5- >CCMR1|=0< 10; //IC1PS=00 配置輸入分頻,不分頻
TIM5- >CCMR1|=1< 0; //CC1S=01 選擇輸入端 IC1映射到TI1上
TIM5- >CCER|=0< 1; //CC1P=0 上升沿捕獲
TIM5- >CCER|=1< 0; //CC1E=1 允許捕獲計(jì)數(shù)器的值到捕獲寄存器中
TIM5- >EGR=1< 0; //軟件控制產(chǎn)生更新事件,使寫入PSC的值立即生效,否則將會(huì)要等到定時(shí)器溢出才會(huì)生效!
TIM5- >DIER|=1< 1; //允許捕獲1中斷
TIM5- >DIER|=1< 0; //允許更新中斷
TIM5- >CR1|=0x01; //使能定時(shí)器2
MY_NVIC_Init(2,0,TIM5_IRQn,2);//搶占2,子優(yōu)先級(jí)0,組2
中斷服務(wù)函數(shù):
//中斷服務(wù)函數(shù)
//捕獲狀態(tài),定義一個(gè)u8變量TIM5CH1_CAPTURE_STA,表示輸入捕獲狀態(tài)
//[7]:0,沒有成功的捕獲;1,成功捕獲到一次.
//[6]:0,還沒捕獲到低電平(下降沿);1,已經(jīng)捕獲到低電平(下降沿)了.
//[5:0]:捕獲高電平后溢出的次數(shù)(對(duì)于32位定時(shí)器來說,1us計(jì)數(shù)器加1,溢出時(shí)間:4294秒)
u8 TIM5CH1_CAPTURE_STA=0; //輸入捕獲狀態(tài)
u32 TIM5CH1_CAPTURE_VAL; //輸入捕獲值(TIM5是32位)
//定時(shí)器5中斷服務(wù)程序
void TIM5_IRQHandler(void)
{
u16 tsr;
tsr=TIM5- >SR;
if((TIM5CH1_CAPTURE_STA&0X80)==0) //還未成功捕獲
{
if(tsr&0X01) //溢出
{
if(TIM5CH1_CAPTURE_STA&0X40) //定時(shí)器溢出,說明已經(jīng)捕獲到上升沿,本次捕獲的是下降沿
{
if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高電平太長(zhǎng)了
{
TIM5CH1_CAPTURE_STA|=0X80; //標(biāo)記成功捕獲了一次
TIM5CH1_CAPTURE_VAL=0XFFFFFFFF;
}else TIM5CH1_CAPTURE_STA++;
}
}
if(tsr&0x02) //CH1發(fā)生捕獲事件,已經(jīng)捕獲到上升沿,TIMx_CCR1中已捕獲到計(jì)數(shù)器值(IC1上已檢測(cè)到與所選極性匹配的邊沿)
{
if(TIM5CH1_CAPTURE_STA&0X40) //CC1IF為1,說明已經(jīng)捕獲到了上升沿(第一次捕獲上升沿參考else),本次捕獲到的是下降沿
{
TIM5CH1_CAPTURE_STA|=0X80; //標(biāo)記成功捕獲到一次高電平脈寬
TIM5CH1_CAPTURE_VAL=TIM5- >CCR1; //獲取當(dāng)前的捕獲值.CCR1為上一個(gè)輸入捕獲1事件(IC1)發(fā)生時(shí)的計(jì)數(shù)器的值
TIM5- >CCER&=~(1< 1); //CC1P=0 設(shè)置為上升沿捕獲,為下一次捕獲做準(zhǔn)備
}else //還未開始,第一次捕獲上升沿
{
TIM5CH1_CAPTURE_STA=0; //清空
TIM5CH1_CAPTURE_VAL=0; //捕獲值清零
TIM5CH1_CAPTURE_STA|=0X40; //標(biāo)記捕獲到了上升沿
TIM5- >CR1&=~(1< 0) ; //使能定時(shí)器2
TIM5- >CNT=0; //計(jì)數(shù)器清空
TIM5- >CCER|=1< 1; //CC1P=1 設(shè)置為下降沿捕獲
TIM5- >CR1|=0x01; //使能定時(shí)器2
}
}
}
TIM5- >SR=0;//清除中斷標(biāo)志位
}
-
檢測(cè)器
+關(guān)注
關(guān)注
1文章
864瀏覽量
47687 -
比較器
+關(guān)注
關(guān)注
14文章
1651瀏覽量
107217 -
數(shù)字濾波器
+關(guān)注
關(guān)注
4文章
270瀏覽量
47026 -
分頻器
+關(guān)注
關(guān)注
43文章
447瀏覽量
49911 -
stm32定時(shí)器
+關(guān)注
關(guān)注
0文章
13瀏覽量
2294
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論