對ADC(DAC)的線性度(INL和DNL)的一點理解
作者:xjb37
轉自:https://www.cnblogs.com/loves6036/p/5068849.html
大家在使用ADC的時候,往往最關注位數,而對ADC的線性度往往會忽略。
其實這個線性度也是ADC非常重要的指標,ADC(或DAC,其實ADC也是由DAC組成的)線性度指標有兩個:
INL:翻譯過來叫“積分非線性”,指的是ADC整體的非線性程度。
DNL:翻譯過來叫“微分非線性”,指的是ADC局部(細節)的非線性程度。
我們通常講的“線性度”都是指“積分非線性”,積分非線性一般以百分比給出,或者以位數給出。舉個例子:AD7705(16位)的datasheet上說有0.003%的非線性。1LSB為1/65535=0.0015%,所以也可說AD7705有2LSB的非線性。“微分非線性”不常用, AD7705的datasheet上說:“16位無失碼”,那就是說明它的微分非線性小於1LSB。
再舉個例子:有一把10厘米的尺子,分度為1mm(分辨率,相當於ADC的1LSB),那總共有100小格(滿量程為100LSB,7位ADC都不到)。
“微分非線性”指的是,每一小格長度和理想的一小格長度(定為1mm)之間的誤差。就是說這把尺子有疏有密,假設這把尺子有些小格的長度分別為: 0.8mm, 0.9mm, 1.0mm,1.1mm,1.3mm。那么 1.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,估計一兩年之內都測不完。