當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]輸入捕獲作為定時(shí)器的一個(gè)功能,在工業(yè)測(cè)速上有很大的應(yīng)用。STM32的一些定時(shí)器具有四個(gè)外部通道,可利用一個(gè)定時(shí)器采集外部四路脈沖頻率,節(jié)約硬件資源和軟件代碼如需要測(cè)量一個(gè)或多個(gè)外部方波脈沖頻率,頻率低于單片

輸入捕獲作為定時(shí)器的一個(gè)功能,在工業(yè)測(cè)速上有很大的應(yīng)用。STM32的一些定時(shí)器具有四個(gè)外部通道,可利用一個(gè)定時(shí)器采集外部四路脈沖頻率,節(jié)約硬件資源和軟件代碼

如需要測(cè)量一個(gè)或多個(gè)外部方波脈沖頻率,頻率低于單片機(jī)運(yùn)行頻率,可如下操作:(以TIM4為例)

初始化:(省略GPIO配置,將TIM4的四個(gè)通道引腳配置為上拉或浮空輸入,省略定時(shí)器RCC配置,省略中斷NVIC配置)

void TIM_Configuration(void)

{

TIM_ICInitTypeDef TIM_ICInitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // TIM4 時(shí)基

TIM_DeInit(TIM4);

TIM_TimeBaseStructure.TIM_Period =0xffff;//自動(dòng)重裝值

TIM_TimeBaseStructure.TIM_Prescaler =719;//預(yù)分頻值, 使TIMx_CLK=1MHz

TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1;//輸入時(shí)鐘不分頻

TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;//向上計(jì)數(shù)

TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);//TIM4_TimeBase

// TIM_ICInitStructure.TIM_ICMode =TIM_ICMode_ICAP; //輸入捕捉方式

TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//|TIM_Channel_2; //輸入通道

TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising; //捕捉上升沿

TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; //捕捉中斷

TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1; //捕捉不分頻

TIM_ICInitStructure.TIM_ICFilter =0x0; //捕捉輸入不濾波

TIM_ICInit(TIM4, &TIM_ICInitStructure);

TIM_ICInitStructure.TIM_Channel = TIM_Channel_2 ;//|TIM_Channel_2; //輸入通道

TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising; //捕捉上升沿

TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; //捕捉中斷

TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1; //捕捉不分頻

TIM_ICInitStructure.TIM_ICFilter =0x0; //捕捉輸入不濾波

TIM_ICInit(TIM4, &TIM_ICInitStructure);

TIM_ICInitStructure.TIM_Channel = TIM_Channel_3 ;//|TIM_Channel_2; //輸入通道

TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising; //捕捉上升沿

TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; //捕捉中斷

TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1; //捕捉不分頻

TIM_ICInitStructure.TIM_ICFilter =0x0; //捕捉輸入不濾波

TIM_ICInit(TIM4, &TIM_ICInitStructure);

TIM_ICInitStructure.TIM_Channel = TIM_Channel_4 ;//|TIM_Channel_2; //輸入通道

TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising; //捕捉上升沿

TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; //捕捉中斷

TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1; //捕捉不分頻

TIM_ICInitStructure.TIM_ICFilter =0x0; //捕捉輸入不濾波

TIM_ICInit(TIM4, &TIM_ICInitStructure);

TIM_Cmd(TIM4, ENABLE);

TIM_ITConfig(TIM4, TIM_IT_CC1, ENABLE);

TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE);

TIM_ITConfig(TIM4, TIM_IT_CC3, ENABLE);

TIM_ITConfig(TIM4, TIM_IT_CC4, ENABLE);

}

其中:

TIM_TimeBaseStructure.TIM_Period = 0xffff;為自動(dòng)重裝值,與普通單片機(jī)一樣

TIM_TimeBaseStructure.TIM_Prescaler = 719; 預(yù)分頻值, 使TIMx_CLK=100KHz ,系統(tǒng)時(shí)鐘運(yùn)行于72M時(shí)720分頻,定時(shí)器運(yùn)行于100KHZ,即10us每分度

TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; 此句選擇定時(shí)器為輸入捕獲模式,但在我的庫函數(shù)下未定義,所以注釋掉,未影響程序執(zhí)行

TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;配置通道1

TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;上升沿捕獲

TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;捕獲中斷

TIM_ICInitStructure.TIM_ICFilter = 0x0;不濾波

TIM_ICInit(TIM4, &TIM_ICInitStructure);將配置應(yīng)用

以上每個(gè)通道都需要將整個(gè)配置再寫一遍,使用與'|'是無效的。

TIM_Cmd(TIM4, ENABLE);使能定時(shí)器4

TIM_ITConfig(TIM4, TIM_IT_CC1, ENABLE);

TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE);

TIM_ITConfig(TIM4, TIM_IT_CC3, ENABLE);

TIM_ITConfig(TIM4, TIM_IT_CC4, ENABLE);打開四個(gè)通道的捕獲中斷

以上將TIM配置完成,下面是中斷內(nèi)代碼:

void

TIM4_IRQHandler(void)

