登录/注册

STM32定时捕获详解

更多

好的,我们来详细解释一下 STM32 微控制器中的定时器捕获(Timer Capture)功能。这是定时器模块中非常强大且实用的功能,常用于精确测量外部信号的频率周期占空比脉冲宽度

核心概念:

定时器捕获的核心思想是利用定时器的计数器(CNT)作为时间基准。当外部信号发生指定的边沿事件(上升沿、下降沿或双边沿)时,捕获单元会瞬间锁存当前定时器计数器 (CNT) 的值到一个专用的捕获/比较寄存器 (CCRx) 中,并可能触发中断或 DMA 请求。通过读取两次(或多次)捕获事件发生时锁存的 CCRx 值,结合定时器的计数频率 (CK_CNT),就可以计算出两次事件之间的时间间隔。

涉及的定时器资源:

  1. 定时器计数器 (CNT): 核心的时间基准,通常由内部时钟源 (CK_INT) 或外部时钟源 (ETR) 驱动递增(向上计数模式最常见)。
  2. 捕获/比较通道: 每个定时器通常有多个捕获/比较通道(如 TIMx_CH1, TIMx_CH2, ...)。捕获发生时,当前 CNT 值会被复制到对应的 CCRx 寄存器。
  3. 捕获输入: 外部信号连接到特定的定时器通道引脚(如 PA0, PA1, ... 映射到 TIMx_CHx)。
  4. 输入滤波器: 用于滤除输入信号上的高频毛刺,防止误触发。
  5. 边沿检测器: 检测输入信号的上升沿、下降沿或双边沿。
  6. 预分频器 (PSC): 用于降低输入到计数器 (CNT) 的时钟频率 (CK_CNT = CK_PSC / (PSC + 1)),从而扩大定时器的测量范围。
  7. 自动重装载寄存器 (ARR): 定义计数器 CNT 计数到多少后自动归零(向上计数模式),决定了计数器溢出前的最大计数值。
  8. 中断/DMA 控制: 捕获事件可以配置为产生中断或触发 DMA 传输,通知 CPU 有新数据 (CCRx) 需要处理。

