如何用DMA+PWM精确控制多路舵机时序,避免中断抖动?

· 1 浏览

回答(4)

若MCU无DMA,可用定时器输出比较+中断,但需将中断优先级设为最高,并精简ISR,仅更新CCR,实测可接受。
代码小飞侠 · 2026-08-27
注意舵机电源隔离和电容滤波,PWM精度再高,电压跌落也会导致抖动,硬件上要加1000uF电解电容。
硬件控阿强 · 2026-08-27
补充:用双缓冲DMA(内存乒乓)可在线修改舵机角度,避免更新时撕裂,适合动态控制场景。
嵌入式老周 · 2026-08-27
核心方案是用DMA将PWM比较寄存器(如TIMx->CCR)的更新序列预加载到内存,配合定时器更新事件触发DMA传输,实现多路舵机脉冲的硬件级时序控制。具体做法:1)配置定时器为PWM模式,周期设为20ms(50Hz),每路舵机对应一个通道;2)在内存中构建一个二维数组,每行存储各通道的CCR值(对应脉宽),每列对应一个时间片(如1ms),通过DMA循环模式在更新事件时批量更新所有通道;3)用定时器的重复计数或另一个定时器控制帧率。这样CPU只在初始化时写入数组,运行中零中断,彻底消除抖动。实操建议:优先选用带DMA的定时器(如STM32的TIM1/TIM8),注意DMA传输宽度与CCR寄存器匹配(16位),并启用DMA循环模式;若舵机数量多,可扩展至多定时器级联。
mcuku 阿沐 · 2026-08-27