前回Digilent Analog Discovery2のWaveFormsソフトウエアをJavaScript制御、実験自動化ぽいことを実施。今回は前回のプログラムに手を入れて、ダイオードのVf測定モドキ(精度は?だけれども)を行ってみたいと思います。まあその辺の「お求めやすい」DMMでも一撃で測れる値だけれども。
※「お手軽ツールで今更学ぶアナログ」投稿順 indexはこちら
※ 練習している「学習用」万能測定ツールは、Digilent製 Analog Discovery 2です。その制御ソフトウエアはVersion 3.18.1のWaveForms(Windows版)です。WaveFormsのマニュアルの在処は以下です。
前回の被テスト回路(再掲)
前回の回路は以下のような簡単なもんです。プログラムはWaveGen1という端子に電圧を設定し、条件を満たすまで「徐々に」電圧を上げていきます。そのときのチャネル1,2それぞれの電位差を測って記録していきます。チャネル1の方は値が既知の抵抗の両端であるここから回路に流れる電流が計算できる、というもの。
今回実験のJavaScriptコード
Analog Discovery2のScript画面から実行できるソースコードが以下に。前回のコードのチョイ変です。前回と異なるのは、GUIで設定する終了条件が If 電流値[mA]になっていることです。ダイオードのデータシートには Vf を測定するときの If の値が書いてあると思うのでその値を入力します。するとダイオードにかかる電圧を0.05V単位(結構ズボラ)に上げながら電流を測っていき、電流が指定の If 電流を超えたところでループから脱出します。そして、If を超えたところの最後の点と、If を超える直前の「ラス前」の点の電流、電圧から案分(線形)で規定 If 電流のときの電圧(Vf)を推定する、というロジックです。ロジックっていうほどのもんでもないか。いいのかこんなんで?
clear(); print("Estimate diode VF voltage"); if(!('Scope' in this)) throw "Please open a Scope instrument"; Scope.Time.Base.value = 0.01; Scope.Channel1.Range.value = 4.0; Scope.Channel1.Offset.value = 0.0; Scope.Channel2.Range.value = 4.0; Scope.Channel2.Offset.value = 0.0; Wavegen1.Channel1.Simple.Type.text = "DC"; Wavegen1.Channel1.Simple.Offset.value = 0.0; const ch1adj = 0.003; const ch2adj = 0.003; const shuntReg = 100.0; var currentV = 0.1; var stepV = 0.05; var ifcurrent = Tool.getNumber("IF[mA]:",10.0,0.0,20.0,1); var vARRAY = []; var iARRAY = []; var ch1i = 0.0; while (ch1i < ifcurrent) { Wavegen1.Channel1.Simple.Offset.value = currentV; Wavegen1.run(); wait(1); Scope.single(); if(!Scope.wait()) throw "Stopped"; var ch1V = Scope.Channel1.measure("Average") + ch1adj; var ch2V = Scope.Channel2.measure("Average") + ch2adj; vARRAY.push(ch2V); ch1i = ch1V*1000/shuntReg; iARRAY.push(ch1i); print("SET: ", currentV.toFixed(3), "[V]"); print("CH2v: ", ch2V.toFixed(3), "[V]"); print("CH1i: ", ch1i.toFixed(2), "[mA]"); currentV += stepV; } Wavegen1.stop(); File("C:/tmp/vARRAY.csv").write(vARRAY); File("C:/tmp/iARRAY.csv").write(iARRAY); var iLEN=iARRAY.length; if (iLEN > 1) { var iSPN = iARRAY[iLEN-1] - iARRAY[iLEN-2]; var vSPN = vARRAY[iLEN-1] - vARRAY[iLEN-2]; var vfest = vARRAY[iLEN-2] + vSPN * (ifcurrent - iARRAY[iLEN-2])/iSPN; print("VF: ", vfest.toFixed(2), "[V]"); } else { print("ERROR: VF measurement."); }
実験結果その1、1N4148
小信号用のダイオード、1N4148の製品ページ(オンセミ様)が以下に。
データシートを拝見するに、VfはIF=10mAのときに規定されています。
MAX 1.0V
とな。ずいぶん高めだけれどもMAX値だものな。typ. とか min とかには数字が入ってないデス。
手元の「お求めやすい」ハンディDMMの「ダイオード測定」機能で測定したVfは以下です。
0.621V
だいたいIfどれだけ流して測定しているのだか謎ですが、まあ、0.6V付近、常識的な値ね。
さて、IF=10mAとして上記のプログラムで測定した結果が以下に。0.68Vとな。
精度は?
実験結果その2、BAT43
つづいてBAT43っす。こちらは、ショットキーバリアダイオードです。VFはかなり低い?筈。BAT43の製品ページ(STMicroelectronics様)が以下に。
データシート的にいくつかの条件があるのですが、小電流、小電圧の方が測定精度が?であるので、IF=15mAのときの値を参照することにいたしました。やはりMax値のみの規定であります。
MAX 0.45V
これまた、ショットキーバリアダイオードとしては高めの規定ですが、MAXだものねえ。それにIFも15mAと大き目。
ハンディDMMでは
0.23V
とかなり低めの値が読めてます。どれだけIF流しているのか分からんものなあ。
さて、IF=15mAとして上記プログラムで測定した結果が以下に。0.30Vとな。
まあ、精度は?だけれども、ともかくVFの自動測定ができるようになった。怪しいが。