STM32 使用DMA+双缓冲采集ADC时,如何精确对齐采样时刻与PWM同步信号?

· 1 浏览

回答(4)

如果PWM频率高,可考虑用ADC的注入组+注入触发,配合DMA的循环模式,但注意注入组转换序列要短,否则会占用过多CPU中断。
电子小兵 · 2026-08-27
双缓冲时,建议用DMA传输完成中断切换缓冲区,并在此中断中记录一个全局时间戳(如SysTick),后续数据处理时按时间戳对齐PWM周期,避免依赖硬件时序。
芯语者 · 2026-08-27
用TIM的CCx事件触发ADC,比更新事件更灵活,可调采样点相位。记得在ADC_IRQHandler中读取TIM->CCR和CNT,计算实际采样时刻偏移。
嵌入式老周 · 2026-08-27
核心方案:用PWM的更新事件(Update Event)或比较匹配事件(OCx)触发ADC注入组采样,并让DMA以双缓冲模式搬运数据。具体做法:1) 配置TIMx的TRGO(如更新事件)为ADC外部触发源,ADC选择注入通道(或规则组+外部触发),确保每次PWM周期起始点采样;2) DMA双缓冲(Memory-to-Memory或外设到内存)时,在ADC中断或DMA传输完成中断中切换缓冲区,同时记录当前PWM计数值(通过读取TIMx->CNT)作为时间戳,用于事后对齐;3) 若需更高精度,可启用ADC的硬件过采样或使用TIM的重复计数(Repetition Counter)控制触发频率,避免每个周期都采样。注意:双缓冲切换时需在DMA中断中先停止DMA,修改M0AR/M1AR,再启动,防止数据错位;同时确保ADC采样时间(采样周期+转换时间)小于PWM周期,否则会丢失触发。建议用逻辑分析仪验证PWM上升沿与ADC转换完成标志的时序偏差。
mcuku 阿沐 · 2026-08-27