測量脈沖寬度或者測量頻率
基本方法
1.設置TIM2 CH1為輸入捕獲功能;
2.設置上升沿捕獲;
3.使能TIM2 CH1捕獲功能;
4.捕獲到上升沿后,存入capture_buf[0],改為捕獲下降沿;
5.捕獲到下降沿后,存入capture_buf[1],改為捕獲上升沿;
6.捕獲到上升沿后,存入capture_buf[2],關閉TIM2 CH1捕獲功能;
7.計算:capture_buf[2] - capture_buf[0]就是周期,capture_buf[1] - capture_buf[0]就是高電平所占時間。
時鍾配置:
引腳看是否需要上拉
做項目中的一個例子:
/**
* 函數功能: TIM_IC配置
* 輸入參數: value
* 返 回 值: 無
* 說 明: 無
*/
void user_ic_config(uint16_t value)
{
TIM_IC_InitTypeDef sConfigIC;
if(value != 0) //1
{
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;//上升沿
}
else//0
{
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING; //下降沿
}
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1);
}
/**
* 函數功能: TIM_IC回調函數
* 輸入參數: htim
* 返 回 值: 無
* 說 明: 得到轉速
*/
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
static uint32_t uwICValue;
static uint32_t last_uwICValue;
uint32_t uwDiffCapture;
if ( ((htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)||(htim->Channel== HAL_TIM_ACTIVE_CHANNEL_4)) && (htim->Instance == TIM3) )
{
pulseCntr++;
last_uwICValue = uwICValue;
uwICValue = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
if(HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_3) != HAL_OK) //開啟定時器中斷
{
}
if (uwICValue > last_uwICValue)
{
uwDiffCapture = (uwICValue - last_uwICValue); //脈沖寬度為前后兩個周期相減
}
else if (uwICValue < last_uwICValue) //若超值
{
/* 0xFFFF is max TIM2_CCRx value */
uwDiffCapture = ((0xFFFF - last_uwICValue) + uwICValue) + 1;
}
if(uwDiffCapture < 0x10000)
{
middleCapture = uwDiffCapture; //脈沖寬度
}
pulsein_flag = 1; // 捕捉到標記
}
else if ( (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) && (htim->Instance == TIM2) )
{
if(uhCaptureIndex == 0)
{
// 第一個脈沖,檢測的是上升沿
uwIC2Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
uhCaptureIndex = 1;
user_ic_config(0); //下降
if(HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1) != HAL_OK) //中斷
{
}
}
else if(uhCaptureIndex == 1)
{
uwIC2Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
uhCaptureIndex = 0;
user_ic_config(1);//上升
if(HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1) != HAL_OK)
{
}
/* Capture computation */
if (uwIC2Value2 > uwIC2Value1)
{
uwDiffCapture = (uwIC2Value2 - uwIC2Value1); //脈沖寬度
}
else if (uwIC2Value2 < uwIC2Value1)
{
/* 0xFFFF is max TIM2_CCRx value */
uwDiffCapture = ((40000 - uwIC2Value1) + uwIC2Value2) + 1;
}
RCin = uwDiffCapture/2; //刪除
}
}
}