0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32基础知识:定时器输入捕获功能

CHANBAEK 来源:上下求索电子er 作者:上下求索电子er 2023-10-25 15:19 次阅读

定时器输入捕获功能

1 输入捕获功能概述

1.1 输入捕获功能的用途和工作原理

  • 用途:用于测量信号参数,比如周期和频率。
  • 工作原理:在输入捕获模式下,当捕获单元捕捉到外部信号的有效边沿(上升沿/下降 沿/双边沿)时,将计数器的当前值锁存到捕获/比较寄存器TIMx_CCR, 供用户读取。

1.2 捕获通道的内部结构

图片

图片

1.3 捕获过程示意图

图片

图片

将两次捕获值相减,再乘以计数时间可计算出信号周期

1.4 信号参数计算公式

信号参数计算公式

周期

频率

当待测信号不大于定时器的一个完整计数周期(从0到ARR)时。假设两次连续的捕获值分别为CCRx_1 和 CCRx_2,则捕获差值可以按照如下方法计算:

  • 如果 CCRx_1 < CCRx_2:捕获差值 = CCRx_2 - CCRx_1
  • 如果 CCRx_1 > CCRx_2:捕获差值 = (ARR + 1 - CCRx_1) + CCRx_2

注意:如果待测信号大于定时器的一个完整计数周期,则需要结合定时器的更新中断次数来计算捕获差值。

1.5 输入捕获功能的数据类型和接口函数

图片

成员变量ICPolarity的取值范围

宏常量定义含义
TIM_ICPOLARITY_RISING上升沿捕获
TIM_ICPOLARITY_FALLING下降沿捕获
TIM_ICPOLARITY_BOTHEDGE双边沿捕获

成员变量ICSelection的取值范围

宏常量定义含义
TIM_ICSELECTION_DIRECTTI直接输入模式:捕获通道CH1和CH2分别与IC1和IC2连接.捕获通道CH3和CH4分别与IC3和IC4连接.
TIM_ICSELECTION_DIRECTT2间接输入模式:捕获通道CH1和CH2分别与IC2和IC1连接.捕获通道CH3和CH4分别与IC4和IC3连接.
TIM_ICSELECTION_TRC选择从模式管理器的触发信号TRC 作获信号.

成员变量ICPrescaler的取值范围

宏常量定义含义
TIM_ICPSC_DIV1检测到输入信号的每1个有效边沿触发1次捕获
TIM_ICPSC_DIV2检测到输入信号的每2个有效边沿触发1次捕获
TIM_ICPSC_DIV3检测到输入信号的每4个有效边沿触发1次捕获
TIM_ICPSC_DIV4检测到输入信号的每8个有效边沿触发1次捕获
  1. 输入捕获启动函数:HAL_TIM_IC_Start_IT

    函数原型uint32_t HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
    功能描述用于在中断方式下启动定时器的输入捕获功能
    入口参数htim:定时器句柄的地址Channel:定时器通道号,取值范围是TIM_CHANNEL_1~TIM_CHANNEL_4
    返回值HAL状态值
    注意事项1. 该函数在定时器初始化完成之后调用2. 函数需要由用户调用,用于使能定时器的捕获中断,并启动定时器运行
  2. 输入捕获停止函数:HAL_TIM_IC_Stop_IT

    函数原型HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
    功能描述用于停止在中断方式下定时器的输入捕获功能
    入口参数htim:定时器句柄的地址Channel:定时器通道号,取值范围是TIM_CHANNEL_1~TIM_CHANNEL_4
    返回值HAL状态值
    注意事项1. 该函数需要由用户调用,用于禁止捕获中断,关闭输入捕获通道,停止 定时器运行
  3. 输入捕获中断回调函数:HAL_TIM_IC_CaptureCallback

    函数原型void HAL_TIM_IC_CaptureCallback (TIM_HandleTypeDef *htim)
    功能描述用于处理所有定时器的输入捕获中断,用户在该函数内编写实际的任务处理程序
    入口参数htim:定时器句柄的地址
    返回值
    注意事项1. 该函数由定时器中断通用处理函数HAL_TIM_IRQHandler调用,完成所 有定时器输入捕获中断的任务处理2. 函数内部需要根据定时器句柄的实例来判断是哪一个定时器的哪一个通道 产生的本次输入捕获中断3. 函数由用户根据具体的处理任务编写
  4. 捕获值读取函数:HAL_TIM_ReadCapturedValue

    函数原型uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel)
    功能描述用于处理所有定时器的输入捕获中断,用户在该函数内编写实际的任务处理程序
    入口参数htim:定时器句柄的地址Channel:定时器通道号,取值范围是TIM_CHANNEL_1~TIM_CHANNEL_4
    返回值捕获值
    注意事项1. 函数需要由用户调用,用于读取发生捕获时的捕获值
  5. 捕获边沿设置函数:__HAL_TIM_SET_CAPTUREPOLARITY

    函数原型__HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__
    功能描述用于设置输入信号的捕获边沿
    入口参数HANDLE :定时器句柄的地址__Channel__:定时器通道号, 取值范围是TIM_CHANNEL_1~TIM_CHANNEL_4__POLARITY__ :捕获边沿, 取值范围是TIM_INPUTCHANNELPOLARITY_RISING/FALLING/BOTHEDGE
    返回值
    注意事项1. 该函数是宏函数,进行宏替换,不发生函数调用2. 函数需要由用户调用,用于设置输入信号的有效捕获边沿

