差動出力、電流モードディジタル-アナログコンバータ(DAC)のリニアリティの測定

2008年05月22日
myAnalogに追加

myAnalog のリソース セクション、既存のプロジェクト、または新しいプロジェクトに記事を追加します。

新規プロジェクトを作成

要約

ディジタル-アナログコンバータ(DAC)のリニアリティの測定は、単純なタスクではありません。誤差には、熱作用、グランドループ、および計測器精度を含む、多数の潜在的なソースがあります。また、10ビットを超えるディジタル分解能を持つDACの完全リニアリティ測定は、ベンチ計測器で時間のかかる可能性があります。このアプリケーションノートは、誤差を最小限に抑え、これらの試験を迅速に実行する方法について示します。

注:マキシムは、さまざまな分解能の電流出力DACを数多く製造しています。このアプリケーションノートでは、MAX5891が、測定と規格の特定の例として使用されています。ただし、パラメータと技法は、多くの他の差動出力、電流モードDACにも適用することができます。

リニアリティパラメータの概要

データコンバータのリニア精度を定義するために、積分非リニアリティ(INL)と微分非リニアリティ(DNL)という、2つの主な規格が使用されています。INLは、出力伝達関数の理想直線からの偏差です。DNLは、コンバータ出力のステップサイズの、理想ステップサイズからの誤差を指します。

INLは、(1) エンドポイントINL、または(2)ベストフィットINLという、2つの技法の1つを使用して指定することができます。エンドポイントINLは、DAC伝達曲線のエンドポイントで測定される実効値がコンバータのリニアリティの計算に使用されることを意味します。他方、ベストフィットINLは、ピーク値が報告されるINLを最小化する伝達曲線のスロープを計算します。

Figure 1a. End-point integral linearity error.
図1a. エンドポイント積分リニアリティ誤差

Figure 1b. Best-fit integral linearity error.
図1b. ベストフィット積分リニアリティ誤差

図1a図1bは、2つの方式が特定の伝達関数にどのように関連するかをグラフで示しています。両方の方式で、DAC伝達関数の曲線のサイズと形状が同じであることに注意してください。また、エンドポイントリニアリティを使用する図1aは、負の誤差がない大きい正のINLを持っていることにも注意してください。

図1bに示すようなベストフィット方式を適用すると、正の誤差の一部を直線の負側に移動することによって、報告される最大INLが低くなります。リニアリティ誤差の合計強度が直線計算と同じ状態を維持することに注意してください。

DNL規格は、最下位ビット(LSB)の重みの決定方法がDNLに影響する可能性がありますが、解釈があまり自由でありません。DACのDNLに対する1つの懸念は、LSBが-1より小さいDNLを持つコードが存在しない点です。このレベルを下回るDNL誤差は、デバイスが非単調性であることを示します。DACは、入力コードの増加時に出力が減少しない場合、または入力コードの減少時に出力が増大しない場合、単調性です。図2は、正および負のDNL誤差を示し、単調性の概念を明確にしています。

リニアリティの測定に使用される方式は、評価対象のDACのアーキテクチャを考慮する必要があります。電流モードDACの出力を電圧に変換することが推奨されます。これによって、電流計でなく電圧計の使用が可能になるためです。標準的なマルチメータは、電流より電圧を測定するときに、より大きな分解能を持ちます。電流ソースの設定は、デバイスの性能の正確な評価を得るために測定する必要があるコードの数を決定します。

Figure 2. Example of DNL errors.
図2. DNL誤差の例

電流(I)の電圧(V)への変換は、多くの方法で実行することができますが、いくつかの要素によって決まります。真っ先に考慮すべき1つは、測定に使用されるマルチメータです。利用可能な機器の最大分解能は、精密測定に必要な最大LSB重みを決定します。LSB重み-メータ分解能の推奨比は、100:1です。この場合、メータは、LSBの1/100を測定することができます。

試験対象の特定のDACの出力コンプライアンス定格も、I-V変換の実行方法に影響します。電流モードDACの出力コンプライアンスは、性能への影響なしに、出力の電圧に耐えるデバイスの性能です。負荷抵抗が増加すると電圧振幅とLSBサイズが増加しますが、コンプライアンス定格は最大負荷を制限します。

