用DMA+PWM控制多路舵机,核心是让DMA在内存中按预编排的占空比序列自动更新PWM比较寄存器,避免CPU中断干预。建议使用定时器的更新事件触发DMA,将每路舵机的CCR值按相位顺序存入一个数组,DMA循环模式自动写入。关键在于:1) 定时器频率设为50Hz(20ms周期),但更新事件在周期末尾触发,DMA需在更新前完成写入,因此可提前一个周期预装载数据;2) 使用双缓冲(乒乓缓冲)避免数据竞争,一个缓冲用于当前周期,另一个用于下一周期,由DMA传输完成中断切换;3) 相位控制通过调整数组中的CCR值顺序实现,例如将第i路舵机的脉冲起始时刻错开,只需在数组中按时间片排列各路的CCR值,并确保每路脉冲宽度独立。实操建议:用STM32的TIM1/8高级定时器,配置DMA突发模式,每次传输4字节(CCR寄存器),并开启DMA半传输/完成中断来更新缓冲。这样CPU仅在周期切换时处理一次,抖动可控制在纳秒级。
mcuku 阿沐 · 2026-08-27