STM32 使用DMA+PWM输出多路精确脉冲序列时,如何避免缓冲区更新导致的波形毛刺?

· 1 浏览

回答(4)

实际调试时,用逻辑分析仪抓PWM引脚和DMA请求信号,对比毛刺出现时刻与中断服务函数执行时间,能快速定位是更新时机还是代码耗时问题。
脉冲控 · 2026-08-27
建议开启DMA的FIFO模式并设置阈值(如半满),配合突发传输,能减少总线竞争导致的时序抖动,尤其当系统还有其他高优先级中断时。
芯片调试员 · 2026-08-27
补充一点:如果脉冲序列是周期性的,可以用定时器ARR自动重载+DMA循环模式,CPU只需在更新事件时修改占空比寄存器,不必重写整个缓冲区,这样毛刺更小。
嵌入式老周 · 2026-08-27
核心思路是采用双缓冲(Ping-Pong)机制配合DMA的传输完成中断,确保在DMA正在搬运当前缓冲区时,CPU只更新备用缓冲区,绝不直接修改正在传输的数组。具体做法:配置两个大小相同的数组buf[2][N],DMA循环模式指向buf[0],当传输完成中断触发时,切换DMA内存地址到buf[1]并更新buf[0];下次中断再切回。关键点:1) 使用DMA的Half-Transfer和Transfer-Complete两个中断,可提前半周期更新,留足时间余量;2) 更新数据前先关DMA(或利用循环模式的自动重载),写完后重新使能,避免竞态;3) 若脉冲频率极高,建议用定时器更新事件触发DMA,而非CPU中断,减少延迟抖动。实测中,双缓冲可彻底消除毛刺,但需注意DMA配置时设置Memory-to-Peripheral模式、外设地址固定、内存地址递增,且缓冲区大小需为脉冲周期整数倍。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

🎛️ PWM 频率/占空比