{

//頻率緩沖區(qū)計(jì)數(shù)

static u16 this_time_CH1 = 0;

static u16 last_time_CH1 = 0;

static u8 capture_number_CH1 = 0;

vu16 tmp16_CH1;

static u16 this_time_CH2 = 0;

static u16 last_time_CH2 = 0;

static u8 capture_number_CH2 = 0;

vu16 tmp16_CH2;

static u16 this_time_CH3 = 0;

static u16 last_time_CH3 = 0;

static u8 capture_number_CH3 = 0;

vu16 tmp16_CH3;

static u16 this_time_CH4 = 0;

static u16 last_time_CH4 = 0;

static u8 capture_number_CH4 = 0;

vu16 tmp16_CH4;

if(TIM_GetITStatus(TIM4, TIM_IT_CC1) == SET)

{

TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);

if(capture_number_CH1 == 0)

{

capture_number_CH1 = 1;

last_time_CH1 = TIM_GetCapture1(TIM4);

}

else if(capture_number_CH1 == 1)

{

capture_number_CH1 = 0;

this_time_CH1 = TIM_GetCapture1(TIM4);

if(this_time_CH1 > last_time_CH1)

{

tmp16_CH1 = (this_time_CH1 - last_time_CH1);

}

else

{

tmp16_CH1 = ((0xFFFF - last_time_CH1) + this_time_CH1);

}

//TIM2 counter clock = 1MHz

//

FreqBuf[cnt] = (1000000L * 100) / tmp16; //*100為擴(kuò)大顯示量程

Freq_Value[0]=tmp16_CH1;

}

}

if(TIM_GetITStatus(TIM4, TIM_IT_CC2) == SET)

{

TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);

if(capture_number_CH2 == 0)

{

capture_number_CH2 = 1;

last_time_CH2 = TIM_GetCapture2(TIM4);

}

else if(capture_number_CH2 == 1)

{

capture_number_CH2 = 0;

this_time_CH2 = TIM_GetCapture2(TIM4);

if(this_time_CH2 > last_time_CH2)

{

tmp16_CH2 = (this_time_CH2 - last_time_CH2);

}

else

{

tmp16_CH2 = ((0xFFFF - last_time_CH2) + this_time_CH2);

}

//TIM2 counter clock = 1MHz

//

FreqBuf[cnt] = (1000000L * 100) / tmp16; //*100為擴(kuò)大顯示量程

Freq_Value[1]=tmp16_CH2;

}

}

if(TIM_GetITStatus(TIM4, TIM_IT_CC3) == SET)

{

TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);

if(capture_number_CH3 == 0)

{

capture_number_CH3 = 1;

last_time_CH3 = TIM_GetCapture3(TIM4);

}

else if(capture_number_CH3 == 1)

{

capture_number_CH3 = 0;

this_time_CH3 = TIM_GetCapture3(TIM4);

if(this_time_CH3 > last_time_CH3)

{

tmp16_CH3 = (this_time_CH3 - last_time_CH3);

}

else

{

tmp16_CH3 = ((0xFFFF - last_time_CH3) + this_time_CH3);

}

//TIM2 counter clock = 1MHz //

FreqBuf[cnt] = (1000000L * 100) / tmp16; //*100為擴(kuò)大顯示量程

Freq_Value[2]=tmp16_CH3;

}

}

if(TIM_GetITStatus(TIM4, TIM_IT_CC4) == SET)

{

TIM_ClearITPendingBit(TIM4, TIM_IT_CC4);

if(capture_number_CH4 == 0)

{

capture_number_CH4 = 1;

last_time_CH4 = TIM_GetCapture4(TIM4);

}

else if(capture_number_CH4 == 1)

{

capture_number_CH4 = 0;

this_time_CH4 = TIM_GetCapture4(TIM4);

if(this_time_CH4 > last_time_CH4)

{

tmp16_CH4 = (this_time_CH4 - last_time_CH4);

}

else

{

tmp16_CH4 = ((0xFFFF - last_time_CH4) + this_time_CH4);

}

//TIM2 counter clock = 1MHz //

FreqBuf[cnt] = (1000000L * 100) / tmp16; //*100為擴(kuò)大顯示量程

Freq_Value[3]=tmp16_CH4;

}

}//

GPIO_WriteBit(GPIOC, GPIO_Pin_13,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13))));

}

中斷內(nèi)四部分代碼完全一樣,只分析其中一段輸入捕獲的原理是,

定時(shí)器正常計(jì)數(shù)運(yùn)行,當(dāng)外部脈沖到來時(shí),將定時(shí)器計(jì)數(shù)值存起來,當(dāng)下次脈沖到來時(shí),求出這兩次計(jì)數(shù)值差值,即為這兩段脈沖的周期。

例如,

定時(shí)器計(jì)數(shù)到10,外部脈沖到來,使用last_time_CH1存儲(chǔ)10,

下次脈沖到來,此時(shí)定時(shí)器計(jì)數(shù)值運(yùn)行到110,使用this_time_CH1存儲(chǔ)110,

之后做差,tmp16_CH1存儲(chǔ)差值100,由于定時(shí)器運(yùn)行于100KHZ,10us計(jì)數(shù)值增加一次,所以脈沖周期為100*10=1000us=1ms,即為1KHZ。

當(dāng)然,定時(shí)器會(huì)溢出重裝,此時(shí)需要將差值補(bǔ)償運(yùn)算,tmp16_CH1 = ((0xFFFF - last_time_CH1) + this_time_CH1);

可測(cè)量的范圍取決于定時(shí)器運(yùn)行的頻率,如果外部頻率慢到當(dāng)定時(shí)器整個(gè)計(jì)數(shù)一周后也沒有觸發(fā)兩次,會(huì)發(fā)生溢出,此時(shí)計(jì)數(shù)值已不準(zhǔn)確。

所以定時(shí)器時(shí)鐘配置取決于外部脈沖頻率,應(yīng)配置得當(dāng)使得脈沖頻率范圍不致溢出。

由于每次外部脈沖都會(huì)觸發(fā)中斷,尤其是四通道時(shí),所以使用中斷方式會(huì)略微占用CPU資源,使用DMA可以解決這一問題。

得到脈沖周期后,即可通過運(yùn)算獲得外部頻率,進(jìn)而測(cè)速。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