
1. 从一个“看起来很简单”的采样电路说起ADC采样不准几乎是每个做嵌入式硬件的人都会踩的坑。我见过太多项目MCU选的是12位甚至16位ADC参考电压用的是高精度基准源代码里还加了均值滤波和校准结果实测数据跳得跟心电图一样或者干脆偏了一大截。这时候很多人第一反应是“ADC不行”或者“代码有问题”但根据我这些年的排查经验八成以上的精度问题出在模拟前端和PCB布局上而不是ADC本身。这篇文章面向的是所有需要做模拟量采集的硬件工程师、嵌入式开发者以及那些正在被“采样值飘忽不定”折磨的朋友。我会从最基础的分压电阻选型开始一路讲到PCB布局的细节把整个信号链上可能导致误差的环节逐个拆开。不管你是刚入行的新手还是做了几年硬件的老手这套排查思路都能直接拿去用。先明确一个核心观点ADC采样是一个系统问题不是单一器件问题。从传感器输出到分压网络到RC滤波到ADC输入引脚再到参考电压和接地任何一个环节出问题最终都会体现在采样值上。所以排查的时候不能只盯着ADC看要沿着信号路径一段一段查。2. 分压电阻最容易被低估的误差来源2.1 电阻精度和温漂到底影响多大很多人选分压电阻的时候随手拿两个10kΩ的1%精度电阻就焊上去了。1%听起来还行对吧但你要知道两个电阻的误差是独立分布的最坏情况下分压比误差可能接近2%。对于一个3.3V满量程的12位ADC来说1个LSB大约是0.8mV2%的误差意味着满量程附近可能有几十个LSB的偏差。这还只是初始精度。温漂才是更隐蔽的杀手。普通厚膜电阻的温度系数大概在100ppm/°C左右好一点的在50ppm/°C精密电阻可以做到10ppm/°C甚至更低。假设你的设备工作在-20°C到60°C的环境里温差80°C100ppm/°C的电阻在这个范围内阻值变化可能达到0.8%。如果两个电阻的温漂方向不一致分压比的变化会更复杂。我一般建议分压电阻至少用0.1%精度的金属膜电阻温漂控制在25ppm/°C以内。如果成本允许用匹配电阻网络更好因为同一封装内的电阻温漂一致性非常好分压比几乎不随温度变化。2.2 电阻取值不是随便选的分压电阻的阻值选择有两个矛盾要平衡。阻值太大ADC输入端的漏电流和偏置电流会在电阻上产生额外压降导致误差阻值太小又会有持续的电流消耗增加功耗还可能引起自热。一般来说ADC输入漏电流在nA级别偏置电流更小。如果分压电阻在10kΩ量级漏电流产生的误差可以忽略。但如果用到1MΩ级别10nA的漏电流就能产生10mV的误差这对于12位ADC来说就是十几个LSB了。我的经验是分压电阻的总阻值控制在10kΩ到100kΩ之间比较稳妥。具体取值要看你的信号源输出阻抗和功耗要求。如果是电池供电的低功耗设备可以适当取大一些但要确认ADC的输入漏电流足够小。还有一个细节分压电阻的功率降额。假设你的分压网络接在12V上总阻值20kΩ电流就是0.6mA功耗7.2mW。0402封装的电阻额定功率一般是62.5mW看起来余量很大。但如果你用的是0201封装额定功率可能只有31mW长期工作在高温环境下阻值会慢慢漂移。所以封装不要选太小0603或0805是比较稳妥的选择。2.3 分压电容的配合很关键分压电阻旁边通常要并联一个电容和电阻一起构成RC低通滤波。这个电容的作用有两个一是滤掉高频噪声二是为ADC采样保持电容提供电荷。这里有个常见的误区电容不是越大越好。电容太大充电时间长如果ADC的采样时间不够采样保持电容还没充到最终值就开始转换了结果肯定偏低。电容太小滤波效果又不够。我通常这样算ADC采样保持电容一般是几pF到十几pF采样开关电阻在kΩ量级。假设采样时间是1μs采样保持电容是10pF那么外部RC的时间常数应该远小于1μs。如果分压电阻是10kΩ电容取100nF时间常数就是1ms远远大于采样时间这就会导致采样不足。正确的做法是在ADC输入引脚前面加一个小的RC比如1kΩ加1nF时间常数1μs和采样时间匹配。分压电阻旁边的滤波电容可以取100nF到1μF但要注意这个电容和分压电阻构成的时间常数不能影响信号的建立时间。3. 参考电压ADC的“尺子”必须准3.1 参考电压源的选型要点ADC的转换结果本质上是输入电压和参考电压的比值。参考电压不准测量结果肯定不准。很多人用MCU的电源电压做参考比如3.3V的LDO输出。但LDO的精度一般是2%到5%而且负载调整率和温度漂移都不小根本不适合做精密测量。独立基准源的初始精度至少要在0.1%以内温漂在10ppm/°C以内。比如常见的带隙基准源初始精度可以做到0.05%温漂5ppm/°C。虽然价格比普通LDO贵一些但对于精度要求高的场合这个钱不能省。还有一个容易被忽略的点基准源的噪声。有些基准源输出噪声比较大比如几十μVpp对于12位ADC来说1个LSB才0.8mV几十μV的噪声虽然不会直接引起跳码但会降低有效位数。选型的时候要看数据手册里的噪声指标一般选择0.1Hz到10Hz噪声在10μVpp以内的。3.2 参考电压的滤波和去耦基准源的输出一定要加去耦电容而且位置要尽量靠近基准源的输出引脚和ADC的参考输入引脚。我一般会放一个1μF的陶瓷电容和一个100nF的电容并联1μF负责低频去耦100nF负责高频去耦。如果基准源和ADC之间距离比较远中间还要加RC滤波。比如串一个10Ω的电阻再并一个1μF的电容截止频率大概在16kHz可以有效滤掉高频噪声。但要注意这个电阻不能太大否则基准源的负载调整率会引起额外误差。注意基准源的负载电流要留足余量。ADC的参考输入电流虽然不大但基准源的输出阻抗和负载调整率会影响精度。选型时确认基准源在ADC参考电流下的输出偏差在可接受范围内。3.3 参考电压的接地处理参考电压的接地回路一定要干净。如果基准源的地和ADC的地之间有压差参考电压就会偏移。我通常会把基准源的地和ADC的地在同一个点连接这个点尽量靠近ADC的接地引脚。如果板子上有数字地和模拟地之分基准源的地要接模拟地而且模拟地和数字地只能在一点连接通常在ADC芯片下方。这个连接点要尽量短而粗减少地阻抗。4. PCB布局细节决定成败4.1 模拟信号走线的基本原则模拟信号走线要尽量短、尽量粗远离数字信号和高频信号。我见过很多板子模拟输入线从板子一头走到另一头中间还穿过SPI时钟线和PWM输出线这种布局采样不跳才怪。模拟输入线最好走成直线不要有分支。如果实在要走弯用圆弧过渡不要用直角。直角走线会产生阻抗突变引起信号反射。虽然对于低频模拟信号来说反射的影响不大但直角走线更容易成为天线接收周围的噪声。走线宽度方面模拟信号线至少10mil条件允许的话走15mil到20mil。线宽大一些走线电阻和电感都小抗干扰能力更强。如果空间允许模拟输入线两侧可以加地线屏蔽地线要每隔一段距离打过孔连接到地平面。4.2 地平面的处理地平面是模拟电路的“基石”。模拟部分下面一定要有完整的地平面不要被数字信号线割裂。如果地平面被割裂回流电流会绕远路形成大的环路面积容易接收噪声。我通常的做法是在PCB叠层设计时把模拟部分和数字部分分开布局地平面在ADC芯片下方单点连接。模拟地平面和数字地平面各自完整只在ADC下面用一根窄桥连接。这样数字部分的噪声不会通过地平面耦合到模拟部分。如果板子层数有限只有两层板那至少要保证模拟部分下面有一块完整的地铜皮。数字信号线不要从模拟部分下面穿过如果实在避不开中间要加地线隔离。4.3 去耦电容的摆放去耦电容的摆放位置比容值更重要。每个电源引脚旁边都要放一个100nF的陶瓷电容距离引脚越近越好最好在5mm以内。如果距离太远电容和引脚之间的走线电感会削弱高频去耦效果。除了100nF的小电容每个电源区域还要放一个1μF到10μF的电容负责低频去耦。大电容可以离芯片稍远一些但也不要超过20mm。去耦电容的接地端要直接连接到地平面不要通过长走线再接地。过孔要尽量靠近电容的焊盘减少过孔电感。我一般会在电容的接地焊盘旁边放两个过孔一个不够。提示去耦电容的走线要先经过电容再进入芯片引脚不要从引脚上分叉出去。这样电容才能真正起到“就近储能”的作用。4.4 模拟输入端的保护与滤波ADC输入引脚通常比较脆弱过压或者负压都可能损坏芯片。我一般会在ADC输入引脚前面加一个限流电阻和一个钳位二极管。限流电阻取100Ω到1kΩ钳位二极管用低漏电流的型号比如BAT54S。滤波方面除了前面提到的RC低通还可以加一个共模扼流圈抑制共模噪声。如果信号线比较长共模扼流圈的效果很明显。但要注意共模扼流圈的寄生电容和电感会影响信号带宽选型时要确认截止频率远高于你的信号频率。5. 软件层面的配合与校准5.1 采样时序的配置ADC的采样时间要足够长让采样保持电容充分充电。采样时间不够是导致采样值偏低的常见原因。具体需要多长要看信号源阻抗和ADC的采样保持电容。假设信号源阻抗是10kΩ采样保持电容是10pF要达到12位精度充电时间需要大约9个时间常数也就是9×10kΩ×10pF900ns。如果ADC的采样时间只有500ns那肯定不够。我一般会把采样时间设置得比理论值大50%以上留足余量。如果ADC支持可编程采样时间先设一个较大的值测一下精度再逐步减小找到满足精度的最小值。5.2 多次采样与数字滤波单次采样容易受噪声影响多次采样取平均是最简单有效的滤波方法。我通常采16次或32次去掉最大值和最小值剩下的取平均。这样既能抑制随机噪声又能去掉偶发的尖峰干扰。如果信号变化比较慢还可以用一阶低通滤波比如每次采样结果和上次结果做加权平均。加权系数根据信号带宽来定信号变化慢就取小一些变化快就取大一些。注意数字滤波会引入相位延迟如果信号是闭环控制的一部分要考虑这个延迟对系统稳定性的影响。5.3 两点校准法的实操即使硬件做得再好总会有一些残余误差。两点校准是最实用的校准方法在量程的10%和90%附近各取一个校准点测出ADC读数和实际电压的对应关系然后计算斜率和截距。具体操作用一个高精度电压源输出两个已知电压比如0.33V和2.97V对应3.3V量程的10%和90%记录ADC读数。然后计算斜率 (V2 - V1) / (ADC2 - ADC1)截距 V1 - 斜率 × ADC1之后每次采样用实际电压 斜率 × ADC读数 截距来计算。这样可以把增益误差和偏移误差都校准掉。如果对精度要求更高可以用多点校准比如5个点然后用最小二乘法拟合。但对于大多数应用来说两点校准已经足够了。6. 常见问题排查速查表现象可能原因排查方法解决措施采样值整体偏高或偏低参考电压不准用万用表测参考电压实际值更换高精度基准源或重新校准采样值跳动大滤波不足或噪声耦合示波器看ADC输入引脚波形增加RC滤波改善布局采样值随温度变化电阻温漂或基准源温漂高低温箱测试记录数据更换低温漂电阻和基准源采样值随采样率变化采样时间不足降低采样率看是否改善增加采样时间或减小信号源阻抗某几个通道互相干扰通道间串扰只接一个通道看是否改善增加通道间隔离加采样保持电路上电初期不准后来变好基准源或电阻自热记录上电后随时间的变化增加预热时间或降低功耗靠近电机或继电器时跳变电磁干扰远离干扰源测试加屏蔽、滤波、隔离7. 几个容易踩的坑和实操心得第一个坑忽略ADC输入引脚的漏电流。有些ADC在高温下漏电流会增大到几十nA如果分压电阻取到几百kΩ误差就很明显了。我一般会在高温环境下实测一下确认漏电流在可接受范围内。第二个坑去耦电容用了错误的介质类型。Y5V电容的容值随温度和电压变化非常大用在基准源去耦上会导致参考电压不稳。一定要用X7R或C0G介质的电容C0G最稳定但容值做不大适合高频去耦X7R容值范围广适合一般去耦。第三个坑地平面上的过孔太多。过孔会在地平面上形成电感影响回流。模拟部分的地平面上过孔要尽量少而且不要排成一条线那样会割裂地平面。第四个坑忽略了PCB板材的影响。FR4板材在高温高湿环境下介电常数会变化影响走线阻抗。虽然对于低频模拟信号来说影响不大但如果你的信号频率到了几百kHz以上就要考虑板材的稳定性了。第五个坑校准之后没有验证。很多人校准完就完了没有在多个温度点和电压点验证。我一般会在校准后在量程的25%、50%、75%各测一次确认误差在允许范围内。实操心得排查ADC精度问题的时候我习惯先用一个高精度万用表直接测ADC输入引脚的电压和ADC读数对比。如果万用表读数和ADC读数差很多问题在ADC或参考电压如果万用表读数本身就和预期不符问题在分压网络或信号源。这一步能快速定位问题在ADC之前还是之后。8. 从信号链角度重新理解“准”的定义很多人追求ADC的“绝对精度”但实际上对于大多数应用来说重复性和线性度比绝对精度更重要。如果你的采样值每次都在同一个输入下得到同样的结果而且在不同输入下变化是线性的那即使有固定的偏移也可以通过校准解决。真正难解决的是随机误差和温漂。随机误差来自噪声可以通过滤波和布局改善温漂来自器件特性需要通过选型和补偿解决。所以我在设计的时候会把重点放在降低噪声和温漂上而不是追求每个器件都是最高精度。还有一个概念是有效位数。一个12位ADC如果噪声有4个LSB那有效位数只有10位左右。与其花大价钱买16位ADC不如先把12位ADC的噪声降下来让有效位数接近12位。布局和滤波的改善往往比换ADC更有效。最后分享一个我常用的快速验证方法用电池分压产生一个稳定的直流电压直接接到ADC输入端连续采样几个小时看数据的分布。如果数据集中在几个码值内说明噪声和稳定性都不错如果数据分散在几十个码值上那就要查噪声来源了。这个方法不需要高精度信号源一块电池和两个电阻就能做非常实用。这个内容后续还可以这样扩展如果你用的是Σ-Δ型ADC前端设计思路会有所不同采样保持电容和数字滤波器的影响更大如果是多通道轮流采样通道间的建立时间和串扰需要特别关注。这些方向等以后有机会再展开聊。