第二讲:误差来源分析——系统误差、随机误差、粗大误差,以及ADC量化误差、温漂、时漂

做嵌入式万用表,说白了就是跟误差打交道。我刚开始做校准算法那会儿,总觉得只要ADC够好,读数就准。结果呢?被现实狠狠教育了一顿。今天咱们就把这些误差掰开揉碎了讲清楚。

2.1 误差的三大分类:系统误差、随机误差、粗大误差

搞计量的人都知道,误差不是铁板一块。它分三类,每一类的脾气都不一样。

2.1.1 系统误差

系统误差,我习惯叫它“偏心的误差”。它总是往一个方向偏,要么偏大,要么偏小。比如你用的参考电压实际是4.95V,但你程序里写死了5.00V,那测出来的值就永远偏大1%。

系统误差的特点很明确:重复测量不会消除它。你测100次,它偏100次。

我在项目中遇到过最典型的系统误差——分压电阻的精度问题。一个1%精度的100kΩ电阻,实际可能是99kΩ。你算出来的分压比就全错了。这种误差,校准算法必须处理。

关键点:系统误差可以通过校准来修正。比如用标准源标定,然后做线性补偿。

2.1.2 随机误差

随机误差就调皮了。它没有固定方向,这次偏大,下次偏小。说白了就是噪声带来的。

你想想看,ADC采样的时候,电路里的热噪声、电源纹波、甚至地线上的干扰,都会让读数跳来跳去。这就是随机误差。

随机误差有个好脾气:多次平均可以减小它。根据统计学,平均N次,随机误差的幅度大约降到原来的1/√N。嗯,这里要注意——平均次数不是越多越好,后面我会讲。

我的经验:一般取16次或32次平均就够了。再多了,效果提升不明显,反而拖慢测量速度。

2.1.3 粗大误差

粗大误差,也叫“野值”。它跟前面两种完全不是一个路数。粗大误差是操作失误、接触不良、或者突发干扰造成的。

比如你测电压时探针松了一下,读数突然跳到几百伏。或者静电放电打到了ADC输入引脚,采到一个离谱的值。

我曾经遇到过一件事:一个同事调试万用表,发现偶尔会跳出一个-0.5V的读数。查了两天,最后发现是ADC的参考电压引脚虚焊了。这就是典型的粗大误差。

避坑指南:粗大误差必须剔除。常用的方法有3σ准则、格鲁布斯检验法。我习惯用中位数滤波,简单粗暴有效。

2.2 ADC量化误差——躲不掉的“数字脚印”

ADC量化误差,说白了就是模拟信号变成数字信号时,精度不够带来的误差。

举个例子:一个12位ADC,参考电压3.3V。它的分辨率是多少?

分辨率 = 3.3V / 4096 ≈ 0.805mV

也就是说,任何模拟电压在ADC眼里,只能以0.805mV为步进来表示。3.300V和3.301V?在ADC看来可能是一样的。

量化误差的最大值是±1/2 LSB。对于12位ADC,就是±0.4mV左右。这个误差是原理性的,你换再好的ADC芯片也躲不掉——除非你用更高分辨率的ADC。

我个人的习惯是:选ADC时,分辨率要比目标精度高4倍以上。比如你要做到0.1%的精度,那ADC至少要12位。想做到0.01%,就得16位起步。

量化误差的应对:

  • 过采样技术——用高速采样+数字滤波,等效提高分辨率
  • 抖动技术——人为加一点噪声,让量化误差随机化
  • 校准补偿——在软件里做非线性修正

2.3 温漂——温度一变,读数就飘

温漂是嵌入式万用表最头疼的问题之一。为什么?因为电子元件对温度都很敏感。

参考电压芯片的温漂系数通常是几个ppm/℃。比如一个5ppm/℃的参考源,温度变化10℃,输出就漂了0.005%。看起来不大?但如果你要测0.1%精度的信号,这已经占了5%的误差预算了。

还有电阻的温漂。普通贴片电阻的温漂是100~200ppm/℃,精密电阻能做到10ppm/℃。我做过一个项目,用了普通电阻做分压,夏天和冬天的读数差了将近1%。后来全换成了精密电阻,问题才解决。

温漂的应对方法,我总结了几条:

  • 硬件选型:用低温漂的元件,比如0.1ppm/℃的参考源
  • 温度补偿:板上放温度传感器,软件里做查表修正
  • 恒温设计:把关键电路放在恒温槽里(成本高,一般不用)
  • 差分测量:用比例测量法,抵消共模温漂

我的建议:低成本方案用温度补偿就够了。在板上贴一个DS18B20或者NTC,每10秒读一次温度,然后查修正表。效果立竿见影。

2.4 时漂——时间久了,元件会“老化”

时漂,也叫老化。电子元件用久了,参数会慢慢变化。比如参考电压芯片,刚出厂时是2.500V,用了一年后可能变成2.498V。

时漂和温漂不一样。温漂是可逆的——温度降下来,参数会恢复。时漂是不可逆的——元件老化了就是老化了。

我记得有个产品,出厂时校准得好好的。用了半年后,客户反馈读数偏大。查了半天,发现是参考电压芯片老化了,输出从2.500V漂到了2.495V。从那以后,我设计产品时都会留一个“定期校准”的接口。

时漂的应对策略:

  • 选型:选老化率低的元件,比如精密参考源的老化率通常<10ppm/1000小时
  • 定期校准:产品设计时预留校准接口,用户可以用标准源重新标定
  • 自校准:内部放一个高稳定度的参考源,定期自动校准
  • 冗余设计:用两个参考源互相校验,发现偏差大时报警

避坑指南:我曾经见过一个设计,用了便宜的TL431做参考源。结果老化率高达100ppm/1000小时。一年下来漂了将近1%。这种元件做万用表,根本没法用。所以,参考源的钱不能省。

2.5 误差的叠加——总误差怎么算?

上面讲了这么多误差,它们不是孤立存在的。实际测量时,所有误差会叠加在一起。

误差叠加有两种方式:

误差类型 叠加方式 公式
系统误差 代数和 E_sys = E1 + E2 + ...
随机误差 方和根 E_rand = √(σ1² + σ2² + ...)
总误差 系统+随机 E_total = E_sys + k·E_rand

举个例子:你的万用表有0.1%的系统误差(电阻分压不准),还有0.05%的随机误差(ADC噪声)。那总误差大概是多少?

系统误差直接加:0.1%。随机误差按3σ算:0.05% × 3 = 0.15%。总误差 ≈ 0.1% + 0.15% = 0.25%。

嗯,这里要注意——这个估算比较保守。实际工程中,我们通常用方和根法:√(0.1² + 0.15²) ≈ 0.18%。两种算法差别不小,具体用哪个,看你的设计余量。

我的做法:设计初期用保守算法(代数和),留足余量。后期优化时,用方和根法,可以挤出一点性能。

2.6 小结

这一讲我们聊了误差的方方面面。总结一下:

  • 系统误差:固定方向,可校准消除
  • 随机误差:方向不定,可平均减小
  • 粗大误差:突发异常,必须剔除
  • 量化误差:ADC原理限制,过采样可改善
  • 温漂:温度敏感,补偿或选低温漂元件
  • 时漂:元件老化,定期校准或自校准

下一讲,我们会深入校准算法的具体实现。到时候,我会手把手教你写一个完整的校准函数。敬请期待。


公众号:蓝海资料掘金营,微信deep3321