単純な抵抗変換に代わる別の方法は、仮想グランド設定におけるオペアンプの使用です(図3参照)。この設定の利点は、DAC出力の電圧がゼロに保持されるため、それ以外の場合にコンプライアンス制限が許容する値より大幅にLSBサイズを増加する性能です。ただし、アンプのコンプライアンスとリニアリティは、温度勾配とともに、測定値に影響する可能性があります。また、2個のマッチングされたアンプも、差動出力デバイスを測定するために必要となります。

Figure 3. Virtual-ground I-to-V conversion.
図3. 仮想グランドI-V変換

リニアリティを測定する場合のもう1つの考慮事項は、評価対象のDACの分解能です。デバイスの分解能が高いほど、生成されるLSBサイズが小さくなります。MAX5891 (16ビット)、MAX5890 (14ビット)、およびMAX5889 (12ビット)デバイスを考えてみます。これらのデバイスは、それぞれ、20mAフルスケールを出力します。LSBサイズは、50Ω負荷を使用した場合、それぞれ、15.25µV、61.04µV、および244.2µVです。LSBサイズが小さいほど、マルチメータに必要な精度と分解能は高くなります。

DACの分解能に関しては、デバイス性能を高精度に測定するために必要なコードの数も決定する必要があります。16ビットデバイスの可能な入力コードの数は、65,536個で、12ビットデバイスは4,096個です。それらのすべてをマニュアルで測定することは実行不可能でないため、一般的な技法はコードサブセットを測定することです。コードの数が少ないと、データの収集に要する時間が短縮されながら、非常に高精度な結果が提供されます。デバイスのアーキテクチャの知識は、特定のデバイスに設定された最適コードを選択する上で役立ちます。

温度作用は、電流出力デバイスのリニアリティの測定時に重要となる可能性があります。出力負荷抵抗で損失される電力によって、抵抗は温度が上昇し、これによって抵抗値が変化します(抵抗が0ppm温度係数で使用されない限り)。これに有効な1つの方式は、負荷で損失される電力の平均を効果的に供給する方法で入力コードを切り替える方式です。

この技法は、任意のコードにおける滞在時間を最小化することができるため、自動測定に最適です。0x4800、0xB7FFなどのように、各コードとその補数が測定されます。各コードおよびその補数を測定することによって、平均電力は、負荷内で一定に維持されます。最上位(MSB)入力は、ゼロスケールからフルスケールまでのランプ方法で測定されます。LSBがミッドスケールで測定されるため、この技法は、電力の変化が相対的に小さいため、LSBに適用されません。

測定の詳細

以下は、Maxim Integratedがいくつかのデバイスの開発時に使用したリニアリティ測定方法です。MAX5873MAX5875MAX5885MAX5888、MAX5891、MAX5895、およびMAX5898の各デバイスはすべて、この方法を使用して測定されています。初期の設計評価時と生産試験方式の検証時に、実験測定が実施されました。次の例はMAX5891に固有であるのに対し、この方法は他のデバイスにも適用することができます。

MAX5891デバイスは、5-4-3-4セグメンテーションアーキテクチャを採用しています。セグメンテーションは、1個の16ビットデバイスを4個の個別のDAC (5ビット、4ビット、3ビット、および2個の4ビットデバイス)に分割する効果的な分割です。5個のMSBは、5ビットの可能な入力コードごとに1つ、31 (25 - 1)等価に重み付けされた電流ソースで構成されます。次の4ビットは、15のソースを使用し、次の3ビットは7のソースを使用します。4個のLSBは、バイナリに重み付けされた電流ソースで、各下位ビットは前のビットの値の半分に等価です。

電流ソースの合計数、つまり、57 (31 + 15 + 7 + 4)プラスフルスケールおよびゼロスケールは、MAX5891のリニアリティの測定に必要なコードの最小数を決定します。これらの59の測定値によって、完全DAC出力伝達関数を再構成することができます。伝達関数が決定されると、リニアリティを計算することができます。この技法の弱点は、試験時間の短縮のトレードオフとして、精度が低下する可能性があることです。表1は、MAX5891に推奨されるコードセットを示しています。

表1. 5-4-3-4アーキテクチャ用の16ビットコードセット

