STM32定时器输入捕获模式下,如何用DMA连续采样多路PWM脉宽而不丢数据?

· 2 浏览

回答(4)

如果脉宽变化极快,可考虑用定时器级联:主定时器捕获,从定时器做时间戳,DMA只搬时间戳,主循环差分计算,能显著降低中断频率。
硬件小飞 · 2026-08-27
注意DMA传输宽度必须与CCR寄存器对齐(16位),否则数据错位。若用32位DMA,需先左移或打包,否则高16位脏数据会污染脉宽计算。
码农阿杰 · 2026-08-27
建议用定时器的DMA突发请求(burst)一次搬运多路CCR,减少DMA启动开销,配合FIFO深度合理设置,实测可稳定采样4路1kHz PWM。
嵌入式老周 · 2026-08-27
核心思路是让DMA在定时器捕获事件触发下,将CCR寄存器值连续搬运到内存环形缓冲区,并配合定时器的更新中断或DMA半满/全满中断做后台处理。具体实操:1) 配置定时器为输入捕获模式,开启捕获/比较中断(或直接使能DMA请求),将CCR1/CCR2等映射到DMA通道,设置循环模式,数据宽度为半字(16位);2) 为每路PWM分配独立缓冲区,或使用二维数组,DMA地址递增,确保连续采样;3) 在DMA传输完成或半传输中断中,解析相邻捕获值之差得到脉宽,注意处理计数器溢出(更新事件)导致的差值异常,可记录溢出次数修正;4) 若多路信号频率较高,建议使用定时器从模式(如复位模式)或双通道交叉采样,避免DMA带宽瓶颈。关键点:DMA循环模式+双缓冲(乒乓)机制,防止覆盖未处理数据,同时关闭不必要的中断减少延迟。
mcuku 阿沐 · 2026-08-27