浅谈ADC的误差
最近使用的一个压力传感器需要使用K60的ADC采集电压,于是又将之前写的关于ADC内容重新翻出来看了看,发现写的还是不够清楚,于是又查阅了一些资料,结合之前写的,写的稍微细一点。
关于ADC大家一定都不陌生,也就是我们常说的模数转换,将模拟信号(如电压、电流等)转为数字信号,可是在使用的时候我们发现,采用12位分辨率的ADC未必意味着具有12位的精度。很多时候,令我们吃惊和不解的是:数据采集时ADC所表现出的性能往往远低于期望值。如果这个问题直到实际运行时才被发现,那么重新设计的成本有点高了。那么到底是那些因素在影响着ADC的精度呢?ADC的误差可以分为与直流(DC)和交流(AC)有关的误差。,交流误差还不太明白,这里就先介绍直流误差,直流误差又细分为四类:量化误差、微分非线性误差、积分非线性误差、失调与增益误差。
首先我们需要弄清楚几个概念:精度,分辨率,LBS,量化。以前写过一点关于ADC的,就直接搬来了:
简单点说,“精度”是用来描述物理量的准确程度的,而“分辨率”是用来描述刻度划分的。之前在网上看见一个例子举得很通俗:有这么一把常见的塑料尺,它的量程是10厘米,上面有100个刻度,最小能读出1毫米的有效值。那么我们就说这把尺子的分辨率是1毫米,或者量程的1%;而它的实际精度就不得而知了(算是0.1毫米吧)。当我们用火来烤一下它,并且把它拉长一段,然后再考察一下它。我们不难发现,它还有有100个刻度,它的“分辨率”还是1毫米,跟原来一样!然而,您还会认为它的精度还是原来的0.1毫米么?
假定我们需要0.1%或者说10位的精度(1/2^10),只有选择一个具有更高分辨率的转换器才有意义。如果是一个12位(分辨率)的转换器,我们可能会想当然地以为精度已足够高;但是在没有仔细检查其规格书之前,我们并没有把握得到12位的性能(实际情况可能更好或更糟)。举例来说,一个具有4LSB INL(INL下面会讲到)的12位ADC,最多只能提供10位的精度。一个具有0.5LSB INL的12位ADC器件则可提供0.0122%的误差或13位的精度。要计算最佳精度,可用最大INL误差除以2^N,其中N是转换器位数。
分辨率是由AD的位数决定的,比如说ADC采用的16位时,它的分辨率就是2^16。LBS是一种度量单位,1LSB = VFSR/2^N,其中VFSR为满量程电压,N是ADC的分辨率,举例来说,满量程为3.3v,ADC分辨率为10位时,1LBS = 0.003v。
1 量化误差
量化是指将输入的电压以离散的电压来表示,以3位分辨率的ADC举例,如图1所示,将3.3V以000b-111b这8个代码(英文里面就是用code来表示的)表示,相邻代码跨越VFSR/8的电压范围。量化误差是基本误差,产生指定代码的实际电压与代表该码的电压两者之间存在误差,因为实际上电压值是一个点,而量化之后是范围。一般来说,0.5LSB偏移加入到输入端便导致在理想过渡点上有正负0.5LSB的量化误差。
2 微分非线性(Differential nonlinearity,DNL)
DNL误差定义为实际量化台阶(也就是图1中,每个代码对应的横线的宽度)与对应于1LSB的理想值之间误差最大的那一点的误差值。对于一个理想ADC,其微分非线性为DNL = 0LSB,也就是说每个模拟量化台阶等于1LSB ,跳变值之间的间隔为精确的1LSB。当一个ADC的数字量输出随着模拟输入信号的增加而增加时(或保持不变),就称其具有单调性,相应传输函数曲线的斜率没有变号。若DNL误差指标≤ 1LSB,就意味着传输函数具有保证的单调性(DNL<-1),没有丢码(DNL>1),有时候有丢码并非一定是坏事。如果你只需要13位分辨率,同时你有两种选择,一个是DNL指标≤ ±4LSB的16位ADC (相当于无丢码的14位,由精度计算公式得到),价格为5美元,另一个是DNL ≤ ±1LSB的16位ADC,价格为15美元,这时候,购买一个低等级的ADC将大幅度地节省你的元件成本,同时又满足了你的系统要求。DNL指标是在消除了静态增益误差的影响后得到的。公式定义如下:
VD是对应于数字输出代码D的输入模拟量,N是ADC分辨率,VLSB-IDEAL是两个相邻代码的理想间隔。
3 积分非线性(Integral nonlinearity,INL)
INL表示了ADC器件在所有的数值点上对应的模拟值和真实值之间误差最大的那一点的误差值,也就是输出数值偏离直线最大的距离,可以看出,积分非线性(INL)定义为DNL误差的积分,因此较好的INL指标意味着较好的DNL。INL误差告诉设计者转换器测量结果距离理想转换函数值有多远,需要注意的是,无论是INL或DNL带来的误差,都不太容易校准或修正。INL的单位是LSB,公式定义如下:
VD是数字输出码D对应的模拟输入,N是ADC的分辨率,VZERO是对应于全零输出码的最低模拟输入,VLSB-IDEAL是两个相邻代码的理想间隔。
4 失调和增益误差
失调和增益误差很容易利用微控制器修正过来。就失调误差来讲,如果转换器允许双极性输入信号的话,操作将非常简单。对于双极性系统,失调误差只是平移了转换函数,但没有减少可用编码的数量(图2)。有两套方法可以使双极性误差归零。其一,你可以将转换函数的x或y轴平移,使负满度点与单极性系统的零点相对准。利用这种方法,可以简单地消除失调误差,然后,通过围绕“新”零点旋转转换函数可以对增益误差进行调节。第二种技术采用了一种迭代法。首先给ADC输入施加一个0V电压并执行一次转换;转换结果反映了双极性零点失调误差。然后,通过围绕负满度点旋转转换曲线实现增益调节。注意此时转换函数已绕A点转过一定角度,使零点偏离了期望的转换函数。因此还需要进一步的失调误差校正。
5 其它误差源
还有其他一些因素会导致误差:如基准源的选取,采用内部或外部基准的ADC的一个最大潜在误差源是基准源。很多情况下,内置于芯片内部的基准通常都没有足够严格的规格。为了理解基准所带来的误差源,有必要特别关注一下三项指标:温漂,电压噪声,和负载调整。
温漂
温漂是规格书中最容易被忽视的一项指标。一般ppm/(Parts per million/Kelvin,温度变化一度,误差变化的百万分率)K来表示。假设某基准30ppm/K,系统在20~70度之间工作,温度跨度50度,那么,会引起基准电压30*50=1500ppm的漂移,从而带来0.15%的误差。温漂越小的基准源越贵,比30ppm/K的431,七毛钱;20ppm/K的385,1块5;10ppm/K的MC1403,4块5;1ppm/K的LM399,14元;0.5ppm/K的LM199,130元。
对有些系统来讲,参考电压的精度不是一个大问题,因为温度被保持于恒定,避免了温度漂移问题。还有一些系统采用一种比例测量方式,用同一个信号激励传感器和作为参考电压,可以消除基准引起的误差,如上图。因为激励源和基准同时漂移,漂移误差相互抵消。在其它系统中,采用补偿手段消除基准漂移通常也很有效。另外也有一些系统并不关注绝对精度,而注重于相对精度。这样的系统允许基准随着时间缓慢漂移,同时又能够提供期望的精度。
电压噪声
另外一个重要指标是电压噪声。它通常规定为RMS值或峰–峰值。要估计它对于性能的影响,需要将RMS值转换为峰–峰值。如果一个2.5V基准在输出端具有500µV的峰–峰电压噪声(或83µV RMS),该噪声会带来0.02%的误差,或将系统性能限制于仅12位,而且这还没考虑任何其它的转换器误差。理想情况下,基准的噪声应该远低于一个LSB ,这样才不至于限制ADC的性能发挥。带有片内基准的ADC通常都不规定电压噪声,这样就将确定误差的任务留给了用户。如果你的设计没有达到预期性能,而你又正在使用内置基准,可尝试采用一个高性能的外部基准,这样你就可以确定造成性能下降的真正元凶是否是内部基准。
负载调整
最后一项指标是基准的负载调整。用于ADC的电压基准通常具有足够的电流可用于驱动其它器件,因此有时也被其它IC使用。 其它元件的吸取电流会影响到电压基准,也就是说随着吸取电流的增大,参考电压会跌落。如果使用基准的器件被间歇性地打开和关闭,将会导致参考电压随之上升或下降。如果一个2.5V基准的负载调整率指标为0.55µV/µA,那就意味着当有另外一个器件吸取800µA电流时,参考电压将会改变多达440µV,这将带来0.0176%的误差(440µV/2.5V)。
上面就是最近在看ADC整理的一些资料,参考了K60芯片手册、还有摘录网上的一些资料。失调和增益误差那边我自己也不是太明白,还要再看看,理解了再回来补充。