2 任务实践

利用定时器2的通道1(对应引脚PA0)来测量一个外部脉冲信号的周期和频率,外部脉冲信号利用引脚PA6输入。

  1. 配置定时器2时钟源为内部时钟源(8MHz),通道一为输入捕获方式。
    配置时基单元
    • 预分频系数PSC为0,即计数时钟CK_CNT为8MHz,便于扩大测量频率的范围。
    • 设置自动重载值ARR为最长的计数周期,便于扩大测量频率的脉宽。
      配置输入捕获通道采用默认参数
  • 捕获有效边沿为上升沿
  • 捕获通道为直接输入方式
  • 捕获信号不分频
  • 捕获信号不进行滤波

图片

使能定时器2的全局中断,中断优先级使用默认值

图片

  1. 配置定时器3时钟源为内部时钟源(8MHz),通道一为PWM输出模式。
    设置预分频系数PSC为399,自动重载值 ARR为199,表示PWM信号的周期为10ms。
    设置捕获/比较值CRR为100, 表示PWM信号的占空比为50%
    图片
  2. 打开串口USART1,并在工程中添加头文件和prinrf函数重定义,Keil中勾选USE MicroLIB。
    在CubeMX中配置串口,在Keil中使用“Use MicroLIB”并在代码中重定向printf函数的方法在STM32基础:定时器的定时计数功能中有详细讲解。
  3. 编写程序
    /* USER CODE BEGIN PV */
    uint32_t Diff       = 0;   // 存放捕获差值
    uint32_t Period     = 0;   // 存放计算所得周期
    uint8_t MeasureFlag = 0;   // 测量完成标志:  0表示未完成,  1表示完成
    uint8_t CapIndex    = 0;   // 捕获指示:  0表示没有开始捕获,  1表示完成一次捕获
    uint32_t CapVal1    = 0;   // 存放第一次捕获值
    uint32_t CapVal2    = 0;   // 存放第二次捕获值
    /* USER CODE END PV */
    
    /* USER CODE BEGIN 2 */
      printf("Timer Capture Function Test: n");
      HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
      HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
      /* USER CODE END 2 */
    
      /* USER CODE BEGIN 3 */
        if(MeasureFlag == 1) 
        {
          if(CapVal2 >=  CapVal1)
          {
            Diff = CapVal2 -  CapVal1;
          }
          else
          {
            Diff = ((65535 + 1 - CapVal1) + CapVal2) ;
          }
        }
        Period = Diff/20000;
        printf ("Period    is: %.4fmsrn", Diff/20000.0);
        printf ("Frequency is: %dHzrn", 8000000/Period);
        printf ("/*****************************/rn");
        MeasureFlag = 0;
        HAL_Delay(1000);
        HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
      }
      /* USER CODE END 3 */
    
    /* USER CODE BEGIN 4 */
    int fputc (int ch, FILE *f)
    {
        HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
        return ch;
    }
    
    int fgetc(FILE *f)
    {
        uint8_t ch = 0;
        HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
        return ch;
    }
    
    void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    {
      if (htim- >Instance == TIM2)
      {
        if (htim- >Channel == HAL_TIM_ACTIVE_CHANNEL_1)
        {
          if (CapIndex == 0)
          {
            CapVal1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
            CapIndex = 1;
          }
          if (CapIndex == 1)
          {
            CapVal2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
            CapIndex = 0;
            MeasureFlag = 1;
          }
          else
          {
            Error_Handler();
          }
        }
      }
    }
    /* USER CODE END 4 */
    
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5032

    浏览量

    117745
  • STM32
    +关注

    关注

    2240

    文章

    10674

    浏览量

    348804
  • 计数器
    +关注

    关注

    32

    文章

    2123

    浏览量

    92987
  • 定时器
    +关注

    关注

    23

    文章

    3148

    浏览量

    112043
