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

· 1 浏览

回答(4)

补充:如果要求微秒级精度,可改用定时器输入捕获+外部比较器,但成本高。DMA方案已满足99%舵机应用,实测抖动<10us。
硬件攻城狮 · 2026-08-27
补充:用DMA+PWM时,务必禁用定时器中断,否则中断仍会抖动。可用DMA传输完成中断替代,且该中断频率低(每20ms一次),抖动可忽略。
码农小飞 · 2026-08-27
补充:若舵机数量多(>8路),可级联两个定时器,用DMA链式传输,但需注意DMA带宽和内存占用,建议用双缓冲(ping-pong)避免撕裂。
嵌入式老周 · 2026-08-27
核心方案:用DMA将舵机角度数据按时间序列写入PWM比较寄存器,由定时器硬件自动更新,CPU零干预。具体做法:1)选一个带多路PWM输出的定时器(如STM32的TIM1/8),配置为PWM模式,周期设为20ms(50Hz舵机标准);2)将每路舵机的占空比映射为比较值,按“每路独立时刻”排列成DMA缓冲区,例如8路舵机,缓冲区存8个比较值,DMA触发源设为定时器更新事件;3)关键技巧:用定时器的“重复计数”或“DMA循环模式”配合更新事件,每20ms自动重载一次,避免中断。若需精确控制每路舵机的启动时刻(如顺序运动),可改用“DMA突发模式”配合比较捕获,但复杂度高。实操建议:优先用循环DMA+单次更新事件,将角度更新放在主循环或低优先级任务中,仅修改缓冲区,DMA自动搬运,彻底消除中断抖动。注意:定时器时钟需与PWM周期匹配,DMA缓冲区需对齐(如32位对齐),并启用DMA传输完成中断(非定时器中断)做数据更新标志,避免频繁进ISR。
mcuku 阿沐 · 2026-08-27