ST意法半导体
直播中

郝埃连

8年用户 1439经验值
私信 关注
[问答]

使用STM32捕获PWM时同时捕获2个通道时会出现捕获的频率值不准确,是什么原因导致的?

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

回帖(2)

醉清歌

2025-5-20 18:12:51

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




1. 中断优先级与响应延迟




  • 问题根源

    当两个通道的中断优先级相同(尤其是同一定时器的不同通道),硬件会按固定顺序处理中断(如通道1优先于通道2)。若两个事件同时触发,第二个中断需等待第一个处理完毕,导致时间戳误差。




  • 解决方案  



    • 为两个通道分配不同的中断优先级(通过NVIC配置),确保高优先级通道及时响应。  

    • 优化中断服务程序(ISR),仅记录时间戳,将复杂计算移至主循环或低优先级任务。






2. 定时器资源竞争




  • 问题根源

    同一定时器的两个通道共享计数器寄存器(CNT)。若两个捕获事件几乎同时发生,读取第一个通道的捕获值(CCR1)时,第二个通道的捕获事件可能覆盖计数器值(CCR2),导致两个通道的时间差计算错误。




  • 解决方案  



    • 使用从模式(Slave Mode)定时器同步 机制,确保两个通道的捕获事件间隔足够长。  

    • 使用不同定时器捕获两路信号(如TIM2和TIM3),避免共享计数器。






3. 计数器溢出处理不当




  • 问题根源

    当PWM周期较长时,定时器可能发生多次溢出(计数器从最大值回到0)。若未正确记录溢出次数,计算周期时会引入误差,尤其两路信号同时溢出时误差更明显。




  • 解决方案  



    • 启用定时器溢出中断(Update Interrupt),在ISR中记录溢出次数。  

    • 计算周期时结合溢出次数和捕获值,例如:  
      Period = (OverflowCount * ARR) + CCRx;






4. 信号边沿抖动或噪声干扰




  • 问题根源

    两路信号同时输入可能引入交叉干扰或噪声,导致边沿抖动,触发多次虚假捕获事件。




  • 解决方案  



    • 在硬件上增加RC滤波电路,平滑输入信号。  

    • 启用定时器的输入滤波功能(通过TIMx_CCMRx寄存器的ICxF位),例如设置4个时钟周期的滤波。






5. 代码逻辑缺陷




  • 问题根源

    在ISR中未正确处理多通道捕获的时序,例如未及时清除中断标志或错误更新全局变量。




  • 解决方案  



    • 确保在ISR中优先清除中断标志(如TIMx->SR中的CC1IF/CC2IF)。  

    • 使用原子操作或临界区保护全局变量,避免数据竞争。






6. 定时器时钟配置不足




  • 问题根源

    定时器时钟频率过低,导致计数器分辨率不足,两路高频信号同时捕获时误差被放大。




  • 解决方案  



    • 提高定时器时钟频率(如使用72MHz主频,不预分频)。  

    • 根据信号频率调整预分频值(TIMx_PSC),确保单个PWM周期内计数器增量足够多(如至少100个计数值)。






验证与调试建议



  1. 使用示波器:观察两路PWM信号的实际波形,确认是否存在相位同步或干扰。

  2. 调试中断响应:在ISR中插入GPIO电平翻转代码,用逻辑分析仪测量实际响应时间差。

  3. 简化代码:注释一路捕获通道,观察另一路是否仍存在误差,逐步定位问题。




通过调整中断优先级、优化计数器溢出处理、隔离定时器资源或增加信号滤波,可有效解决多通道PWM捕获的精度问题。

举报

挽你何用

2025-5-20 18:12:55

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




1. 中断优先级与响应延迟




  • 问题根源

    当两个通道的中断优先级相同(尤其是同一定时器的不同通道),硬件会按固定顺序处理中断(如通道1优先于通道2)。若两个事件同时触发,第二个中断需等待第一个处理完毕,导致时间戳误差。




  • 解决方案  



    • 为两个通道分配不同的中断优先级(通过NVIC配置),确保高优先级通道及时响应。  

    • 优化中断服务程序(ISR),仅记录时间戳,将复杂计算移至主循环或低优先级任务。






2. 定时器资源竞争




  • 问题根源

    同一定时器的两个通道共享计数器寄存器(CNT)。若两个捕获事件几乎同时发生,读取第一个通道的捕获值(CCR1)时,第二个通道的捕获事件可能覆盖计数器值(CCR2),导致两个通道的时间差计算错误。




  • 解决方案  



    • 使用从模式(Slave Mode)定时器同步 机制,确保两个通道的捕获事件间隔足够长。  

    • 使用不同定时器捕获两路信号(如TIM2和TIM3),避免共享计数器。






3. 计数器溢出处理不当




  • 问题根源

    当PWM周期较长时,定时器可能发生多次溢出(计数器从最大值回到0)。若未正确记录溢出次数,计算周期时会引入误差,尤其两路信号同时溢出时误差更明显。




  • 解决方案  



    • 启用定时器溢出中断(Update Interrupt),在ISR中记录溢出次数。  

    • 计算周期时结合溢出次数和捕获值,例如:  
      Period = (OverflowCount * ARR) + CCRx;






4. 信号边沿抖动或噪声干扰




  • 问题根源

    两路信号同时输入可能引入交叉干扰或噪声,导致边沿抖动,触发多次虚假捕获事件。




  • 解决方案  



    • 在硬件上增加RC滤波电路,平滑输入信号。  

    • 启用定时器的输入滤波功能(通过TIMx_CCMRx寄存器的ICxF位),例如设置4个时钟周期的滤波。






5. 代码逻辑缺陷




  • 问题根源

    在ISR中未正确处理多通道捕获的时序,例如未及时清除中断标志或错误更新全局变量。




  • 解决方案  



    • 确保在ISR中优先清除中断标志(如TIMx->SR中的CC1IF/CC2IF)。  

    • 使用原子操作或临界区保护全局变量,避免数据竞争。






6. 定时器时钟配置不足




  • 问题根源

    定时器时钟频率过低,导致计数器分辨率不足,两路高频信号同时捕获时误差被放大。




  • 解决方案  



    • 提高定时器时钟频率(如使用72MHz主频,不预分频)。  

    • 根据信号频率调整预分频值(TIMx_PSC),确保单个PWM周期内计数器增量足够多(如至少100个计数值)。






验证与调试建议



  1. 使用示波器:观察两路PWM信号的实际波形,确认是否存在相位同步或干扰。

  2. 调试中断响应:在ISR中插入GPIO电平翻转代码,用逻辑分析仪测量实际响应时间差。

  3. 简化代码:注释一路捕获通道,观察另一路是否仍存在误差,逐步定位问题。




通过调整中断优先级、优化计数器溢出处理、隔离定时器资源或增加信号滤波,可有效解决多通道PWM捕获的精度问题。

举报

更多回帖

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