您好,登錄后才能下訂單哦!
小編給大家分享一下STM32如何實現(xiàn)輸入捕獲功能,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
從STM32的定時器框圖中看
①部分基礎(chǔ)定時器模塊,已經(jīng)在《STM32基礎(chǔ)定時器詳解》講解過了。
②部分捕獲/對比通道模塊,已經(jīng)在《定時器的PWM功能》講解過了。
③部分是本文的重點,輸入捕獲模塊。
從上圖可以看出定時器1共有4個輸入捕獲通道。
下文以定時器1的捕獲通道2為例講解。
首先確定下對應(yīng)的GPIO,從STM32F207數(shù)據(jù)手冊的Alternatefunction mapping看出,定時器1通道2對應(yīng)的GPIO有PA9和PE11,下文將使用PE11。
輸入階段采樣對應(yīng)的對輸入TIx,去產(chǎn)生濾波后的信號TIxF。然后極性選擇邊沿檢測器產(chǎn)生一個信號(TIxFPx),這個信號可以被用于服務(wù)模式控制器的觸發(fā)輸入或在作為捕獲命令。在捕獲寄存器前被預(yù)分頻。
輸出階段產(chǎn)生一個中間波形,被用于參考:OCxRef(高電平有效)。鏈地末尾末尾決定極0性。捕獲/比較通道1 主電路。
①處主要是設(shè)置輸入捕獲濾波器,輸入階段采樣對應(yīng)的對輸入TIx,去產(chǎn)生濾波后的信號TIxF。一般應(yīng)用場景不做濾波處理,設(shè)置TIMx_CCMR1的ICF[3:0]=0000,只要采集到上升沿,就觸發(fā)捕獲。
②處主要是設(shè)置輸入捕獲極性,設(shè)置TIMx_CCER的CC1P或CC1NP位,如果通道配置為輸出,為0表示高電平有效,為1表示低電平有效;如果配置成輸入模式,該位選擇是IC1還是IC1的反相信號作為觸發(fā)或捕獲信號。為0,表示不反相,為1表示反相。
③處設(shè)置輸入捕獲映射通道,設(shè)置TIMx_CCMR1的CC1S[1:0]位,這2位定義通道的方向(輸入/輸出),及輸入腳的選擇:
0o:CC1通道被配置為輸出;
01:CC1通道被配置為輸入,IC1映射在Tl1上;
10: CC1通道被配置為輸入,IC1映射在TI2上;
11:CC1通道被配置為輸入,IC1映射在TRC上。此模式僅工作在內(nèi)部觸發(fā)器輸入被選中時(由TIMx_SMCR寄存器的TS位選擇)。
④處設(shè)置輸入捕獲分頻器,TIMx_CCMR1的ICPS[1:0]位和TIMx_CCER的CC1E位。
TIMx_CCMR1的ICPS[1:0]這2位定義了CC1輸入(IC1)的預(yù)分頻系數(shù)。一旦CC1E='O(TIMx_CCER寄存器中),則預(yù)分頻器復(fù)位。
00:無預(yù)分頻器,捕獲輸入口上檢測到的每一個邊沿都觸發(fā)一次捕獲;
01:每2個事件觸發(fā)一次捕獲;
10:每4個事件觸發(fā)一次捕獲;
11:每8個事件觸發(fā)一次捕獲。
TIMx_CCER的CC1E位
CC1通道配置為輸出:
0:關(guān)閉一OC1禁止輸出。
1:開啟一OC1信號輸出到對應(yīng)的輸出引腳。
CC1通道配置為輸入:
該位決定了計數(shù)器的值是否能捕獲入TIMx_CCR1寄存器。
0:捕獲禁止;
0:捕獲使能。
最后我們還需要設(shè)置中斷,使系統(tǒng)快速響應(yīng)輸入捕獲信號,主要是這只TIMx_DIER寄存器,如下:
使能允許更新中斷和通道2中斷
設(shè)置GPIO復(fù)用
/* TIM1 channel 2 pin (PE.11) configuration*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed =GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType =GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_NOPULL; GPIO_Init(GPIOE, &GPIO_InitStructure); /*Connect TIM pins to AF2 */ GPIO_PinAFConfig(GPIOE,GPIO_PinSource11, GPIO_AF_TIM1);
設(shè)定定時基礎(chǔ)功能
/* Time base configuration */ TIM_TimeBaseStructure.TIM_Period =0XFFFF; TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t)((SystemCoreClock) / 1000000) -1; TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
配置通道2
TIM_ICInitStructure.TIM_Channel =TIM_Channel_2; TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Falling; TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter =0x0; TIM_ICInit(TIM1, &TIM_ICInitStructure);
使能中斷
/* Enable the TIM1 global Interrupt*/ NVIC_InitStructure.NVIC_IRQChannel =TIM1_CC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority =1; NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel =TIM1_UP_TIM10_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority= 2; NVIC_Init(&NVIC_InitStructure); /* Enablethe CC2 Interrupt Request */ TIM_ITConfig(TIM1,TIM_IT_CC2|TIM_IT_Update, ENABLE);
使能定時器1
/* TIM enable counter */ TIM_Cmd(TIM1, ENABLE);
下載代碼驗證測試
看完了這篇文章,相信你對“STM32如何實現(xiàn)輸入捕獲功能”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。