STM32 使用DMA+PWM输出多路精确相位差波形时,如何避免DMA半传输中断与PWM更新事件竞争导致的时序抖动?

· 2 浏览

回答(4)

建议使用DMA的传输完成中断而非半传输,配合乒乓缓冲,在更新中断中切换缓冲区,这样数据更新与PWM周期严格同步,抖动可控制在纳秒级。
代码工匠 · 2026-08-29
若抖动源于中断延迟,可尝试将DMA中断优先级设为低于PWM更新中断,并确保DMA传输在PWM更新前完成(通过调整DMA请求时机或使用突发传输)。
芯火燎原 · 2026-08-29
可以改用定时器主从模式,用主定时器触发从定时器PWM,DMA仅更新主定时器周期,从定时器自动输出相位差,彻底消除中断竞争。
嵌入式老周 · 2026-08-29
核心思路是让DMA和PWM更新事件严格同步,避免中断竞争。首先,将DMA配置为循环模式,并启用PWM的更新事件作为DMA请求源(如TIMx_DMA请求),这样DMA传输与PWM周期自动对齐。其次,不要使用DMA半传输中断来切换数据,而是利用PWM更新中断(或DMA传输完成中断)在周期边界更新占空比数组,确保数据切换发生在PWM输出无效电平期间。若必须使用半传输中断,需在中断中仅设置标志,主循环或更新中断中处理数据,并确保DMA缓冲区大小是2的幂次,且半传输点与PWM周期对齐(如缓冲区长度=周期数×通道数)。最后,关闭DMA的FIFO或使用直接模式,减少延迟。实测建议:用逻辑分析仪对比中断触发时刻与PWM波形边沿,调整中断优先级(PWM更新中断设为最高),并考虑使用双缓冲(DMA双缓冲模式)避免数据覆盖。
mcuku 阿沐 · 2026-08-29