[STM32F1] 同时获取输入捕获信号的上升和下降沿

[复制链接]
50|16
zhouyou99 发表于 2026-9-16 10:41 | 显示全部楼层 |阅读模式
我将 TIMER2 配置为输入捕获模式,在上升沿或者下降沿触发中断。
如何获取上升沿、下降沿的触发时刻。
这里所说的触发时刻使用定时器实现,还是用ticks?
我想用`if`条件判断语句以及 HAL 库能否实现。

公羊子丹 发表于 2026-9-16 12:17 | 显示全部楼层
F1 的 TIM 输入捕获一次只能挂一种边沿,想同时抓上下沿最常见的做法是回调里翻转极性:进 CaptureCallback 后读 CCER 的 CCxP 位取反再写回去,下一次自动换边沿。我之前就这么干的,测脉宽挺稳。可以在 HAL_TIM_IC_CaptureCallback 里切换,顺带把两次 CNT 差值算出来。
周半梅 发表于 2026-9-16 12:18 | 显示全部楼层
其实不用死磕单通道翻转,直接开两个 IC 通道更省心:CH1 设上升沿、CH2 设下降沿,都映射到同一个 TIx 输入,两边各进一次回调,时间戳分别存数组。好处是不会因为翻转时机出错。就是 DMA 没法同时搬两个,得靠中断取。
帛灿灿 发表于 2026-9-16 12:19 | 显示全部楼层
你说的'触发时刻用定时器还是 ticks'——捕获到的本质就是 TIMx->CNT 的计数值,不是系统滴答。换算成时间得拿 CNT 除以 (TIM_CLK/(PSC+1))。比如 72M 主频、PSC=71,那计数 1 就是 1us。建议先打印两次捕获的 CNT 看看差值对不对得上预期。
童雨竹 发表于 2026-9-16 12:20 | 显示全部楼层
我赌你卡在 HAL 的 IC 中断里又去读状态导致重入。HAL_TIM_IC_CaptureCallback 是在中断上下文跑的,里面别调阻塞函数。要拿上/下沿各自的时刻,就在回调里判断当前极性,把 htim->Channel 和 CCR 配对存好,主循环再去算脉宽。
万图 发表于 2026-9-16 12:20 | 显示全部楼层
想问下你 TIM2 的时钟源是内部还是外部?如果是测外部信号频率,PSC 分频得留够余量,不然高频会溢出。另外 F1 的 TIM2 是 32 位定时器,计满要 59 个小时,基本不用操心溢出,这点比 TIM1 友好。
Wordsworth 发表于 2026-9-16 12:21 | 显示全部楼层
补充个小技巧:HAL 库里 __HAL_TIM_GET_COMPARE 能直接读 CCR,但要在捕获中断触发后才有效。如果你发现上下沿读到的都是同一个值,八成是翻转极性那步没写对 CCER,建议单步跟一下 CCER 寄存器位变化。
Bblythe 发表于 2026-9-16 12:22 | 显示全部楼层
我之前做红外解码也是这需求,最后选了输入捕获+翻转极性的组合,再配合一个溢出计数器统计 TIM 溢出次数,这样长脉宽也能算。你这个如果只是普通方波测占空比,翻转法足够,没必要上双通道那么复杂。
Pulitzer 发表于 2026-9-16 12:23 | 显示全部楼层
有一点要提醒:HAL_TIM_IC_Start_IT 只开了捕获中断,如果你想上/下沿都触发,得保证两个边沿的捕获中断都使能了。有些新手只 Start 了一个通道,另一个边沿***不进回调,现象就是'只能抓到一半'。
Uriah 发表于 2026-9-16 12:24 | 显示全部楼层
从参考手册看,TIM 的 TI1FP1/TI2FP2 可以把一个输入同时分发给两个捕获单元,这就是双沿捕获的硬件基础。CubeMX 里把 CH1 和 CH2 都选 Input Capture 并指到同一 TIx,代码层几乎不用翻极性,稳定很多。
Clyde011 发表于 2026-9-16 12:25 | 显示全部楼层
测试建议:先别接真实信号,用 TIM 的另一个通道或者 PWM 输出一个已知占空比方波喂给自己,跑一遍捕获流程验证上下沿时间戳对不对。我当初就是先用内部 PWM 自测,确认算法没问题再接外部传感器,省了好多排查时间。
根特皇宫w 发表于 2026-9-17 21:35 | 显示全部楼层
用输入捕获模式就行,把通道配置成双边沿触发。在中断服务函数里读一下CCRx寄存器的值,那就是触发时刻的定时器计数值。至于上升沿还是下降沿,可以读一下SR寄存器里的CC1P位或者用个全局变量翻转判断
您需要登录后才可以回帖 登录 | 注册

本版积分规则

191

主题

191

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0