第二讲:误差来源分析——系统误差、随机误差、粗大误差,以及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