收藏 人收藏

    评论

    相关推荐

    详解STM32定时器捕获功能

    STM32定时器是支持信号输入捕获的,何为输入捕获?主要做什么应用?
    的头像 发表于 01-12 17:24 6796次阅读
    详解<b class='flag-5'>STM32</b><b class='flag-5'>定时器</b><b class='flag-5'>捕获</b><b class='flag-5'>功能</b>

    STM32定时器(三)输入捕获

    STM32定时器是支持信号输入捕获的,何为输入捕获?主要做什么应用?
    的头像 发表于 07-21 14:58 2716次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>(三)<b class='flag-5'>输入</b><b class='flag-5'>捕获</b>

    定时器基础知识

    目录:一、定时器基础知识二、基本定时器(TIM6和TIM7)三、通用定时器(TIM2~TIM6)1.功能特点2.时钟源3.时基单元4.
    发表于 08-09 07:30

    stm32定时器pwm模式输入捕获功能

    stm32定时器pwm模式输入捕获##stm32中的定时器,除了TIM6和TIM7,其他
    发表于 08-18 07:41

    STM32 --通用定时器输入捕获功能 精选资料推荐

    问题:开始的时候没有搞清楚 定时器时基 于 定时器溢出中断导致在计算的时候一直有问题。开始并没有怀疑是配置有问题,因为之前接触过定时器输入捕获
    发表于 08-19 06:34

    浅析stm32定时器pwm模式输入捕获

    stm32定时器pwm模式输入捕获stm32中的定时器,除了TIM6和TIM7,其他
    发表于 08-19 07:33

    STM32通用定时器输入捕获功能是什么?

    STM32通用定时器输入捕获功能是什么?
    发表于 11-24 07:39

    从应用方面详解STM32定时器输入捕获模式

    从应用来说STM32定时器输入捕获模式前言原理输入捕获初始化程序中断函数和处理函数前言我们知道
    发表于 01-06 07:37

    定时器基础知识与PWM输出原理介绍

    上篇电机控制基础——定时器基础知识与PWM输出原理介绍了定时器的输出功能,本篇介绍定时器输入
    发表于 01-20 08:23

    stm32定时器输入捕获

    不同频率、不同占空比的方波信号、PWM信号,同时做为输入捕获功能时,可以测量脉冲宽度、实现电容按键检测等等。 一、输入捕获概念
    发表于 10-13 09:13 2.3w次阅读
    <b class='flag-5'>stm32</b><b class='flag-5'>定时器</b><b class='flag-5'>输入</b><b class='flag-5'>捕获</b>

    基于STM32定时器输入捕获解析

    输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32定时器,除了TIM6和TIM7,其他定时器都有
    发表于 09-04 11:00 5744次阅读

    stm32 定时器 捕获

    输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32定时器,除了TIM6和TIM7,其他定时器都有
    发表于 09-08 17:07 2185次阅读

    基于STM32定时器捕获测量脉宽的应用示例

    我们知道,利用单片机定时器捕获功能测量脉冲信号宽度及占空比是种很常见的做法。这里以STM32定时器为例来介绍基于其
    的头像 发表于 01-02 18:17 1.2w次阅读
    基于<b class='flag-5'>STM32</b><b class='flag-5'>定时器</b><b class='flag-5'>捕获</b>测量脉宽的应用示例

    STM32CubeMX——定时器输入捕获

    通用定时器在基本定时器的基础上增加了一个外部引脚,可以实现输入捕获与输出比较等功能。高级定时器T
    发表于 12-02 14:06 9次下载
    <b class='flag-5'>STM32</b>CubeMX——<b class='flag-5'>定时器</b><b class='flag-5'>输入</b><b class='flag-5'>捕获</b>

    STM32定时器输入捕获实验

    概述输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32定时器,除了 TIM6 和 TIM7,其他定时器都有
    发表于 12-14 18:58 20次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>定时器</b><b class='flag-5'>输入</b><b class='flag-5'>捕获</b>实验