引言
輸入捕獲是STM32微控制器上可用的高級定時器功能之一。本文將指導您了解輸入捕獲的理論部分,提供一個實際範例,並討論常見問題的故障排除。在本文中,我們使用STM32H563微控制器。
1,輸入捕獲基礎
輸入捕捉是一項允許定時器記錄外部事件發生時間的功能。這對於測量輸入信號的頻率、週期或脈衝寬度特別有用。定時器在特定輸入引腳上檢測到邊緣(上升沿或下降沿)的時刻,會捕捉其計數器的值。
2,關鍵元件
- 定時器計數器 (Timer counter):一個根據定時器時鐘遞增(或遞減)的暫存器。
- 捕獲/比較暫存器 (CCR):存儲輸入捕獲事件發生時計數器的值。
- 輸入捕獲通道(Input capture channel):用於檢測輸入信號的特定引腳及相關電路。
3,配置參數
- 邊沿選擇 (Edge selection):確定捕捉發生在上升沿、下降沿,還是兩者都捕捉。
- 預分頻器 (Prescaler):分頻定時器時鐘以調整計數器頻率。
- 濾波器 (Filter):透過在捕捉前要求信號在指定持續時間內保持穩定來過濾噪聲。
4,實際範例
本範例旨在使用STM32H563上的定時器2測量外部信號的頻率
硬體設定:將外部訊號連接到定時器2通道1的輸入腳位 (PA0)。
步驟 1:設定時鐘
在本範例中,HCLK時鐘設定為125MHz。定時器2連接到APB1(請參考數據手冊中的框圖來檢查定時器時鐘)。

步驟 2:設定計時器
- 點擊「Configuration(配置)」選項卡。
- 選擇TIM2並為Channel 1(通道1)選擇Input capture direct mode(輸入捕獲直接模式)。


以下公式確定計時器的計數器時鐘頻率 (CK_CNT):
CK_CNT = HCLK / (PSC + 1)
其中:
- HCLK是系統時鐘頻率(本例中為125MHz)。
- PSC 是預分頻器值。
計時器週期由自動重載暫存器 (ARR) 值和計數器時鐘頻率決定,公式為:
周期 = (ARR + 1) ∗ (1 / CKCNT)
其中:
- ARR是自動重載暫存器值。
- CK_CNT 是計數器時鐘頻率。
例如,對於期望的1 ms週期,且CK_CNT=1MHz,我們可以選擇PSC=124,這將時鐘除以125。使用週期公式,ARR=1000-1=999。
步驟 3:啟用計時器中斷

步驟 4:配置 GPIO 引腳
- 在 Pinout & Configuration(引腳分配和配置)選項卡中,選擇連接到輸入信號的引腳(TIM2_CH1 的 PA0)。
- 確保引腳配置為Alternate Function PP(複用功能推挽),並設置為正確的定時器通道。
步驟 5:生成專案程式碼
在中斷模式下啟動輸入捕獲
void TIM2_Start_IC(void)
{
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
}我們使用的變數是:
captureValue:儲存計時器計數器的當前捕捉值
previousCaptureValue:儲存計時器計數器的先前捕獲值。用於計算兩次連續捕獲事件之間的時間差。
頻率:根據捕獲值存儲計算出的輸入信號頻率
處理輸入捕獲中斷
uint32_t captureValue = 0;
uint32_t previousCaptureValue = 0;
uint32_t frequency = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {
captureValue = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
frequency = HAL_RCC_GetPCLK1Freq() / (captureValue - previousCaptureValue);
previousCaptureValue = captureValue;
}
}
5,已知問題故障排除
以下是使用者最可能遇到的問題及其最可能的原因。
5.1. 未偵測到捕獲事件
- 檢查引腳配置確保輸入引腳已正確配置為定時器的多工功能。
- 驗證信號完整性確保輸入信號乾淨且符合微控制器要求的電壓水平。如果信號有雜訊,請考慮使用濾波器。
5.2. 頻率測量不正確
- 調整預分頻器如果測量的頻率過高或過低,請調整預分頻器以使計數值處於可測量範圍內。
- 對輸入信號進行去抖動使用輸入濾波器功能對噪聲信號進行去抖動。
5.3. 中斷未觸發
- 啟用 NVIC確保 NVIC 已配置為處理計時器中斷。
- 檢查定時器時鐘驗證定時器時鐘已啟用且正在運行。
5.4. 溢出和回繞
- 處理溢出:如果輸入信號的週期長於計時器的週期,則需要實現邏輯來處理計數器溢出。
評論