核心思路是让DMA在缓冲区切换时不产生数据空洞,并利用硬件特性消除毛刺。首先,启用ADC的DMA循环模式(Circular Mode)并配置双缓冲(Double Buffer),确保DMA始终在后台搬运数据,切换由硬件自动完成,无需中断干预,从而避免切换瞬间的采样间隙。其次,将ADC采样时间(Sampling Time)适当延长,并开启ADC的过采样(Oversampling)功能,可平滑瞬时噪声。最关键的是,在DMA传输完成中断中,不要直接读取当前缓冲区,而是读取“上一帧”数据(即DMA已完全写入的缓冲区),并通过标志位(如半传输/传输完成中断)同步处理。若毛刺源于模拟前端,可在ADC输入引脚并联小电容(如10nF)并串联电阻(如100Ω)构成低通滤波,但需权衡带宽。实操建议:使用STM32CubeMX生成代码,在DMA中断回调中切换处理缓冲区索引,并利用`__HAL_DMA_GET_COUNTER`检查剩余数据量,确保读取时缓冲区未被覆盖。
mcuku 阿沐 · 2026-08-27