[stm32]stm32F4輸入捕獲原理

捕獲原理

在這裏插入圖片描述
假如我們要捕獲如圖所示波形的脈寬。
1.先設置定時器爲向上計數模式
2.設置定時器的採樣通道channelx爲上升下降沿捕獲,所以在t1時刻,上升沿就會捕獲到當前CNT的值,隨即將CNT清零
3.在t2時刻下降沿會捕獲CNT的值,記爲CCRx2
4.根據定時器的頻率,以及期間溢出的次數,即可算出|t1-t2|的時間,從而得到高電平脈寬。如,在高電平期間採樣定時器共溢出N次,則總的計數次數爲N*ARR+CCRx2
5.再捕獲一次上升沿,即可求出一個波形的週期、頻率以及佔空比等信息
根據項目需要調節採樣定時器的分辨率。如果需要精確採樣的話,可以提高採樣定時器的分辨率;反之則降低採樣定時器的分辨率。

捕獲定時器配置部分直接使用stm32cubeMX進行配置咯。
自己需要寫的就是捕獲中斷回調和定時器更新中斷回調即可:

/* 
	* bit7:0,沒有成功的捕獲;1,成功捕獲到一次.
	* bit6:0,還沒捕獲到低電平;1,已經捕獲到低電平了.
	* bit5-bit0:捕獲低電平後溢出的次數
	* /
u8 TIM5CH1_CAPTURE_STA=0; //輸入捕獲狀態
u32 TIM5CH1_CAPTURE_VAL;//輸入捕獲值(TIM2/TIM5 是 32 位)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
	if((TIM5CH1_CAPTURE_STA&0X80)==0){//還未成功捕獲
		if(TIM5CH1_CAPTURE_STA&0X40){//已經捕獲到高電平了
			if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F){//高電平太長了
				TIM5CH1_CAPTURE_STA|=0X80; //標記成功捕獲了一次
				TIM5CH1_CAPTURE_VAL=0XFFFFFFFF;
			}
			else{
				 TIM5CH1_CAPTURE_STA++;
			 }
		}
	}
}

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
	if((TIM5CH1_CAPTURE_STA&0X80)==0){//還未成功捕獲
		if(TIM5CH1_CAPTURE_STA&0X40){ //捕獲到一個下降沿
			TIM5CH1_CAPTURE_STA|=0X80; //標記成功捕獲到一次高電平脈寬
			TIM5CH1_CAPTURE_VAL=HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);//獲取當前的捕獲值.
			TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1); //清除設置
			TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);//上升沿捕獲
		}
		else{ //還未開始,第一次捕獲上升沿
			TIM5CH1_CAPTURE_STA=0; //清空
			TIM5CH1_CAPTURE_VAL=0;
			TIM5CH1_CAPTURE_STA|=0X40; //標記捕獲到了上升沿
			__HAL_TIM_DISABLE(&htim5); //關閉定時器 5
			__HAL_TIM_SET_COUNTER(&htim5,0);
			TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1); //清除原來設置
			TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//下降沿捕獲
			__HAL_TIM_ENABLE(&htim5);//使能定時器 5
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章