Measurement Code
(HEX)
Measurement Code
(HEX)
Measurement Code
(HEX)
1 0x0000 21 0x8500 41 0x7000
2 0x8001 22 0x8580 42 0x7800
3 0x8002 23 0x8600 43 0x8000
4 0x8004 24 0x8680 44 0x8800
5 0x8010 25 0x8700 45 0x9000
6 0x8020 26 0x8780 46 0x9800
7 0x8030 27 0x0800 47 0xA000
8 0x8040 28 0x1000 48 0xA800
9 0x8050 29 0x1800 49 0xB000
10 0x8060 30 0x2000 50 0xB800
11 0x8070 31 0x2800 51 0xC000
12 0x8080 32 0x3000 52 0xC800
13 0x8100 33 0x3800 53 0xD000
14 0x8180 34 0x3800 54 0xD800
15 0x8200 35 0x4000 55 0xE000
16 0x8280 36 0x4800 56 0xE800
17 0x8300 37 0x5000 57 0xF000
18 0x8380 38 0x5800 58 0xF800
19 0x8400 39 0x6000 59 0xFFFF
20 0x8480 40 0x6800    

MAX5890その他のマキシム14ビットデバイスは、5-4-3-2セグメンテーションアーキテクチャを使用しています。14ビットアーキテクチャのコードセットは、表2のとおりです。MAX5889その他のマキシム12ビットデバイスは、5-4-3セグメンテーションアーキテクチャを使用しています。12ビットアーキテクチャのコードセットは、表3のとおりです。

表2. 5-4-3-2アーキテクチャ用の14ビットコードセット

Measurement Code
(HEX)
Measurement Code
(HEX)
Measurement Code
(HEX)
1 0x0000 29 0x2140 39 0x1C00
2 0x2001 21 0x2160 40 0x1E00
3 0x2002 22 0x2180 41 0x2000
4 0x2004 23 0x21A0 42 0x2200
5 0x2008 24 0x21C0 43 0x2400
6 0x200C 25 0x21E0 44 0x2600
7 0x2010 26 0x0200 45 0x2800
8 0x2014 27 0x0400 46 0x2A00
9 0x2018 28 0x0600 47 0x2C00
10 0x201C 29 0x0800 48 0x2E00
11 0x2020 30 0x0A00 49 0x3000
12 0x2040 31 0x0C00 50 0x3200
13 0x2060 32 0x0E00 51 0x3400
14 0x2080 33 0x1000 52 0x3600
15 0x20A0 34 0x1200 53 0x3800
16 0x20C0 35 0x1400 54 0x3A00
17 0x20E0 36 0x1600 55 0x3C00
18 0x2100 37 0x1800 56 0x3E00
19 0x2120 38 0x1A00 57 0x3FFF

表3. 5-4-3アーキテクチャ用の12ビットコードセット
Measurement Code
(HEX)
Measurement Code
(HEX)
Measurement Code
(HEX)
1 0x000 20 0x860 39 0x800
2 0x801 21 0x868 40 0x880
3 0x802 22 0x870 41 0x900
4 0x803 23 0x878 42 0x980
5 0x804 24 0x080 43 0xA00
6 0x805 25 0x100 44 0xA80
7 0x806 26 0x180 45 0xB00
8 0x807 27 0x200 46 0xB80
9 0x808 28 0x280 47 0xC00
10 0x810 29 0x300 48 0xC80
11 0x818 30 0x380 49 0xD00
12 0x820 31 0x400 50 0xD80
13 0x828 32 0x480 51 0xE00
14 0x830 33 0x500 52 0xE80
15 0x838 34 0x580 53 0xF00
16 0x840 35 0x600 54 0xF80
17 0x848 36 0x680 55 0xFFF
18 0x850 37 0x700    
19 0x858 38 0x780    

コードセットが定義されたら、今度は、測定の収集方法を検討する必要があります。これらの測定に推奨されるマルチメータは、Agilent™ 3458で、8.5桁の分解能を備えています。メータは、50Ω負荷でグランドに終端される、MAX5891のOUTPおよびOUTN端子の間に接続されます。DACが20mAフルスケール電流に設定された場合、メータ入力における結果の電圧振幅は±1Vです。

メータ範囲は、最大分解能を持つ固定1.2Vフルスケール範囲に設定され、最小測定は10nVとなります。スイッチングメータ範囲は、利得誤差を測定値に追加する可能性があります。そのため、単一の電圧範囲を使って、この追加の誤差ソースを除去します。また、ディジタル入力がラッチされるため、クロック信号もMAX5891に必要です。メータ、クロックソース、電源電圧、およびディジタル入力制御が接続されると、リニアリティの測定を収集する準備が整います。

