You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32平台PWM首脉冲宽度周期性异常问题求助

针对PWM脉冲宽度周期性异常的排查建议

1. 修复中断绑定逻辑

你当前在loop()里每次重新绑定中断的做法有风险,Marlin后台的实时任务(比如步进驱动、温度监控)可能在闲置后抢占中断资源,导致首次脉冲的中断响应延迟。把中断绑定移到setup()阶段一次性完成,循环里只负责启停PWM、重置和读取计数,避免重复绑定带来的资源冲突。

2. 处理计数变量的原子性问题

中断中修改的计数变量如果没有做原子保护,Marlin的多中断/任务场景下会出现数值错乱:

  • 给计数变量加上volatile修饰,防止编译器优化导致数值不更新;
  • 读取计数时必须禁用中断,避免读取过程中被中断打断,示例代码如下:
    volatile uint32_t pulse_count = 0;
    
    void PWM_Rising_Handler() {
      pulse_count++;
    }
    
    void setup() {
      attachInterrupt(digitalPinToInterrupt(PWM_PIN), PWM_Rising_Handler, RISING);
      // 其他初始化操作
    }
    
    void loop() {
      // 启动PWM前重置计数
      noInterrupts();
      pulse_count = 0;
      interrupts();
      
      // 启动PWM输出
      startPWM();
      
      // 等待计时完成(根据你的逻辑判断)
      while(pulse_count < TARGET_COUNT);
      
      // 关闭PWM
      stopPWM();
      
      // 安全读取计数
      noInterrupts();
      uint32_t final_count = pulse_count;
      interrupts();
      
      // 后续处理逻辑
    }
    

3. 检查低功耗模式下的定时器状态

BTT SKR MINI E3 V3.0的STM32 Cortex M0+在闲置时可能进入低功耗模式,定时器时钟分频或配置可能被修改:

  • 查看Marlin配置里的ENABLE_SLEEP_MODE等低功耗相关选项,若开启,需确保PWM所用定时器在唤醒后重新初始化;
  • 在启动PWM前,强制重新配置定时器的分频、周期、占空比参数,不要依赖休眠前的寄存器状态。

4. 重置外设寄存器避免残留状态

闲置后系统可能触发过看门狗复位或软复位,部分定时器/引脚寄存器可能保留异常状态:

  • 每次启动PWM前,先调用定时器的重置函数(比如HAL_TIM_Base_MspDeInit+HAL_TIM_Base_MspInit),确保寄存器恢复默认配置后再重新初始化。

5. 固定引脚初始电平

闲置后引脚可能处于不确定电平状态,导致第一个脉冲的边沿检测误判:

  • 启动PWM前,先将引脚设置为低电平(或与PWM初始电平一致的状态),再开启PWM输出,避免初始电平波动被计数为有效脉冲。

内容的提问来源于stack exchange,提问作者Bjm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:40:14