
输出比较与输入捕获
引言
如果说定时器的基本定时功能是它的"心跳",那么输出比较和输入捕获就是它的"双手"——一手创造信号,一手测量信号。理解这两个功能,是掌握 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 个计数周期
工作流程:
- 配置通道为输入捕获模式,选择触发边沿(上升沿 / 下降沿 / 双边沿)
- 当指定边沿到来时,硬件自动将当前 CNT 的值复制到 CCR 中
- 连续捕获两次,两次 CCR 的差值就是两个边沿之间的时间
- 配合计数频率换算出实际时间:
时间 = 差值 × 计数周期
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 输出无波形?
常见原因排查:
- GPIO 未配置为复用推挽输出
- 未调用
HAL_TIM_PWM_Start()启动输出 - 高级定时器(TIM1/TIM8)未使能主输出:需设置 MOE 位
- 时钟未使能
总结
输出比较和输入捕获是定时器最强大的两个功能。一个向外创造,一个向内感知。理解了 CNT 与 CCR 之间"比较"与"捕获"的两种关系,你就掌握了定时器 80% 的应用场景。
下一篇我们将深入 PWM——输出比较最重要的应用形态。
测量即是理解,输出即是创造。 —— Iustitiae