工作原理详解:

  1. 配置定时器基础:

    • 选择时钟源 (CK_PSC)。
    • 设置预分频器 (PSC) 值,得到计数器时钟 CK_CNT
    • 设置自动重装载值 (ARR),决定计数器溢出周期。
    • 启动计数器 (CEN=1)。
  2. 配置捕获通道:

    • 输入映射: 通过 CCMRx 寄存器配置该通道为输入捕获模式 (CCxS[1:0] = 0110,选择有效的输入源 TIx)。
    • 边沿选择: 通过 CCER 寄存器设置捕获极性 (CCxPCCxNP)。例如:
      • CCxP=0, CCxNP=0: 上升沿捕获。
      • CCxP=1, CCxNP=0: 下降沿捕获。
      • CCxP=0, CCxNP=1: 双边沿捕获。
    • 输入滤波: 通过 CCMRx 寄存器设置 ICxF 位,选择输入滤波器参数(采样频率和采样次数)。这对于滤除信号抖动非常关键。
    • 分频: 通过 CCMRx 寄存器设置 ICxPSC 位,可以选择每 N 个有效的边沿事件才进行一次捕获(在测量低频信号且关注事件次数时有用)。
    • 中断/DMA 使能:DIER 寄存器中使能捕获完成中断 (CCxIE=1) 或捕获 DMA 请求 (CCxDE=1),以便在捕获发生后及时读取 CCRx 值。
    • 使能捕获:CCER 寄存器中设置 CCxE=1,使能该通道的捕获功能。
  3. 捕获流程:

    • 计数器 CNTCK_CNT 驱动下不断计数。
    • 当配置好的外部信号边沿事件(如上升沿)发生在捕获通道的输入引脚上时...
    • 边沿检测器检测到该事件。
    • 锁存动作: 瞬间将当前计数器 CNT 的值复制到对应的捕获/比较寄存器 CCRx 中。
    • 标志位置位: 状态寄存器 (SR) 中的捕获/比较标志 CCxIF 被置 1
    • 触发中断/DMA (可选): 如果相应中断 (CCxIE) 或 DMA (CCxDE) 被使能,则触发中断服务程序 (ISR) 或 DMA 传输请求。
    • 在 ISR 或 DMA 传输的目标缓冲区中,程序可以读取 CCRx 的值(读取 CCRx 通常会自动清除 CCxIF 标志,具体看参考手册)。
  4. 测量计算:

    • 周期/频率测量:
      • 配置为上升沿捕获
      • 第一次捕获(时间点 T1):读取 CCRx1
      • 第二次捕获(时间点 T2):读取 CCRx2
      • 两次上升沿之间的计数差值:Delta = CCRx2 - CCRx1 (假设 CCRx2 > CCRx1CNT 未溢出)。
      • 实际时间间隔:Period = Delta * (1 / CK_CNT) = Delta * ( (PSC + 1) / CK_PSC )
      • 信号频率:Frequency = 1 / Period
      • 注意计数器溢出: 如果两次捕获之间 CNT 发生了溢出(Delta 看起来会是负值),实际差值应为 Delta = (ARR + 1) - CCRx1 + CCRx2。通常需要软件记录溢出次数 (Update 事件中断) 来计算 Delta = (OverflowCount * (ARR + 1)) + CCRx2 - CCRx1
    • 脉冲宽度测量 (占空比):
      • 配置为双边沿捕获
      • 上升沿捕获:读取 CCRx_rising
      • 下降沿捕获:读取 CCRx_falling
      • 高电平时间:HighTime = (CCRx_falling - CCRx_rising) * (1 / CK_CNT) (同样需处理溢出)。
      • 周期:Period = (Next_CCRx_rising - CCRx_rising) * (1 / CK_CNT) (同样需处理溢出)。
      • 占空比:DutyCycle = (HighTime / Period) * 100%.
    • 外部事件间隔: 测量任意两个指定边沿事件之间的时间差,原理与周期测量类似。

关键配置点与注意事项:

  1. 时钟配置: CK_CNT 的频率 (CK_PSCPSC) 直接决定测量的精度和范围。频率越高,精度越高,但计数器溢出更快,测量范围变小;频率越低,范围越大,精度越低。需要根据待测信号的频率范围权衡。
  2. 输入滤波: 对于有噪声或抖动的信号,必须配置适当的输入滤波器 (ICxF),否则会导致多次误触发,测量结果严重错误。滤波参数要根据信号特性和噪声情况选择。
  3. 溢出处理: 这是编写捕获程序最容易出错的地方。必须考虑计数器在两次捕获事件之间发生溢出的情况。通常需要:
    • 使能定时器的更新中断 UIE (DIER 寄存器)。
    • 在更新中断 (Update ISR) 中维护一个溢出计数器变量 (OverflowCount)。
    • 在捕获中断 (CCx ISR) 中计算差值时,结合 OverflowCountCCRx 的值来计算真实的计数跨度 Delta
  4. 双边沿捕获模式: 使用双边沿捕获测量脉冲宽度非常方便。STM32 的定时器通道可以在一次配置下自动捕获连续的上升沿和下降沿,交替更新 CCRx 的值(每次捕获事件都会翻转预设的捕获极性和标志位)。
  5. 捕获分频 (ICxPSC): 用于捕获事件本身的分频。例如 ICxPSC=3 表示每 4 个边沿才触发一次捕获锁存和中断。这在只需要统计事件次数或测量低频信号时可以减少中断负担。
  6. 读取顺序: 在 ISR 中读取 CCRx 的值通常是安全的。如果需要在主循环中轮询 CCxIF 标志,读取 CCRx 后应确保及时清除标志(通常读取 CCRx 会清除标志,但需确认参考手册)。
  7. 引脚复用与配置:
    • 确保外部信号连接到正确的定时器通道引脚。
    • 配置 GPIO 为复用功能模式 (AF),并选择正确的复用功能映射 (AFx)。
    • 根据信号特性配置 GPIO 速度、上/下拉电阻(通常设置为浮空输入或带上拉/下拉即可)。
  8. 库的使用:
    • 标准外设库 (SPL): 需要用 TIM_ICInitTypeDef 结构体配置通道,然后调用 TIM_ICInit()。需要手动编写中断服务函数。
    • HAL/LL 库: 提供了更高级的封装函数 (如 HAL_TIM_IC_Start_IT())。使用回调函数机制 (HAL_TIM_IC_CaptureCallback())。

总结:

STM32 的定时器捕获功能通过精确锁存外部信号边沿到来时刻的计数器值,为高精度时间测量提供了硬件支持。其核心是配置捕获通道(输入映射、边沿、滤波)、理解计数器溢出机制和处理捕获中断(或 DMA)。合理配置时钟、滤波器和处理溢出是获得准确测量结果的关键。该功能广泛应用于编码器接口、PWM输入分析、超声波测距、频率计、脉冲宽度测量等各种需要时间检测的场景。

STM32定时器(三)输入捕获

STM32的定时器是支持信号输入捕获的,何为输入捕获?主要做什么应用?

2023-07-21 14:58:06

一文详解STM32输入捕获

输入捕获是处理器捕获外部输入信号的功能,基于定时器抓取输入信号指定触发方式之间的长度。具体有下面三种触发情况。

2023-03-23 10:10:25

详解STM32定时捕获功能

STM32的定时器是支持信号输入捕获的,何为输入捕获?主要做什么应用?

2023-01-12 17:24:08

通用定时器的输入捕获实验

STM32的输入捕获,简单的说就是通过检测TIMx_CHx(定时器X的通道X)上的边沿信号,在边沿信号发生跳变(上升沿/下降沿)的时候,将

资料下载 佚名 2022-01-12 19:53:55

STM32定时器输入捕获实验

概述输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的定时器,除了 TIM6 和 TIM7,其他

资料下载 佚名 2021-12-14 18:58:12

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

我们知道,利用单片机定时器捕获功能测量脉冲信号宽度及占空比是种很常见的做法。这里以STM32的

资料下载 佚名 2021-11-26 16:36:12

MSP430 定时捕获模式

关于定时器本章就不详解了,大家可以参考之前的文章或者直接查阅用户手册进行学习关于定时器何时选用溢出中断还是比较

资料下载 duke刘 2021-11-19 17:51:08

基于STM32f103的输入捕获测频率和占空比

基于STM32f103的输入捕获测频率和占空比

资料下载 shyshyshy 2021-08-02 10:10:24

详解定时器的输入捕获功能

输入捕获就是用定时器检测引脚上的电平时间,可以检测高电平时间和低电平时间,然后可以算引脚上信号的频率和占空比。

2022-05-06 09:38:54

STM32如何使用定时捕获功能捕获红外时序?

STM32如何使用定时器捕获功能捕获红外时序?

2022-02-09 07:00:18

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

,或者说测信号频率。关于输入捕获的知识,网上的内容太多了,所以我就不贴出数据手册上的电路图解,还有各种寄存器的解释了。大家可自行了解,本文将从应用方面详解ST

2022-01-06 07:37:08

stm32F1输入捕获详解

stm32F1输入捕获详解1、问题:什么叫输入捕获回答:举个例子,比如一

2021-12-06 06:12:22

STM32定时详解

定时器详解时钟源计数器定时器周期计算定时器初始化结构体

2021-08-18 06:17:04

STM32定时器输入捕获使用步骤

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、使用步骤1.STM32 CUBEMX 配置(1) 新建STM32 CUBEMX工程(2)时钟配置(3)

2021-08-10 07:28:05

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

我们知道,利用单片机定时器捕获功能测量脉冲信号宽度及占空比是种很常见的做法。这里以STM32的

2021-01-02 18:17:00

7天热门专题 换一换
相关标签