寧波市住房和城鄉(xiāng)建設(shè)委員網(wǎng)站網(wǎng)絡(luò)銷售培訓(xùn)
前言
輸入捕獲的考題十分明確,就是測量輸入脈沖波形的占空比和頻率,對我們的板子而言,就是檢測板載的兩個(gè)信號(hào)發(fā)生器產(chǎn)生的信號(hào):

具體來說就是使用PA15和PB4來做輸入捕獲。
輸入捕獲原理簡介
輸入捕獲能夠?qū)斎胄盘?hào)的上升沿和下降沿進(jìn)行捕獲,并且記錄下捕獲時(shí)定時(shí)器的數(shù)值以及觸發(fā)中斷。

借用一張圖來闡明這個(gè)動(dòng)作:
邊沿觸發(fā),產(chǎn)生捕獲中斷
中斷中讀取當(dāng)前的計(jì)數(shù)值CCR,并且將計(jì)數(shù)值清零
退出中斷
因此通過計(jì)數(shù)值可以計(jì)算出高電平持續(xù)時(shí)間,這里面有一個(gè)溢出的問題,對于我們的信號(hào)發(fā)生器來說,其信號(hào)的頻率比較高,計(jì)數(shù)器不會(huì)發(fā)生溢出,因此不需要考慮。
根據(jù)功能分為兩類:
普通輸入捕獲(只能測頻率)
PWM輸入模式(可以測頻率和占空比)
普通輸入捕獲
一、CubeMX配置

以及

之后要記得打開中斷:

二、Keil軟件編寫
開啟捕獲
HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);
第一個(gè)參數(shù)是定時(shí)器句柄,在tim.c中定義,第二個(gè)參數(shù)是通道:

編寫回調(diào)函數(shù)
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3) //判斷是哪個(gè)定時(shí)器觸發(fā){if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) //判斷是哪個(gè)通道觸發(fā){Counter=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)+1;//獲取計(jì)數(shù)值+1Freq=1000000/Counter;//計(jì)算頻率}}
}
進(jìn)入回調(diào)函數(shù)后,先判斷定時(shí)器類型,再判斷是哪個(gè)通道,完成之后再獲取計(jì)數(shù)值,并且完成頻率計(jì)算。
PWM輸入捕獲(雙通道模式)
一、CubeMX配置
類似普通單通道輸入捕獲,這里就是將通道2的輸入通道設(shè)置為簡介模式,并且在下面的配置中,將其捕獲的極性設(shè)置為下降沿:

雙通道的原理借用下圖展示:

我們只需要看一個(gè)周期,其它周期都一樣,這樣一來,通道一捕獲的值為整個(gè)周期的持續(xù)時(shí)間,通道二捕獲的值即為高電平的持續(xù)時(shí)間,這也為咱們的程序設(shè)計(jì)提供了依據(jù)。
二、Keil軟件編寫
開啟捕獲
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);//開啟CH1輸入捕獲中斷
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2);//開啟CH2輸入捕獲中斷
編寫中斷回調(diào)函數(shù)
//輸入捕獲中斷回調(diào)函數(shù)
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3){if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){T_Count = HAL_TIM_ReadCapturedValue (htim,TIM_CHANNEL_1)+1;//得到周期值Freq = 1000000 / T_Count;Duty = (float)D_Count/T_Count * 100;}else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2){D_Count = HAL_TIM_ReadCapturedValue (htim,TIM_CHANNEL_2)+1;//得到占空比} }
}
由于我們使用雙通道模式,因此無論是啟動(dòng)操作還是回調(diào)函數(shù),都必須要寫兩個(gè)通道,這樣代碼思路就十分明確,便于我們記憶。
總結(jié)
想要在比賽中正確地完成輸入的捕獲,我們需要掌握兩點(diǎn)內(nèi)容:
CubeMX配置,只能通過不斷練習(xí)來記憶
Keil代碼編寫,主要記憶思路(啟動(dòng)捕獲,中斷回調(diào)函數(shù)編寫)
對于程序的思路:
首先啟動(dòng)捕獲中斷(HAL_TIM_IC_Start();)注意雙通道要寫兩個(gè)
其次回調(diào)函數(shù)編寫(void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim))注意雙通道時(shí),一個(gè)通道測周期,一個(gè)通道測高電平持續(xù)時(shí)間。