STM32 HAL库学习系列第7篇---定时器TIM 输入捕获功能

Posted allen5g

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32 HAL库学习系列第7篇---定时器TIM 输入捕获功能相关的知识,希望对你有一定的参考价值。

技术图片

测量脉冲宽度或者测量频率

?

基本方法

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;   //删除
        
  

应用:

1.脉冲时间测量

2.电容按键使用

以上是关于STM32 HAL库学习系列第7篇---定时器TIM 输入捕获功能的主要内容,如果未能解决你的问题,请参考以下文章

STM32 HAL库学习系列第9篇---NVIC按键外部中断函数

STM32G0学习手册——使用定时器中断(HAL库)

STM32H7教程第36章 STM32H7的LPTIM低功耗定时器基础知识和HAL库API

STM32-HAL库-TIMx学习

STM32标准库与HAL库对照学习教程外设篇--红外避障传感器

HAL库系列0.STM32CubeIDE介绍