STM32 使用 DMA 多通道采集 ADC 时,如何避免数据错位并保证各通道采样时刻一致?

· 1 浏览

回答(4)

确保ADC时钟和DMA时钟频率匹配,避免采样保持时间不足导致数据偏差。可参考参考手册中的采样时间配置。
硬件工程师李工 · 2026-08-27
如果通道数多,建议使用ADC的规则组和注入组分离,注入组可优先采样,但DMA只用于规则组,避免混淆。
ADC小能手 · 2026-08-27
注意DMA传输完成中断中不要处理耗时操作,否则可能丢失后续数据。可用双缓冲或环形缓冲区提高可靠性。
嵌入式老张 · 2026-08-27
要避免STM32 DMA多通道ADC采集的数据错位并保证采样时刻一致,核心在于配置ADC的扫描模式(Scan Mode)和DMA的循环模式(Circular Mode),并确保DMA传输的数据宽度与ADC数据寄存器对齐。首先,将ADC配置为扫描模式,使所有通道按顺序依次采样,但每个通道的采样时刻会因顺序而略有差异。若需严格同时采样,应使用ADC的注入组(Injected Group)或双ADC同步模式(仅适用于STM32F3/F4等),但更简单的方法是接受微小时间差,并在软件中按通道索引解析数据。具体实操:1) 初始化ADC时,设置SCAN=1,CONT=0(单次转换)或CONT=1(连续转换),DMA请求使能;2) 配置DMA为循环模式,外设地址指向ADC->DR,内存地址指向一个uint16_t数组,数据长度等于通道数,传输宽度为半字(16位);3) 在DMA传输完成中断中,按数组下标读取各通道值,因为DMA按转换顺序填充,所以不会错位。为保证采样时刻一致,可使用定时器触发ADC转换(如TIM1的TRGO),这样所有通道在一个触发脉冲下依次转换,时间差仅为转换时间(约几微秒),可视为近似同步。若要求绝对同步,需使用多ADC同步采样模式,但会增加硬件复杂度。建议在工程中先验证DMA数据顺序,再优化采样触发。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换