要約
ディジタル-アナログコンバータ(DAC)のリニアリティの測定は、単純なタスクではありません。誤差には、熱作用、グランドループ、および計測器精度を含む、多数の潜在的なソースがあります。また、10ビットを超えるディジタル分解能を持つDACの完全リニアリティ測定は、ベンチ計測器で時間のかかる可能性があります。このアプリケーションノートは、誤差を最小限に抑え、これらの試験を迅速に実行する方法について示します。
注:マキシムは、さまざまな分解能の電流出力DACを数多く製造しています。このアプリケーションノートでは、MAX5891が、測定と規格の特定の例として使用されています。ただし、パラメータと技法は、多くの他の差動出力、電流モードDACにも適用することができます。
リニアリティパラメータの概要
データコンバータのリニア精度を定義するために、積分非リニアリティ(INL)と微分非リニアリティ(DNL)という、2つの主な規格が使用されています。INLは、出力伝達関数の理想直線からの偏差です。DNLは、コンバータ出力のステップサイズの、理想ステップサイズからの誤差を指します。
INLは、(1) エンドポイントINL、または(2)ベストフィットINLという、2つの技法の1つを使用して指定することができます。エンドポイントINLは、DAC伝達曲線のエンドポイントで測定される実効値がコンバータのリニアリティの計算に使用されることを意味します。他方、ベストフィットINLは、ピーク値が報告されるINLを最小化する伝達曲線のスロープを計算します。
図1a. エンドポイント積分リニアリティ誤差
図1b. ベストフィット積分リニアリティ誤差
図1aと図1bは、2つの方式が特定の伝達関数にどのように関連するかをグラフで示しています。両方の方式で、DAC伝達関数の曲線のサイズと形状が同じであることに注意してください。また、エンドポイントリニアリティを使用する図1aは、負の誤差がない大きい正のINLを持っていることにも注意してください。
図1bに示すようなベストフィット方式を適用すると、正の誤差の一部を直線の負側に移動することによって、報告される最大INLが低くなります。リニアリティ誤差の合計強度が直線計算と同じ状態を維持することに注意してください。
DNL規格は、最下位ビット(LSB)の重みの決定方法がDNLに影響する可能性がありますが、解釈があまり自由でありません。DACのDNLに対する1つの懸念は、LSBが-1より小さいDNLを持つコードが存在しない点です。このレベルを下回るDNL誤差は、デバイスが非単調性であることを示します。DACは、入力コードの増加時に出力が減少しない場合、または入力コードの減少時に出力が増大しない場合、単調性です。図2は、正および負のDNL誤差を示し、単調性の概念を明確にしています。
リニアリティの測定に使用される方式は、評価対象のDACのアーキテクチャを考慮する必要があります。電流モードDACの出力を電圧に変換することが推奨されます。これによって、電流計でなく電圧計の使用が可能になるためです。標準的なマルチメータは、電流より電圧を測定するときに、より大きな分解能を持ちます。電流ソースの設定は、デバイスの性能の正確な評価を得るために測定する必要があるコードの数を決定します。
図2. DNL誤差の例
電流(I)の電圧(V)への変換は、多くの方法で実行することができますが、いくつかの要素によって決まります。真っ先に考慮すべき1つは、測定に使用されるマルチメータです。利用可能な機器の最大分解能は、精密測定に必要な最大LSB重みを決定します。LSB重み-メータ分解能の推奨比は、100:1です。この場合、メータは、LSBの1/100を測定することができます。
試験対象の特定のDACの出力コンプライアンス定格も、I-V変換の実行方法に影響します。電流モードDACの出力コンプライアンスは、性能への影響なしに、出力の電圧に耐えるデバイスの性能です。負荷抵抗が増加すると電圧振幅とLSBサイズが増加しますが、コンプライアンス定格は最大負荷を制限します。
単純な抵抗変換に代わる別の方法は、仮想グランド設定におけるオペアンプの使用です(図3参照)。この設定の利点は、DAC出力の電圧がゼロに保持されるため、それ以外の場合にコンプライアンス制限が許容する値より大幅にLSBサイズを増加する性能です。ただし、アンプのコンプライアンスとリニアリティは、温度勾配とともに、測定値に影響する可能性があります。また、2個のマッチングされたアンプも、差動出力デバイスを測定するために必要となります。
図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がいくつかのデバイスの開発時に使用したリニアリティ測定方法です。MAX5873、MAX5875、MAX5885、MAX5888、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の電圧は次の式で表すことができます。
(式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ビットスクリプトによって生成されたサンプルプロット
{{modalTitle}}
{{modalDescription}}
{{dropdownTitle}}
- {{defaultSelectedText}} {{#each projectNames}}
- {{name}} {{/each}} {{#if newProjectText}}
-
{{newProjectText}}
{{/if}}
{{newProjectTitle}}
{{projectNameErrorText}}