STM32 HAL庫學習系列第7篇---定時器TIM 輸入捕獲功能


12856594-a8518d7be3709d7a.webp.jpg

測量脈沖寬度或者測量頻率

基本方法

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]就是高電平所占時間。

時鍾配置:
image.png

引腳看是否需要上拉
image.png

做項目中的一個例子:

/**
  * 函數功能: 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;   //刪除
        }
  }
}

應用:

1.脈沖時間測量

2.電容按鍵使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM