笔记 / 嵌入式

引言

如果说定时器的基本定时功能是它的”心跳”,那么输出比较和输入捕获就是它的”双手”——一手创造信号,一手测量信号。理解这两个功能,是掌握 PWM、频率计、超声波测距等应用的前提。

一、核心概念:CNT 与 CCR

理解输出比较和输入捕获,关键在于两个寄存器的关系:

寄存器含义在 IC 中在 OC 中
CNT计数器时间标尺时间标尺
CCR捕获/比较寄存器保存 CNT 的快照值 CNT 比较,匹配时触发动作

💡 一句话理解:

  • 输入捕获(IC):外部信号边沿到来时,把 CNT 的当前值”拍照”存入 CCR
  • 输出比较(OC):CNT 数到与 CCR 相等时,触发硬件动作

二、输入捕获(Input Capture)

2.1 工作原理

                    ┌─────── 捕获上升沿 ───────┐
                    │                          │
     外部信号:  ────┘                          └───────
                    │                          │
     CNT值:    ... 100 ... 200 ... 300 ... 400 ... 500 ...
                    ↑                          ↑
                  CCR=100                    CCR=500

     脉冲宽度 = 500 - 100 = 400 个计数周期

工作流程:

  1. 配置通道为输入捕获模式,选择触发边沿(上升沿 / 下降沿 / 双边沿)
  2. 当指定边沿到来时,硬件自动将当前 CNT 的值复制到 CCR
  3. 连续捕获两次,两次 CCR 的差值就是两个边沿之间的时间
  4. 配合计数频率换算出实际时间:时间 = 差值 × 计数周期

2.2 测量频率

频率测量常用两次上升沿捕获法

f_signal = f_cnt / (CCR2 - CCR1)

其中 f_cnt 是 CNT 的计数频率 = TIM_CLK / (PSC + 1)

2.3 典型应用

应用说明
频率计测量外部信号的频率
占空比测量同时测量 PWM 信号的高电平与周期
红外遥控解码测量编码脉冲的宽度
超声波测距测量 Echo 引脚高电平持续时间
编码器测速通过捕获正交编码器脉冲测量转速

2.4 HAL 配置示例

TIM_IC_InitTypeDef sConfigIC = {0};

sConfigIC.ICPolarity  = TIM_ICPOLARITY_RISING;   // 上升沿捕获
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; // 直接映射到 TIx
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;           // 不分频
sConfigIC.ICFilter    = 0x0;                      // 数字滤波
HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1);

// 启动输入捕获中断
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);

三、输出比较(Output Compare)

3.1 工作原理

CNT:  0 ──→ 30 ──→ 60 ──→ 90 ──→ ARR ──→ 0 ──→ ...

           CNT == CCR (假设CCR=30)

         ┌────┴────┐
         │ 触发动作 │ → 翻转/置高/置低/中断
         └─────────┘

当 CNT 的值等于 CCR 时,发生”比较匹配”事件,触发预先配置的动作。

3.2 八种输出比较模式

模式匹配时行为典型用途
冻结 (Frozen)输出保持不变暂停 PWM 输出
匹配时置有效电平输出置高单次脉冲
匹配时置无效电平输出置低单次脉冲
匹配时翻转 (Toggle)电平取反生成 50% 占空比方波
强制无效电平强制输出低强制停机
强制有效电平强制输出高强制输出
PWM 模式 1CNT < CCR 高, CNT ≥ CCR 低最常用的 PWM 输出
PWM 模式 2CNT < CCR 低, CNT ≥ CCR 高PWM 模式 1 的反相版本

3.3 典型应用

应用说明
LED 调光改变 PWM 占空比控制亮度
电机调速PWM 控制直流电机转速
舵机控制用特定脉宽控制角度
生成参考方波Toggle 模式生成 50% 占空比方波
外设同步信号匹配时触发 ADC 采样 / DMA 传输

四、输入捕获 vs 输出比较 —— 对比总结

维度输入捕获 (IC)输出比较 (OC)
数据流向外部 → MCU(测量外部信号)MCU → 外部(产生信号)
CNT 与 CCR 的关系边沿到来时,CNT → CCRCNT == CCR 时触发动作
引脚方向输入输出(复用推挽)
核心用途测频率、周期、脉宽、占空比输出 PWM、方波、脉冲
中断事件捕获中断比较匹配中断
共用资源同一通道同一时刻只能配置为 IC 或 OC

五、常见问题与排查

CNT 溢出处理(输入捕获)

当被测信号周期很长时,CNT 会在两次捕获之间溢出。必须统计溢出次数:

实际时间 = 溢出次数 × (ARR + 1) + 最后一次 CCR 值

需要在更新中断中累加溢出计数。

PWM 输出无波形?

常见原因排查:

  1. GPIO 未配置为复用推挽输出
  2. 未调用 HAL_TIM_PWM_Start() 启动输出
  3. 高级定时器(TIM1/TIM8)未使能主输出:需设置 MOE 位
  4. 时钟未使能

总结

输出比较和输入捕获是定时器最强大的两个功能。一个向外创造,一个向内感知。理解了 CNT 与 CCR 之间”比较”与”捕获”的两种关系,你就掌握了定时器 80% 的应用场景。

下一篇我们将深入 PWM——输出比较最重要的应用形态。

测量即是理解,输出即是创造。 —— Iustitiae