单片机ADC采样不准是嵌入式开发中的常见问题,原因可以分为硬件和软件两大类。硬件原因主要有:参考电压不准或纹波大、输入信号源阻抗太大导致采样建立不足、电源噪声和地弹干扰、模拟地和数字地混接、输入信号超出量程或共模范围。软件原因主要有:采样时间设置太短、没有做自校准、多通道切换时等待时间不够、DMA配置错误、软件滤波算法不合理。排查时建议按"先硬件后软件、先简单后复杂"的顺序逐步定位,先用万用表和示波器确认硬件输入正常,再逐项排查软件配置。
ADC采样不准先区分是硬件问题还是软件问题,用示波器测输入引脚波形是关键一步
参考电压是最常见的硬件原因,VREF+引脚电压直接决定采样结果的准确度
采样时间不足是最常见的软件原因,源阻抗越大需要的采样时间越长
校准功能很重要,STM32上电后调用HAL_ADCEx_Calibration_Start可以修正失调和增益误差
多通道采样时,通道切换后要等采样电容重新建立,否则前一个通道的残留电压会影响当前通道
一、面试题
面试官问:"你用STM32做ADC采样的时候,遇到过采样值不准的情况吗?一般是怎么排查的?"
二、面试官考察点
考察方向
第一,是否有实际的ADC调试经验,而不只是看过手册;第二,排查思路是否有条理,能否系统地从硬件到软件逐步定位;第三,是否理解ADC的工作原理(采样保持、逐次逼近、参考电压),而不是只会调用库函数;第四,是否知道如何提高采样精度,对校准和滤波有没有实践经验。
三、回答思路
1. 排查总思路:先硬件后软件,先简单后复杂
遇到ADC采样不准的问题,我一般按下面这个顺序排查,每一步都有明确的判断依据:
确认输入信号本身是否正常
用示波器或万用表直接测ADC输入引脚的实际电压,和采样值换算后的电压对比。如果实测值和计算值一致,说明ADC采样是对的,问题出在信号源那边。如果不一致,再继续往下查。
检查参考电压和供电
测VREF+引脚的电压是否符合预期。如果用的是内部参考,检查是否使能、等待稳定时间够不够。同时测VDDA电源纹波,纹波大会影响采样精度。参考电压有问题的话,整个采样结果都会成比例地偏移。
检查硬件电路和PCB
看输入回路有没有接反、限流电阻是不是太大、去耦电容有没有加。模拟地和数字地的连接是否正确,有没有数字信号从模拟区下方穿过造成干扰。
检查软件配置
看ADC初始化配置对不对:采样时间是否足够、分辨率有没有设错、对齐方式对不对、校准有没有做。多通道的话看通道切换逻辑、DMA配置有没有问题。
加入软件滤波和校准
如果硬件和基本配置都没问题,但采样值还是跳,就考虑加软件滤波(多次平均、中值滤波、滑动平均),或者用硬件上的RC低通滤波来降低输入噪声。
2. 常见硬件原因(5个)
① 参考电压不准
外部基准源芯片输出有偏差或纹波大
内部参考没有经过校准,偏差可能达到百分之几
VREF+引脚去耦电容没加或离得太远
基准源负载太重,输出被拉低
② 输入源阻抗太大
分压电阻太大,采样电容充不满
传感器输出阻抗高,没有加运放缓冲
采样时间设置太短,高阻抗源建立不起来
前端滤波器电阻过大,等效输出阻抗高
③ 电源和地的干扰
VDDA纹波太大,影响ADC内部比较器
数字电路开关噪声通过地弹耦合到模拟部分
模拟地和数字地单点连接没做好
大电流回路的地电流流过模拟地区域
④ 输入信号超出范围
输入电压超过VREF+,被削顶
输入有负电压,低于地电位
共模电压超出ADC允许范围
差分输入时正负端接反
3. 常见软件原因(5个)
① 采样时间不够
ADC时钟太快,采样周期数设得太少
源阻抗大但还是用了短采样时间
快速通道和慢速通道用了同样的采样时间
建立时间不够导致采样值偏小或随机跳动
② 没做校准或校准时机不对
上电后直接采样,没调用校准函数
校准在ADC使能状态下做的,顺序反了
温度变化大后没有重新校准
只校准了失调,没考虑增益误差
③ 多通道切换问题
通道切换后立即采样,采样电容还没换过来
前一个通道是高压,后一个是低压,残留电荷影响
扫描模式下各通道采样时间设成一样的
DMA传输和采样时序配合有问题
④ 软件处理不当
数据对齐方式设错,左右对齐搞反
过采样配置和实际不匹配
滤波算法选得不对或参数不合理
单位换算公式有误,比如参考电压值用错
4. 提高采样精度的方法
| 方法 | 原理 | 适用场景 | 注意事项 |
|---|---|---|---|
| 硬件校准 | 利用ADC内部校准电路修正失调和增益误差 | 所有使用内置ADC的场景 | 上电后做一次,温度变化大时重做 |
| 外部基准源 | 用高精度基准芯片代替内部基准 | 要求较高精度的场合 | 基准源精度一般0.1%到0.5%,注意温度漂移 |
| 多次采样平均 | 取N次采样的平均值降低随机噪声 | 信号变化慢、噪声大的场景 | 采样次数越多精度越高,但响应变慢 |
| 过采样 | 用更高的采样率换取有效位数 | 信号带宽远低于采样率的情况 | 每提高1位分辨率需要4倍过采样率 |
| 前端RC滤波 | 降低输入信号上的高频噪声 | 输入有高频干扰的情况 | RC时间常数不能太大,否则建立时间不够 |
| 软件数字滤波 | 中值滤波、滑动平均、卡尔曼滤波等 | 采样后的数据处理 | 根据噪声类型选择合适的滤波算法 |
四、面试官追问(5个)
STM32的ADC采样时间一般设多少个周期?
这要取决于输入信号的源阻抗。STM32数据手册里有采样时间和最大允许源阻抗的对应表。比如12位ADC,采样时间3个周期时最大源阻抗只有几百欧,56个周期时可以到几十千欧。一般调试的时候可以先设长一点,比如100多个周期,确保建立足够,再根据实际情况缩短。
为什么多通道切换后第一个采样值不准?
因为ADC内部的采样电容上还残留着上一个通道的电压,切换到新通道后需要时间重新充电到新的电压值。如果刚切换完就采样,结果就会受前一个通道的影响,也叫"通道串扰"。解决办法是切换后丢弃前几个采样值,或者设置更长的采样时间。
过采样提高分辨率的原理是什么?
过采样是用远高于奈奎斯特频率的速率采样,然后对多次采样结果取平均。量化噪声是白噪声分布在整个奈奎斯特带宽内,过采样后再数字滤波,可以把带内的量化噪声功率降低,从而提高有效位数。每过采样4倍可以提高约1位有效分辨率。
中值滤波和平均值滤波各适合什么情况?
平均值滤波对抑制高斯白噪声效果好,但对突发的尖峰干扰抑制不好,因为尖峰会直接拉偏平均值。中值滤波对脉冲干扰抑制效果好,取中间值不受极值影响,但对白噪声的平滑效果不如平均值。实际中可以两者结合,先中值再平均,效果更好。
ADC采样值偶尔跳到0或满量程是什么原因?
如果偶尔跳到极值,大概率是干扰或硬件问题,不是软件配置的问题。可能的原因:输入信号有毛刺、电源有瞬时跌落、EMI干扰耦合到ADC输入、接地不良引入的共模干扰。可以在输入端加RC滤波和TVS保护,检查接地和屏蔽。
五、失分表达
"采样不准就是参考电压的问题" —— 太绝对,原因很多,要按步骤排查
"采样时间越长越准" —— 太长会降低采样率,而且到一定程度后精度不再提升
"12位ADC就是12位精度" —— 实际有效位数(ENOB)通常比标称分辨率低1到2位,受噪声和非线性影响
"用了DMA采样就肯定准" —— DMA只是传输方式,采样准不准还是看ADC本身的配置和硬件
"加软件滤波就能解决所有不准的问题" —— 软件滤波只能处理噪声,系统性偏差比如参考电压不准,滤波解决不了
六、准备动作
复习逐次逼近型ADC的工作原理,理解采样保持和逐次比较的过程
熟悉STM32 ADC的初始化流程,包括时钟、采样时间、校准、DMA等配置
理解参考电压、失调误差、增益误差、积分非线性、微分非线性这些概念
掌握几种常见的软件数字滤波算法(平均值、中值、滑动平均、一阶滞后)
准备一个实际项目中ADC采样不准的排查案例,讲清楚定位过程和解决方法
七、核心关键词
ADC采样不准、STM32 ADC、参考电压、VREF、采样时间、自校准、失调误差、增益误差、过采样、有效位数、源阻抗、采样保持、DMA传输、中值滤波、滑动平均、模拟地数字地

扫码关注




























