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

具體來說就是使用PA15和PB4來做輸入捕獲。
輸入捕獲原理簡介
輸入捕獲能夠?qū)斎胄盘柕纳仙睾拖陆笛剡M行捕獲,并且記錄下捕獲時定時器的數(shù)值以及觸發(fā)中斷。

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

以及

之后要記得打開中斷:

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

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

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

我們只需要看一個周期,其它周期都一樣,這樣一來,通道一捕獲的值為整個周期的持續(xù)時間,通道二捕獲的值即為高電平的持續(xù)時間,這也為咱們的程序設計提供了依據(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;//得到占空比} }
}
由于我們使用雙通道模式,因此無論是啟動操作還是回調(diào)函數(shù),都必須要寫兩個通道,這樣代碼思路就十分明確,便于我們記憶。
總結(jié)
想要在比賽中正確地完成輸入的捕獲,我們需要掌握兩點內(nèi)容:
CubeMX配置,只能通過不斷練習來記憶
Keil代碼編寫,主要記憶思路(啟動捕獲,中斷回調(diào)函數(shù)編寫)
對于程序的思路:
首先啟動捕獲中斷(HAL_TIM_IC_Start();)注意雙通道要寫兩個
其次回調(diào)函數(shù)編寫(void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim))注意雙通道時,一個通道測周期,一個通道測高電平持續(xù)時間。