すべての測定ポイントが収集された後、再構成されたDAC出力の伝達曲線を作成する必要があります。各個々の電流ソースが測定されたため、すべてのコードの伝達関数を簡単に作成することができます。たとえば、4個のLSBのデバイスを考えてみます。コード0x8000、0x8001、0x8002、0x8004、および0x8008が測定されました。コード0x8000、DACのミッドスケールは、LSB計算のリファレンスです。LSBの重みは、0x8001で測定された電圧から、0x8000で測定された電圧を引いたものです。

同様の式は、0x8001と0x8780の間で測定されたすべてのコードに適用されます。残りのポイント、0x0800~0xF800は、MSB電流ソースで、コード0x0000への参照で計算されます。コード0x4F31をさまざまな電流の加算方法の例として考えてみます。

まず、サンプルコードに等しい測定ポイント(ともに追加された場合)を決定する必要があります。0x4800は、ターゲットコードより小さい最高のMSBコードです。0x4800を0x4F31から引いた剰余は、0x0331です。コード0x0300は、引くことができる次に最高コード(0x8300 - 0x8000)で、その後に、0x0030 (0x8030 - 0x8000)、最後に0x0001 (0x8001 - 0x8000)の順で続きます。

したがって、コード0x4F31の電圧は次の式で表すことができます。

[V(0x4800) - V(0x0000)] + [V(0x8300) - V(0x8000)] + [V(0x8030) - V(0x8000)] + [V(0x8001) - V(0x8000)](式1)

同様の式を使用し、任意の与えられた入力コードの電圧を計算することができます。MATLAB®またはExcel®ソフトウェアなどのツールを使って、すべてのコードの電圧を容易に計算し、DAC伝達曲線全体を再構成することができます。

伝達曲線が得られたら、リニアリティを計算することができます。最初のステップは、伝達曲線のエンドポイントに基づいてLSBの電圧を計算することです(エンドポイント方式)。

VLSB = [V(0xFFFF) - V(0x0000)]/[2N - 1](式2)

ここで、各項目は以下を表します。
N:デバイス分解能(16、14、または12ビット)
V(0x0000):測定されるDACのゼロスケール出力電圧
V(0xFFFF):測定されるDACのフルスケール出力電圧

任意の特定コードのINLは、次の式で計算されます。

INLCODE(LSBs) = [VCODE - (CODE × VLSB)]/VLSB(式3)

ここで、各項目は以下を表します。
CODE:計算対象のディジタルコード
VLSB:式2で計算された電圧
VCODE:計算されるDAC出力電圧

以下は、任意の与えられたコードのDNLを計算する式です。

DNLCODE(LSBs) = [VCODE - VCODE-1 - VLSB]/VLSB(式4)

ここで、各項目は以下を表します。
CODE:計算対象のディジタルコード
VCODE:CODEの計算されるDAC出力電圧
VCODE-1:CODE - 1で計算されるDAC出力電圧
VLSB:式2で計算される電圧

以下は、MAX5889、MAX5890、およびMAX5891のリニアリティを計算するMATLABサンプルスクリプトです。それぞれ、最小と最大のDNLとINL誤差のコードと値を返します。また、すべての可能なコードの伝達曲線、INL、およびDNLを示すプロットも生成します。ユーザは、前の表で示されたコードの電圧測定値を入力する必要があります。各値は、リスト順に入力される必要があります。

16ビットリニアリティを計算するMATLABスクリプト


function Lin16(Measurements)
%Calculate INL and DNL of a 16-bit device with a 5-4-3-4 segmentation architecture
 
% DacCodes is the range of possible input data to the 16-bit DAC
DacCodes=[0:65535]';
 
%VOUT for each code is calculated from the measured points
%create a VOUT variable and fill it with zeros
VOUT=zeros(size(DacCodes));
 
%The first measurement is the zero-scale point, or code (0x0000)
ZS=Measurements(1);
VOUT(1)=ZS;
 
%The last measurement is the full-scale point, or code (0xFFFF)
FS=Measurements(length(Measurements));
VOUT(65536)=FS;
 
%Midscale is stored at position 43 of the input data array
MS=Measurements(43);

