大家在使用 ADC 的时候,往往最关注位数,而对 ADC 的线性度往往会忽略。
其实这个线性度也是 ADC 非常重要的指标,ADC(或 DAC,其实 ADC 也是由 DAC 组成的)线性
度指标有两个:
INL:翻译过来叫“积分非线性”,指的是 ADC 整体的非线性程度。
DNL:翻译过来叫“微分非线性”,指的是 ADC 局部(细节)的非线性程度。
我们通常讲的“线性度”都是指“积分非线性”,积分非线性一般以百分比给出,或者以位数给出。举个
例子:AD7705(16 位)的 datasheet 上说有 0.003%的非线性。1LSB 为 1/65535=0.0015%,所
以也可说 AD7705 有 2LSB 的非线性。“微分非线性”不常用,UAD7705 的 datasheet 上说:“16 位无失
码”,那就是说明它的微分非线性小于 1LSB。
再举个例子:有一把 10 厘米的尺子,分度为 1mm(分辨率,相当于 ADC 的 1LSB),那总共有
100 小格(满量程为 100LSB,7 位 ADC 都不到)。
“微分非线性”指的是,每一小格长度和理想的一小格长度(定为 1mm)之间的误差。就是说这把
尺子有疏有密,假设这把尺子有些小格的长度分别为:U0.8mm,U0.9mm,U1.0m
m,1.1mm,1.3mm。那么U1.3mm 的小格对应的“微分非线性”为:1.3mm–1mm=
0.3mm,0.8mm 的小格对应的“微分非线性”为 0.8mm–1mm= -0.2mm,取绝对值就是 0.2mm。取
最大的误差值 0.3mm(也就是 0.3LSB)定义为这把尺子的“微分非线性”。
“积分非线性”是微分非线性误差的积累,是某一长段区间(有可能在 3cm 处,也有可能在 5cm 处
有最大误差)和真实长度的误差。“积分”就是对一段区间内的“微分”求代数和嘛(离散域)。
好的微分非线性并不能保证有一个好的积分非线性,因为假如微分非线性的误差很小,但都是正的,
那积分非线性就会很大(假如尺子有 100 小格,每一小格的的微分非线性误差累加起来就很大)。但是
好的积分非线性可以保证有一个好的微分非线性。
有些人会问,假如有一把尺子的每一小格都是 0.9mm,这时 INL 和 DNL 为多少?这时候格子的疏
密是均匀的,DNL 为 0mm,INL 也为 0%,也就是线性度非常理想(我这里把理想一小格长度定为
0.9mm)。但是这样的尺子是不准确的,我们说这把尺子有一个增益误差(这里就是 0.9 倍)。就是说
你用这把尺寸量到一个物体长度读数为 10CM,需要再乘上 0.9 这个系数,物体的真实尺寸为
10CM*0.9=9CM。我们使用一些 ADC 时,常常要做增益校准,做的就是这个事(用一个标准的信号源,
把这个 0.9 的系数给算出来,存到单片机或者 E2PROM 里面)。
说到这里大家对 ADC 线性度概念应该可以明白一些了,但是如何把一个 ADC 芯片的线性度测量出
来,那可不是容易的事。特别是高位数的 ADC,比如 16 位,笨一点的办法,就是测 65536 个点,计算
得到积分非线性,如果是 24 位的 ADC,估计一两年之内都测不完。