DS1863/DS1865における内部キャリブレーションおよび右シフト処理(スケーラブルダイナミックレンジ)の使用によるADC性能の強化
要約
このアプリケーションノートでは、DS1863/DS1865コントローラ/モニタチップが持つ内部キャリブレーションおよび右シフト処理(スケーラブルダイナミックレンジ)の使用によって、アプリケーションがどのようなメリットを享受することができるかについて検討します。内部キャリブレーションおよび右シフトの実装方法を説明し、具体例によって手順を示します。
はじめに
DS1863およびDS1865コントローラ/監視デバイスは、内部キャリブレーションおよび右シフト処理(スケーラブルダイナミックレンジ)の使用によって内蔵の13ビットADCを大幅に強化し、コストとサイズを増加させることなく、より高い精度と正確性を実現しています。さらに、DS1863/DS1865の内部キャリブレーションは、プログラマブルなスケールとプログラマブルなオフセットの両方を備えており、(一部の例外を除いて)ほとんどの外付け信号コンディショニング回路が不要になります。ADCより前のアナログドメインに設けられたプログラマブルなスケールによって、ADCの全レンジを使用するように入力信号がスケーリングされます。その後のディジタルドメインで右シフト処理を使用することにより、希望する(またはSFF-8472によって要求された) LSBが温存されるように、かつユーザからは透過的な形で、ディジタル出力を除算して元の大きさに戻すことができます。
アナログモニタ入力
図1に、DS1863/DS1865のMON入力のブロック図を示します。明確化のため1つの入力だけを図示してありますが、この概念は4つのMON入力(MON1、MON2、MON3、およびMON4)すべてに該当します。MON入力は、Tx PowerとRx Powerのような信号の監視に使用します。
図1. DS1863/DS1865のMON入力のブロック図
図1から分かるように、DS1863/DS1865のMON端子にはシングルエンドの電圧を印加します。アナログドメイン内で、その電圧がプログラマブルなスケールブロックに供給されます。このスケールブロックによって、希望するLSBまたはフルスケールの電圧が得られるようなMONチャネルのキャリブレーションが可能になっています。フルスケール電圧は、希望するLSB x 2n (nはビット数)です。さらに、スケールブロックが存在することで、小さな入力信号を内部で増幅し、ADCの利用度を最大化することが可能になっています。この手順については、後でさらに詳しく説明します。
スケールブロックの次に位置するのが13ビットのADCです。13ビットの変換結果は左詰めされて2バイト(16ビット)値の形で出力されます。ADCは0000h~FFF8hの範囲のディジタル値を出力することができます。
ADCの後、ディジタル化された信号はさらにユーザプログラマブルなオフセットによって調整されます。このディジタルオフセットを使用して、単純なディジタルの加算を行うことで、内部的に正または負のオフセットを付加することができます。重要な点として、正のオフセットはディジタル値FFF8hでクランプすることに注意してください。負のオフセットは、FFF8hより小さなフルスケールのディジタル値を持つことになります(負のオフセットは変換結果からの減算になるため)。この場合の最小のディジタル値は、0000hでクランプされます。ディジタルオフセットについての詳しい情報は、この後のオフセットレジスタの項に記載してあります。
ディジタル値を出力する前の最後の操作が、右シフト処理です。各MON入力には、希望する右シフト数を制御するための3つのビットが設けられています(右シフトの利点については後で説明します)。3つのビットにゼロをセットすると、右シフト機能が無効化されます。オフセット同様、右シフトもフルスケールのディジタル出力に影響を与えます。たとえば右シフト数を2に設定すると、フルスケールのディジタル出力は3FFEhになります。シフト実行後、ユーザが変換結果の読取りを行う適切なレジスタ(低位メモリ、レジスタ64h~6Bh)に値が書き込まれます。この値は、アラームやウォーニングのための比較にも使用されます。
パスワードアクセスについて
4つのMON入力に対するスケールおよびオフセット値の設定は、DS1863/DS1865のテーブル02hに位置しています。これらの値の読み書きには、レベル2のパスワードアクセス(PW2)が必要になります。PW2レベルエントリのパスワードがパスワード入力バイト(低位メモリ、レジスタ7Bh~7Ehに位置するPEW)に入力されると、このアクセス権が与えられます。
MON入力の出荷時キャリブレーション
DS1863/DS1865の各MON入力は、それぞれフルスケール電圧2.5Vに出荷時調整されています。また、各ディジタルオフセットは、0Vの入力に対してディジタル値0000hが出力されるようゼロに出荷時プログラムされています。右シフトの出荷時デフォルトも0です。図2のグラフBに示すのが、出荷時較正されたDS1863/DS1865の伝達関数であり、これについては後で説明します。
出荷時調整されたデバイスは、0~2.5Vの入力電圧に対して、8192通りのディジタル値のいずれか1つを出力します。このとき、13ビットの変換の分解能は305µV (2.5V/8192)になります。理想的には、ディジタル化すべき入力信号が0~2.5Vの信号なら、このレンジ全体が活用されます。しかし現実のアプリケーションでは、必ずしもそうなるとは限りません。たとえば、受信出力(Rx Power)の場合は0~0.5Vの電圧が一般的であり、したがってディジタル出力コードの80%は使用されないことになります。8192通りのコードを生成する能力を持つ13ビットのADCが、こうして1638通りのコードの中の1つしか出力しないことになるのです。残りの6554種類のディジタルコードは、決して使用されません。しかも、使用される1638通りのコードの分解能は305µVのままです。
13ビットのADCをより有効に活用するためには、DS1863/DS1865のMON値をキャリブレートし直して、フルスケール電圧を0.5Vにする必要があります。しかし、単にMONの値をキャリブレートし直すだけでは、入力信号の問題は解決しません。LSBが変化して、希望のLSBと一致しなくなるためです。結局、ADCから最高の性能を引き出すためには、スケールおよびオフセット値の調整とともに、右シフトを使用する必要があります。
内部キャリブレーションと右シフト処理
内部キャリブレーションと右シフト処理は、モニタ対象の信号が小さく、したがってADCのレンジ全体が使用されない場合に役立ちます。アナログ/ディジタル変換の前にアナログドメインで信号を増幅し、後からディジタルドメインでそれと同じ倍率で割って元に戻すことにより、希望のLSBを維持することができます。右シフト1回ごとに、精度と正確さの両方が2倍に改善します(最大3回まで)。3回の右シフト後は、精度も正確さもそれ以上改善されません。
図2に示す例は、内部キャリブレーションと右シフト処理を使用するメリットを最も良く表しています。グラフAは、電圧と時間を軸にしてモニタ対象の信号の例を示したものです。この信号の例は、0~0.5Vの範囲で変動しています。グラフBとCは、MONの入力電圧とディジタル出力の関係を示したものです。後者の2つのグラフは、出荷時キャリブレーションによる伝達関数と、2回の右シフトを使用して、フルスケール電圧を2.5V / 4 = 0.625Vとした伝達関数の例とを、それぞれ示しています。フルスケール電圧0.625Vということは、無駄になるコードが減少するとともに、結果として変換後の値が2.5Vのフルスケール電圧に比べて4倍の大きさになることを意味しますが、その後これを4 (右シフト2回分)で割って元の大きさに戻します。右シフトの回数と、それによるフルスケール電圧の決定については、この後で検討します。ここで右シフト2回を使っているのは、単に右シフトの例を右シフトなしと比較するためです。使用したデバイスの設定、および各伝達関数に関連する計算について、該当する伝達関数の下にそれぞれ記載してあります。
図2. 右シフトなし(B)と右シフトあり(C)の比較を示すデータ
図2の3つのグラフは、すべて同一のY軸およびスケールで並べて表示してあります。入力信号(グラフA)上の任意の特定点と、それぞれの伝達関数とを通る水平の線を引くことによって、ディジタル出力の大まかな近似値を求めることができます。0~0.5Vの範囲の入力信号の例に戻ると、3つのグラフを通る太い水平線によって0.5Vが示されていますが、グラフBとCを比較することによって右シフトのメリットが分かります。ADCの入力レンジが入力信号よりはるかに広い電圧範囲にわたっている場合、数多くの段階が無駄になります(グラフB参照)。グラフBでは、8192段階の内の1638だけが使用され、残りの80%は無駄になっています。これに対してグラフCでは、内部的なキャリブレーションでフルスケール電圧を小さくし、右シフトを使用することによって、精度が増大しています。この場合、8192通りのディジタルコードの内、6554通りが信号のディジタル化に使用されています。さらに、右シフトの後も希望のLSBが維持されています。右シフト処理は、ユーザからは透過的です。この点は、両方のグラフがほぼ同じディジタル値を出力していることから確認できます。
必要な右シフト回数の決定
アプリケーションにとって必要な右シフトの回数は、フルスケール電圧(内部キャリブレーション)と、特定の入力信号に使用されるディジタルコードの割合との関数になります。(フルスケール電圧に加えて)入力信号の最大電圧が分かっている場合は、予想されるディジタル出力を計算することができます。それ以外の場合は、エンジニアリング評価の期間中に「実地」アプローチを使ってディジタル出力の範囲を決定し、そこから理想的な右シフトの回数を決定することが要求されます。この実地アプローチについて、以下で詳しく説明します。
- 右シフトビットに0をセットします。
- 希望のLSBが得られるように内部キャリブレーションを行います。これによって、フルスケール電圧の初期値が決定されます(このプロセスについては、このアプリケーションノートの後の方で検討します)。
- 最大の入力信号を印加し、それに対するディジタル出力の値を読み取って、使用されているレンジを判定します。
- ADCのレンジの何パーセントが使用されているか判定します。ディジタル値が7FFFhを超えている場合は、右シフトは使用しません(右シフト0回)。しかし、ディジタル値が7FFFhより小さければ、少なくとも1回の右シフトが使用可能です。ディジタル値が3FFFhより小さければ、右シフト2回が使用可能です。以下、この繰り返しになります。これをまとめたのが表1です。
表1. 様々な出力範囲に対して使用すべき右シフトの数
Output Range Used with Zero Right-Shifts Number of Right-Shifts Needed 0h .. FFFFh 0 0h .. 7FFFh 1 0h .. 3FFFh 2 0h .. 1FFFh 3
- 右シフトによって生じるディジタル値の除算を補償するため、アナログドメインにおいて利得を追加し、希望のLSBが維持されるようにする必要があります。この利得の追加は、次の式を使って新しいフルスケール電圧を計算することにより行います。
新しいフルスケール電圧 = フルスケール電圧の初期値 / 2右シフト数
すなわち、ステップ2の内部キャリブレーションの結果フルスケール電圧が2.0Vになり、かつディジタル値が1FFFhより大きく3FFFhを超えない範囲だった場合、右シフトは2回が理想的ということになります。したがって、この例での新しいフルスケール電圧は、2.0V/22 = 0.5Vになります。
- 新しいフルスケール電圧になるよう(まだ右シフトビットには0をセットしたままで)チャネルの内部キャリブレーションを行います。
- 右シフトビットに新しい値をセットします。
評価時に、特定のアプリケーションについて理想的な右シフト数とフルスケール電圧を決定してしまえば、本番のキャリブレーションで必要になるステップは、1、6、および7だけです。
内部キャリブレーションおよび右シフト用レジスタ
各アナログチャネルの内部キャリブレーションおよび右シフトの設定に関するDS1863/DS1865のデバイスレジスタを、表2にまとめました。各MONチャネルの設定用の他、VCCについてもレジスタアドレスを示してあります。VCCを含めたのは表を完全なものにするためですが、実際にはこのアプリケーションノートでは解説していません。ディジタル変換値の場所についても、それぞれの相対位置を表に含めておきました。スケール、オフセット、および右シフトの各レジスタは、メモリテーブル02hの中にあるので注意してください(このアプリケーションノートの表2と混同しないこと)。メモリテーブル02hは、テーブル選択バイト(低位メモリ、レジスタ7Fh)に02hを書き込むことによって選択します。
表2. DS1863/DS1865の内部キャリブレーションおよび右シフト用レジスタ
VCC | MON1 | MON2 | MON3 | MON4 | |
Scale* | 92-93h | 94-95h | 96-97h | 98-99h | 9A-9Bh |
Offset* | A2-A3h | A4-A5h | A6-A7h | A8-A9h | AA-ABh |
Right Shifts* | N/A | 8Eh (b6-b4) | 8Eh (b2-b0) | 8Fh (b6-b4) | 8Fh (b2-b0) |
Readings | 62-63h | 64-65h | 66-67h | 68-69h | 6A-6Bh |
*Table 02h |
スケールレジスタ
スケールレジスタは、入力スイッチトキャパシタ回路の調整によって特定のモニタ対象チャネルの利得/減衰量を決定する2バイトの値です。こうしてスケールレジスタは、ユーザがフルスケール電圧を250mV以下~6.5536Vの範囲で希望する任意の値にキャリブレートすることを可能にします。プロセスの違いやエンドアプリケーションごとに異なる要件に合わせて、このレジスタは必ずキャリブレートする必要があります。このキャリブレーションおよびスケールレジスタに書込む値の決定手順は、この後の内部キャリブレーションの方法の項で説明します。
注:DS1863/DS1865のキャリブレーションに際しては、オフセットレジスタと右シフトレジスタの両方の値を把握していることが重要になります。さもないと、これらの値がゼロでなく、かつ補償されていない場合、デバイスのキャリブレーションが意図通りに行われなくなります。
オフセットレジスタ
オフセットレジスタは、モニタ対象の各入力に適用するディジタルオフセット量を決定する2バイトの値です。DS1863/DS1865のオフセットは、変換後の値に対する単純なディジタルの加算または減算です。したがって、希望の値に合わせてスケールの調整が完了した後(かつ右シフトの有効化よりも前に)、オフセットをプログラムして任意のオフセットの除去またはレンジの移動を行うことができます。
オフセットの計算は、まず変換結果に対して加算または減算するカウントを決定することから始まります。そのための一般的な方法の1つは、ゼロ状態の入力(レーザーオフなど)を適用して、その変換結果を読み取るというものです。このプロセスによって得られる値を、すべての変換結果から減算させることになります。
オフセットレジスタに書き込む値は、希望するカウントを式1に代入することによって計算します。
例1:入力電圧がグランド以外のリファレンスを基準としている場合、このリファレンスを変換結果から減じることができます。リファレンスをMON入力に印加したとき、ディジタル値のカウントが200 (C8h)だったとします。オフセットレジスタを使って、アナログ/ディジタル変換の結果から200 (C8h)を減算し、リファレンスをゼロにすることができます。次式を使って、レジスタに書き込む内容を決定してください。
この場合、減算が行われるということを忘れないでください。そのため、フルスケールのカウント(FFF8h)もC8hだけ減少し、新しいフルスケールのカウントはFF30hになります。
例2:変換結果に200カウントを加算したいとします。この結果は、次式になります。
新しいフルスケールのカウントを計算するため、普通ならFFF8hにC8hを加算(しようと)するところです。しかし、FFF8hは起こりうる最大のディジタル値であるため、フルスケールのカウントはFFF8hのままになります。低い方のカウントは00hではなく、C8hになります。すべての変換結果にこのオフセットが加算されるためです。
例3:ゼロオフセットに対するオフセット値を計算します。
これは、オフセットレジスタの出荷時デフォルトでもあります。
右シフトレジスタ
右シフトレジスタは、テーブル02h、レジスタ8Eh~8Fhに位置しています。MON1~MON4は最大7回の右シフトを実行することができるため、各MON入力について3ビットが必要です。MON1とMON2の設定はテーブル02h、レジスタ8Ehに格納され、MON3とMON4の設定はテーブル02h、レジスタ8Fhに格納されます。各ビットの位置については、データシート中のメモリマップ(または前掲の表1)を参照してください。これらのEEPROMレジスタの出荷時デフォルトは00hであり、右シフト処理が無効化されています。
右シフト処理の結果をさらに詳しく示すため、結果として生じるMONの値の例をいくつか図3に示します。
図3. MONレジスタの右シフト処理の例
内部キャリブレーションの方法
このアプリケーションノートでは、バイナリサーチによるアプローチを検討します。アルゴリズムの出力は、希望の伝達関数、すなわち希望のLSBをもたらすスケールおよびオフセットレジスタの値になります。
このアルゴリズムを使用するためには、2つのことができる必要があります。レーザーを2つの異なる強度、たとえば最弱と最強近く(90%前後)にセットできること、および複数回の繰り返しができることです。光以外のアプリケーションの場合は、命令に応じて2つの異なる電圧をMON入力に印加できなければなりません。このアプリケーションノートで示すアルゴリズムは最大値の90%を使用しているため、「>」 による比較が可能です。しかし、希望するフルスケールのパーセンテージを適用する際には、対応するディジタル値のパーセンテージを計算することが大切です。
擬似コードによる例
スケールを見つけるためのバイナリサーチの説明には、次に示す疑似コードの例を見るのが一番です。
/* Assume that the null input is 0.5V. */ /* Assume that the desired LSB of the lowest weighted bit is 50µV */ Max Reading = 65535 x 50e-6 /* 3.27675 */ CNT1 = 0.5 / 50e-6 /* 10000 */ CNT2 = 0.90 x FS / 50e-6 /* 58981.5 */ /* The null input is 0.5V and the 90% of FS input is 0.9*3.27675 = 2.949075V. */ Set the trim-offset-register to zero Set Right Shift register to zero (typically zero. See Right Shifting section above..) Scale_result = 0h Clamp = FFF8h/2Right_Shift_Register For n = 15 down to 0, Begin scale_result = scale_result + 2n Force the 90% FS input (2.949075V) Meas2 = read the digital result from the part If Meas2 >= Clamp then scale_result = scale_result – 2n Else Begin Force the null input (0.5V) Meas1 = read the digital result from the part If (Meas2 – Meas1) > (CNT2 – CNT1) then scale_result = scale_result – 2n End End Set the Scale register to scale_resultこれでスケールレジスタが設定され、変換の分解能は期待するLSBに対して最適なものとなります。次のステップは、DS1863/DS1865のオフセットのキャリブレーションです。正しいスケール値をスケールレジスタに書き込んだら、再びゼロ入力を端子に印加します。デバイスからディジタルの結果を読み取ります(Meas1)。式1の入力としてCNT1を使用することで、オフセットを計算することができます。
擬似コードの説明
このアルゴリズムは、オフセットおよび右シフトレジスタを既知の状態、具体的にはゼロオフセットとゼロ右シフトに設定することから始まります。この例ではどちらのレジスタにもゼロをセットしていますが、適切に補償を行うならば、他の値を使用することも可能です。たとえば、オフセットをプログラムして開始する場合、FFF8hはクランプされたフルスケールのディジタル値ではないかも知れません(オフセットレジスタの項を参照)。レジスタの初期化の他にも、アルゴリズムの開始時には希望するLSBの関数であるいくつかの重要な定数を計算します。
スケール値を求めるバイナリサーチは、スケールレジスタにハーフスケールである8000hをセットすることから始まります。次に、最大入力の90%をキャリブレート対象のMONチャネルに印加し、それに対応するディジタル変換結果を読み取ることによって、そのスケール値をテストします。この変換結果を、以後Meas2と呼びます。Meas2がクランプされているか、すなわち(オフセットと右シフトがゼロであるため) FFF8hかどうかチェックします。値がクランプされている場合、変換結果が実際にFFF8hなのかもっと大きいのかは断定できません(後者の場合もFFF8hになります)。どちらにしても、スケールの設定が高すぎます。バイナリサーチ式にスケール値を半分にして、クランプが生じないスケール値が見つかるまでこのプロセスを繰り返します。
クランプの生じないMeas2が見つかると、アルゴリズムは直ちに次に進み、ゼロ入力を印加してそのディジタル変換値を読み取ります。この変換値がMeas1になります。最後に、Meas2とMeas1の差分(デルタ)を計算し、アルゴリズムの最初に計算した定数を使って、希望するデルタ(CNT2 - CNT1)との比較を行います。もしMeas2 - Meas1がCNT2 - CNT1より大きければ、またスケールを半分にします。そうではなく、Meas2 - Meas1がCNT2 - CNT1より小さかった場合は、スケールの半分を求め、今度はそれを現在のスケールに足すことによって、スケールを増大させます。このプロセスが、合計16回になるまで繰り返されます。結果は、望ましいスケール(と希望通りのLSB)をもたらす16ビット値になります。
スケールのキャリブレーション手順を具象化する方法は、他にもあります。16ビットのスケールレジスタのMSB (b15)から始めて、そのビットに1をセットします(他のビットはすべて最初に0をセットします)。MSB = 1の状態で、アナログ入力を印加してディジタル出力を読み取るプロセスが実行されます。変換結果がクランプされていた場合は、スケールが高すぎるため、MSBを0に戻します。そうでなければ、MSBは1のままにします。これでMSBが判明したことになります。次に、プロセスは次のビット、b14に移ります。b14に1をセットします(b15には、すでに決定した値をセットします)。ビット13からb0までは、まだ0のままです。これで再びプロセスを実行して、まだ利得が高すぎるかどうかを判定します。高すぎる場合、今度はb14が0になります。高すぎなければ1になります。以下、この手順を1ビットごとに行い、16ビットすべてが決まるまで続けます。この場合も結果は16ビットの値になり、その値によって望ましいスケールが得られます。
望ましいスケールが得られたら、新しいオフセットのキャリブレーションを行うか、またはスケールを0のまま(オフセットなし)にすることができます。キャリブレーションの方法は、オフセット機能をどのように使用するかによって異なります。製品データシート中のアルゴリズムに付随する説明では、ユーザが負のオフセットを適用してディジタル値の基準をゼロに合わせ、アナログのゼロ入力からすべてゼロの出力が得られるようにしたいものと想定しています。これは、単にゼロのアナログ入力を印加して変換結果を読み取ることによって行います。ゼロ入力(たとえばレーザーオフ)から、たとえば20hのようなディジタル出力が得られた場合、すべての変換結果から20hがディジタル的に減算されるようにオフセットをプログラムすることができます。この例で言えば、オフセットの式に20hを代入し、その結果の値を、お望みのMONチャネルのオフセットレジスタにプログラムします。
内部キャリブレーションと右シフト処理の例
次の例は、このアプリケーションノートで説明した概念を最も分かりやすく示すために用意したものです。
この例では、MON3を使用してRx Powerのモニタを行います。入力の最小値である-40dBmを印加したとき、10mVの電圧がMON3端子に発生します。この入力に対する望ましいディジタル出力は0000hです。0dBmの入力を印加すると、MON3に300mVが発生します。この場合の望ましいディジタル出力は2710hであり、SFF-8472が規定するLSBを満たすものとして選択されました(Rx PowerのLSBは0.1µW)。
望ましいディジタル出力の範囲がすでに与えられているため(0000h~2710h)、この例について理想的な右シフト数を判定するのは比較的簡単です。前掲の表1を使用すると、理想的な右シフト数は2になります。2710hが2回の右シフト後の最終的な出力になるためには、300mVの入力に対する右シフト前の変換結果として9C40hが得られる必要があると結論することができます。したがって、内部キャリブレーションを使用して300mVの入力に対する変換結果を9C40hに「増幅」することになります。内部キャリブレーションとオフセットのプログラムが完了したら、2回の右シフトを有効化します。以上の例を、表3にまとめてあります。
表3. 内部キャリブレーションと右シフト処理の例
Customer Signal Rx Power (dBm) | Voltage Applied to MON3 Pin (mV) | Digital Outputs During Cal. (0 Right Shifts) (hex) | Final Digital Output (2 Right Shifts) (hex) |
-40 | 10 | 0000 | 0000 |
50 | 0563 | ||
100 | 0C1F | ||
150 | 12DB | ||
200 | 1997 | ||
250 | 2051 | ||
0 | 300 | 9C40 | 2710 |
入力と出力の間の関係が決定したら(表3参照)、データシートで提供されている内部キャリブレーション用ルーチンを使用してデバイスの内部キャリブレーションを行います。このルーチンは、まず最初に以下で示す若干の事前計算を実行します。第2のキャリブレーションポイント(300mV = 9C40h)がすでにフルスケール値の90%より小さいため、ここではデータシートのルーチンに示された90%という値を使用していないことに注意してください。
表3から、以下の計算が行われます。
LSB = (0.300V – 0.010V) / (9C40h – 0000h) = 0.290V/40,000 = 7.25µV
Max Reading = LSB x 65535 = 7.25µV x 65535 = 0.475128V
CNT1 = 0.010/LSB = 1379.3 => 1379 (dec)
CNT2 = 0.300/LSB = 41379.31 => 41379 (dec)
CNT1とCNT2が、2つのキャリブレーションポイントを印加したときに期待される(望ましい)ディジタル出力です。内部キャリブレーションルーチンは繰り返し処理によって、この2つの値で決まるスロープにできる限り近いスロープを探します。
ルーチンの繰り返し部分では、バイナリサーチ方式で16回にわたってスロープをプログラムし、それが望ましいスロープと等価かどうかチェックを行います。この例については、内部キャリブレーション手続きを使ってDS1863/DS1865のキャリブレーションを行っています。16回の繰り返しすべての入力と出力を表4に示します。
表4の最初の列(Iteration)は、ルーチン内のnに相当します。scale_resultの列は、それぞれの繰り返しにおいて、スケールレジスタ(デバイステーブル02h、レジスタ98~99h)にプログラムされる値です。Meas2とMeas1の列は、それぞれ300mVと10mVを入力に印加したときにデバイスから読み取られたディジタル値です。最後に、Meas2がクランプされなかった回について、Meas2 - Meas1とCNT2 - CNT1の比較を行います。Meas2 - Meas1がCNT2 - CNT1よりも大きい場合は、scale_resultが大きすぎたことを示します。その回に相当するスケールビットはゼロになり、それによって次の回のscale_resultが決まります。16回の繰り返しがすべて完了したところで、スケール値が判明します。この例で使用したデバイスの場合、結果のスケール値は5038hになりました。
表4. 実際の内部キャリブレーション値
表4から、Iterationが3のとき(Meas2 - Meas1とCNT2 - CNT1の両方が40000)、最小のデルタに到達したことが分かります。ユーザはこのアルゴリズムに変数を1つ追加して、どの回で最小のデルタに達したかをチェックし、最終的な値の代わりにその回のscale_resultの値をスケールレジスタの値として使うことができます。
デバイスに新しいスケール値をプログラムした状態で、10mV (変換結果を0000hにしたい電圧)を印加してディジタル変換の結果を読み取ることによって、オフセットを決定することができます。この例で使用したデバイスの場合、10mVを印加すると0558hという値が出力されました。オフセットの公式(式1)を使用して、次のようにオフセットを計算します。
MON3のオフセット = - (-0558h/4) = 0156h
最後に、新しいクランプ値は次のように計算することができます。
新しいクランプ値(右シフト前) = FFF8h - 0558h = FAA0h
内部キャリブレーションが完了したところで、テーブル02h、レジスタ8Fhに20hを書き込むことによって2回の右シフトを有効化します。
結論
DS1863/DS1865の内部キャリブレーションおよび右シフト機能は、最大の柔軟性を提供し、デバイスを幅広いアプリケーションに適合させます。このアプリケーションノートでは、DS1863/DS1865のデータシートには記載されていない情報、具体的には、内部キャリブレーションおよび右シフトが役立つ理由およびそれらの実装方法に関する情報を提供しています。それぞれの概念を1つに結び付け、内部キャリブレーションの手順の中でDS1863/DS1865から読み取られる実際のデータを示すために、実例も用意しました。
このアプリケーションノートに関するご質問/ご意見/ご提案は、次のアドレスまでお送りください(英語のみの対応となります):