%The device has four segmentation levels
Segments=4;
 
%The decimal values for the LSB codes are 1, 2, 4 and 8
Seg1Codes=[1;2;4;8];
 
%The voltages for the LSBs are in positions 2–5 of the input array
for i=1:4
    Seg1V(i)=Measurements(i+1)-MS;
end
 
%The second level of segmentation is controlled with input codes 16 through
%112 in steps of 16. Create the code array and fill the measurements for
%this segmentation level
Seg2Codes=[16:16:16*7]';
for i=1:7
    Seg2V(i)=Measurements(i+5)-MS;
end
 
%Segmentation level 3 uses input codes 128 through 1920 in steps of 128.
%Create the code array and fill the measurements array.
Seg3Codes=[128:128:128*(2^4-1)]';
for i=1:15
    Seg3V(i)=Measurements(i+12)-MS;
end
 
%Segmentation level 3 uses input codes 2048 through 63,488 in steps of 2048.
%Create the code array and fill the measurements array.
Seg4Codes=[2048:2048:2048*(2^5-1)]';
for i=1:31
    Seg4V(i)=Measurements(i+27)-ZS;
end
 
%The endpoints have been defined, now fill in the voltages for the
%remaining points of the DAC transfer function.
for i = 2:65535
    targetcode=i-1;
    VOUT(i)=ZS;
    for s=31:-1:1
       if Seg4Codes(s)<=targetcode
            targetcode=targetcode-Seg4Codes(s);
            VOUT(i)=VOUT(i)+Seg4V(s);
            s=0;
       end
    end
    for s=15:-1:1
       if Seg3Codes(s)<=targetcode
            targetcode=targetcode-Seg3Codes(s);
            VOUT(i)=VOUT(i)+Seg3V(s);
            s=0;
       end
       if targetcode==0
            s=0;
       end
    end
    for s=7:-1:1
       if Seg2Codes(s)<=targetcode
            targetcode=targetcode-Seg2Codes(s);
            VOUT(i)=VOUT(i)+Seg2V(s);
            s=0;
        end
       if targetcode==0
             s=0;
       end
    end
    if targetcode==0
            s=0;
    end
    for s=4:-1:1
       if Seg1Codes(s)<=targetcode
           targetcode=targetcode-Seg1Codes(s);
           VOUT(i)=VOUT(i)+Seg1V(s);
       end
    end
end
 
%Plot the transfer function
figure(1)
plot(DacCodes, VOUT);
xlabel('DAC Input Code');
ylabel('Measured Voltage');
axis([0 65536 -1.1 1.1]);
title('DAC Transfer Function');
set(gca,'XTick',0:16384:65536)
 
%Calculate the linearity
LSB=(max(VOUT)-min(VOUT))/65535;
INL(1)=0;
DNL(1)=0;
for i=2:65536
    INL(i)=(VOUT(i)-(VOUT(1)+(i-1)*LSB))/LSB;
    DNL(i)=(VOUT(i)-VOUT(i-1)-LSB)/LSB;
end
 
%Plot INL
figure(2)
plot(DacCodes, INL);
title('DAC Integral Linearity');
xlabel('DAC Input Code');
ylabel('INL (LSBs)');
axis([0 65536 min(INL)*1.1 max(INL)*1.1]);
set(gca,'XTick',0:16384:65536)
 
%Plot DNL
figure(3)
plot(DacCodes, DNL);
title('DAC Differential Linearity');
xlabel('DAC Input Code');
ylabel('DNL (LSBs)');
axis([0 65536 min(DNL)*1.1 max(DNL)*1.1]);
set(gca,'XTick',0:16384:65536)
txtstr=sprintf('INL MAX = %f', max(INL));
disp (txtstr);
txtstr=sprintf('INL MIN = %f', min(INL));
disp (txtstr);
txtstr=sprintf('DNL MAX = %f', max(DNL));
disp (txtstr);
txtstr=sprintf('DNL MIN = %f', min(DNL));
disp (txtstr);

16ビットスクリプトによって生成されたサンプルプロット

Example 1

Example 2

Example 3

最新メディア 20

Subtitle
さらに詳しく
myAnalogに追加

myAnalog のリソース セクション、既存のプロジェクト、または新しいプロジェクトに記事を追加します。

新規プロジェクトを作成