1、INL精度(Interger Nonliner,Linearity error),積分線性度:ADC在所有的數值點上對應的模擬值和真實值之間誤差最大的那一點的誤差值。即輸出偏離線性的最大距離,單位LSB。
說明:理解為單值數據誤差,對應該點模擬數據由於元器件及結構造成的不能精確測量產生的誤差。
例子:比如12位ADC:假設基准Vref=4.095V,那么1LSB=Vref/2^12=0.001V。如果精度為1LSB,則它單值測量誤差0.001V*1=0.001,比如測量結果為1.000V,實際在1.000+/-0.001V范圍。如果精度為8LSB,則它的單值測量誤差0.001*8=0.008V,假如結果為1.000V,實際在1.000+/-0.008范圍。
2、DNL(Differential Nonlinear),差分非線性值,理解為刻度間的差值,即對每個模擬數據按點量化,由於量化產生的誤差。
例子:比如12位ADC,假設基准vref=4.095V,那么1LSB=Vref/2^12=0.001V.不考慮精度,即精度為0LSB。沒有單值誤差。如果DNL=3LSB=0.001V*3=0.003V,假設A實際電壓為1.001V,B實際電壓為1.003V。理論上A點讀數1.001/1LSB=1001,B點讀數1.003V/1LSB=1003,B-A=2,B>A,但由於DNL=3LSB=0.003V,模擬數據間的量化誤差有0.003V,那么B-A會在-1(2-3=-1)到+5(2+3=5)之間的某一個數。
注:要保證沒有丟碼和單調的轉移函數,ADC的DNL必須小於1LSB。
3、ADC的動態范圍:動態范圍=20*log(最大的數/最小的數)
ADC的轉換位數決定動態范圍,由於AD轉換器的位數限制,一般輸入信號的動態范圍都比較小。
14位,動態范圍=20log(2^14/1)=84.29db
4、matlab算法:
clear
clf
% %----------------------------------------------------------
format long e
a=textread('FMD-1222-5000n-V3-1-nofib-no-light.txt','%s');%以字符形式打開文件
c=hex2dec(a)'; %16進制轉化為10進制數,存入alpha矩陣
%mm=2^10;
mm=2^10;
x=round(c);
b=sort(x);
k=zeros(mm,1);
for i=1:mm,
for j=1:length(b),
if (b(j)==i-1)
k(i)=k(i) + 1;
end
end
end
avg=(length(b)-k(1)-k(mm))/(mm-2);
k(1)=avg;
k(mm)=avg;
inl=zeros(mm-1,1);
dnl=zeros(mm-1,1);
for i=1:length(k),
dnl(i)=(k(i)-avg)/avg;
end
for i=2:length(dnl),
inl(1)=dnl(1);
inl(i)=dnl(i)+inl(i-1);
end
tt=0:mm-1;
subplot(2,1,1);plot(tt,dnl);
title('DNL OF ADC FMD-1222-5000n-V3-1-nofib-no-light 10Khz');
xlabel('decimal code');
ylabel('DNL(LSB)');
axis([0 1200 -1 2]);
grid on;
附錄:
摘錄,有助於理解INL和DNL:
對ADC(DAC)的線性度(INL和DNL)的一點理解
作者:xjb37
大家在使用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,估計一兩年之內都測不完。