STM32
直播中

神之小风

13年用户 956经验值
私信 关注
[问答]

使用STM32捕获PWM时同时捕获2个通道时会出现捕获的频率值不准,为什么?

在使用STM32F103芯片的2个定时器捕获2路PWM波时,当2路信号同时输入时,会出现捕获的频率不准确,但是分开一路一路的输入捕获时,捕获的PWM频率是正确的,这是什么原因导致的呢?

回帖(2)

侯倩

2025-4-22 15:19:04
最好详细描述一下思路和配置以及执行过程。


理论上来说,两个定时器是独立的硬件,配置好后,捕获过程也是独立的存贮到寄存器,后面就是取用的方式了。

仔细梳理一下,调试一下,甚至设定一个固定频率,看看获取值是否正常,再检查处理方式是否要改善。

相信很快就能找到问题点。
举报

甘满盛

2025-4-25 18:26:22

在使用STM32F103同时捕获两路PWM信号时出现频率不准的问题,可能由以下原因导致:




1. 中断处理冲突



  • 问题原因

    当两路信号同时触发捕获中断时,若中断服务程序(ISR)处理时间过长或优先级设置不当,可能导致中断响应延迟或丢失。例如:

    • 高优先级中断抢占低优先级中断,导致后者被延迟处理。

    • ISR内未及时清除中断标志或执行耗时操作(如浮点运算、复杂逻辑)。


  • 解决方案  

    • 优化ISR代码,仅执行必要操作(如记录计数值),将数据处理移至主循环。

    • 设置合理的定时器中断优先级,确保两路捕获中断无抢占关系。

    • 使用DMA传输捕获值(如果支持),减少中断触发频率。





2. 定时器资源竞争



  • 问题原因

    STM32的某些定时器通道共享计数器。若两路信号使用同一定时器的不同通道(如TIM2_CH1和TIM2_CH2),同时捕获可能覆盖计数器值,导致时间差计算错误。

  • 解决方案  

    • 使用独立的定时器分别捕获两路信号(如TIM2和TIM3)。

    • 若必须使用同一定时器,确保通道间无冲突,并检查计数器溢出处理逻辑。





3. 计数器溢出未处理



  • 问题原因

    高频信号可能导致定时器计数器溢出。若未正确处理溢出事件,计算出的周期值会错误。例如:

    • 两次捕获之间发生溢出,但未记录溢出次数。

    • 使用16位定时器捕获长周期信号时溢出频繁。


  • 解决方案  

    • 启用定时器溢出中断,记录溢出次数。

    • 在计算时间差时,将溢出次数纳入公式:

      实际周期 = (溢出次数 × 计数器最大值) + 本次捕获值 - 上次捕获值





4. 信号边沿抖动或干扰



  • 问题原因

    两路信号同时输入时,若存在硬件干扰(如共地噪声、信号串扰),可能导致边沿抖动,触发误捕获。

  • 解决方案  

    • 检查硬件信号质量(示波器观察边沿是否干净)。

    • 添加RC滤波电路或施密特触发器抑制噪声。

    • 在软件中增加捕获值滤波算法(如多次采样取平均)。





5. 时钟配置错误



  • 问题原因

    定时器时钟源(如APB1/APB2)分频设置错误,导致实际计数频率与预期不符。例如:

    • 定时器时钟频率过低,无法分辨高频信号。

    • 不同定时器的时钟源不一致,导致时间基准不同。


  • 解决方案  

    • 确认系统时钟配置(如使用SystemCoreClock)。

    • 检查定时器时钟分频系数(如TIMx_PSC寄存器)。





6. 软件计算逻辑错误



  • 问题原因

    多通道捕获时,若未正确关联通道与变量,或变量类型溢出(如用16位变量存储32位计数值),会导致计算错误。

  • 解决方案  

    • 使用32位变量存储捕获值和周期计算结果。

    • 确保通道数据与变量一一对应,避免数据覆盖。





验证步骤



  1. 示波器验证信号质量:确保两路信号无干扰。

  2. 简化代码测试:仅保留捕获逻辑,移除无关代码。

  3. 单步调试:观察中断触发顺序和变量更新是否正常。

  4. 模拟信号输入:使用函数发生器生成已知频率信号,对比捕获结果。


通过逐一排查以上因素,通常可以定位问题根源。建议优先检查中断处理和计数器溢出逻辑。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分