说精度之前,首先要说分辨率。最近已经有贴子热门讨论了这个问题,结论是分辨率决不等同于精度。比如一块精度0.2%(或常说的准确度0.2级)的四位半万用表,测得A点电压1.0000V,B电压1.0005V,可以分辨出B比A高0.0005V,但A点电压的真实值可能在0.9980~1.0020之间不确定。 那么,既然数字万用表存在着精度和分辨率两个指标,那么,对于ADC和DAC,除了分辨率以外,也存在精度的指标。 模数器件的精度指标是用积分非线性度(Interger NonLiner)即INL值来表示。也有的器件手册用 Linearity error 来表示。他表示了ADC器件在所有的数值点上对应的模拟值,和真实值之间误差最大的那一点的误差值。也就是,输出数值偏离线性最大的距离。单位是LSB(即最低位所表示的量)。 比如12位ADC:TLC2543,INL值为1LSB。那么,如果基准4.095V,测某电压得的转换结果是1000,那么,真实电压值可能分布在0.999~1.001V之间。对于DAC也是类似的。比如DAC7512,INL值为8LSB,那么,如果基准4.095V,给定数字量1000,那么输出电压可能是0.992~1.008V之间。 下面再说DNL值。理论上说,模数器件相邻量个数据之间,模拟量的差值都是一样的。就相一把疏密均匀的尺子。但实际并不如此。一把分辨率1毫米的尺子,相邻两刻度之间也不可能都是1毫米整。那么,ADC相邻两刻度之间最大的差异就叫差分非线性值(Differencial NonLiner)。DNL值如果大于1,那么这个ADC甚至不能保证是单调的,输入电压增大,在某个点数值反而会减小。这种现象在SAR(逐位比较)型ADC中很常见。 举个例子,某12位ADC,INL=8LSB,DNL=3LSB(性能比较差),基准4.095V,测A电压读数1000,测B电压度数1200。那么,可判断B点电压比A点高197~203mV。而不是准确的200mV。对于DAC也是一样的,某DAC的DNL值3LSB。那么,如果数字量增加200,实际电压增加量可能在197~203mV之间。 很多分辨率相同的ADC,价格却相差很多。除了速度、温度等级等原因之外,就是INL、DNL这两个值的差异了。比如AD574,贵得很,但它的INL值就能做到0.5LSB,这在SAR型ADC中已经很不容易了。换个便宜的2543吧,速度和分辨率都一样,但INL值只有1~1.5LSB,精度下降了3倍。 另外,工艺和原理也决定了精度。比如SAR型ADC,由于采用了R-2R或C-2C型结构,使得高权值电阻的一点点误差,将造成末位好几位的误差。在SAR型ADC的2^n点附近,比如128、1024、2048、切换权值点阻,误差是最大的。1024值对应的电压甚至可能会比1023值对应电压要小。这就是很多SAR型器件DNL值会超过1的原因。但SAR型ADC的INL值都很小,因为权值电阻的误差不会累加。 和SAR型器件完全相反的是阶梯电阻型模数/数模器件。比如TLC5510、DAC7512等低价模数器件。比如7512,它由4095个电阻串联而成。每个点阻都会有误差,一般电阻误差5%左右,当然不会离谱到100%,更不可能出现负数。因此这类器件的DNL值都很小,保证单调。但是,每个电阻的误差,串联后会累加,因此INL值很大,线性度差。 这里要提一下双积分ADC,它的原理就能保证线性。比如ICL7135,它在40000字的量程内,能做到0.5LSB的INL值(线性度达到1/80000 !!)和0.01LSB的DNL值.这两个指标在7135的10倍价钱内,是不容易被其他模数器件超越的。所以7135这一类双积分ADC特别适合用在数字电压表等需要线性误差非常小的场合。 还要特别提一下基准源。基准源是测量精度的重要保证。基准的关键指标是温飘,一般用ppm/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元。 该死的教科书害了一代学生。说起来好笑的一个现象:我这边新来的学生大多第一次设计ADC电路的时候,基准直接连VCC,还理直气壮的找来N本教科书,书上的基准写了个网标:+5V。天下的书互相抄,也就所有的学校的教科书都是基准接5V。教科书把5V改成5.000V多好?学生就会知道,这个5V不是VCC。或者提一下基准需要高稳定度,也好啊!
先谈谈线性测试
动态测试关注的是器件的传输和性能特征,即采样和重现时序变化信号的能力,相比之下,线性测试关注的则是器件内部电路的误差。对ADC来说,这些内部误差包括器件的增益、偏移、积分非线性(INL)和微分非线性(DNL)误差,这些参数说明了静止的模拟信号转换成数字信号的情况,主要关注具体电平与相应数字代码之间的关系。
测试ADC静态性能时,要考虑两个重要因素:第一,对于给定的模拟电压,一个具体数字代码并不能告诉多少有关器件的信息,它仅仅说明这个器件功能正常,要知道器件功能到底如何还必须考虑模拟电压的范围(它会产生一个输出代码)以及代码间的转换点;第二,动态测试一般关注器件在特定输入信号情况下的输出特性,然而静态测试是一个交互性过程,要在不同输入信号下测试实际输出。
总的来说,ADC的误差可以分为与直流(DC)和交流(AC)有关的误差。DC误差又细分为四类:量化误差、微分非线性误差、积分非线性误差、偏移与增益误差。AC误差一般与信噪及总谐波失真问题有关。
◆量化误差(Quantization Error)
量化误差是基本误差,用图3所示的简单3bit ADC来说明。输入电压被数字化,以8个离散电平来划分,分别由代码000b到111b去代表它们,每一代码跨越Vref/8的电压范围。代码大小一般被定义为一个最低有效位(Least Significant Bit,LSB)。若假定Vref=8V时,每个代码之间的电压变换就代表1V。换言之,产生指定代码的实际电压与代表该码的电压两者之间存在误差。一般来说,0.5LSB偏移加入到输入端便导致在理想过渡点上有正负0.5LSB的量化误差。
图3 理想ADC转换特性
◆偏移与增益误差(Offset Gain Error)
器件理想输出与实际输出之差定义为偏移误差,所有数字代码都存在这种误差。在实际中,偏移误差会使传递函数或模拟输入电压与对应数值输出代码间存在一个固定的偏移。通常计算偏移误差方法是测量第一个数字代码转换或“零”转换的电压,并将它与理论零点电压相比较。增益误差是预估传递函数和实际斜率的差别,增益误差通常在模数转换器最末或最后一个传输代码转换点计算。
为了找到零点与最后一个转换代码点以计算偏移和增益误差,可以采用多种测量方式,最常用的两种是代码平均法和电压抖动法。代码平均测量就是不断增大器件的输入电压,然后检测转换输出结果。每次增大输入电压都会得到一些转换代码,用这些代码的和算出一个平均值,测量产生这些平均转换代码的输入电压,计算出器件偏移和增益。电压抖动法和代码平均法类似,不同的是它采用了一个动态反馈回路控制器件输入电压,根据转换代码和预期代码的差对输入电压进行增减调整,直到两代码之间的差值为零,当预期转换代码接近输入电压或在转换点附近变化时,测量所施加的“抖动”电压平均值,计算偏移和增益。
◆微分非线性(Differential nonlinearity,DNL)
理论上说,模数器件相邻两个数据之间,模拟量的差值都是一样的。就好比疏密均匀的尺子。但实际上,相邻两刻度之间的间距不可能都是相等的。所以,ADC相邻两刻度之间最大的差异就叫微分非线性DNL,也称为差分非线性。同样举例来说明,如果对于12bit的ADC,其INL=8LSB,DNL=3LSB,在基准电压为4.095V时,测得A电压对应读数为1000b,测得B电压对应读数为1200b。那么就可以判断出,B点电压值比A点高出197mV到203mV,而不是准确的200mV。
图4 DNL误差特性
图4中,001b到010b码制过渡过程的DNL为0LSB,因为刚好为1LSB。但是000b到001b过渡就有个0.2LSB的DNL,因为此时有1.2LSB的代码宽度。应当注意:如果在ADC或者DAC的datasheet中没有清楚说明DNL参数的话,可视该转换器没有漏码,即暗示它有优于正负1LSB的DNL。
◆积分非线性(Integral nonlinearity,INL)
积分非线性表示了ADC器件在所有的数值点上对应的模拟值和真实值之间误差最大的那一点的误差值,也就是输出数值偏离线性最大的距离。单位是LSB。例如,一个12bit的ADC,INL值为1LSB,那么,对应基准4.095V,测某电压得到的转换结果是1000b,那么,真实电压值可能分布在0.999V到1.001V之间。
INL是DNL误差的数学积分,即一个具有良好INL的ADC保证有良好的DNL。
图5 INL误差特性
总之,非线性微分和积分是指代码转换与理想状态之间的差异。非线性微分(DNL)主要是代码步距与理论步距之差,而非线性积分 (INL)则关注所有代码非线性误差的累计效应。对一个ADC来说,一段范围的输入电压产生一个给定输出代码,非线性微分误差为正时输入电压范围比理想的大,非线性微分误差为负时输入电压范围比理想的要小。从整个输出代码来看,每个输入电压代码步距差异累积起来以后和理想值相比会产生一个总差异,这个差异就是非线性积分误差。
图6 INL和DNL
与增益和偏移一样,计算非线性微分与积分误差也有很多种方法,代码平均和电压抖动两种方法都可以使用,但是由于存在重复搜索,当器件位数较多时这两种方法执行起来很费时。一个更加有效计算INL和DNL的方法是直方图法,采用线性或正弦直方图。图7说明了线性斜升技术的应用,首先使输入电压线性增加,同时对输出以固定间隔连续采样,电压逐步增加时连续几次采样都会得到同样输出代码,这些采样次数称为“点击数”。
图7 计算直方图
从统计上讲,每个代码的点击数量直接与该代码的相应输入电压范围成正比,点击数越多表明该代码的输入电压范围越大,非线性微分误差也就越大;同样,代码点击数越少表明该代码输入电压范围越小,非线性微分误差也就越小。用数学方法计算,如果某个代码点击数为9,而“理想”情况下是8,则该器件的非线性微分误差就是(9-8)/8或0.125。非线性积分是所有代码非线性微分的累计值,对于斜升直方图,它就是每个非线性微分误差的和。从数学观点来看,非线性积分误差等于在代码X-1的非线性微分误差加上代码X和代码X-1的非线性微分误差平均值。