お手軽ツールで今更学ぶアナログ(150) WaveForms、実験自動化最初の一歩?

Joseph Halfmoon

『StudentZone』2月号の日本語記事がアップされるまでの「つなぎ」として、Digilent AD2、WaveFormsのScript制御の練習を続けてまいりたいと思います。いよいよ今回は実験自動化っぽいことをやってみます。印加するDC電圧をプログラムで制御しながら、そのときの電流、電圧を測定するだけのもの。

※「お手軽ツールで今更学ぶアナログ」投稿順 indexはこちら

※ 練習している「学習用」万能測定ツールは、Digilent製 Analog Discovery 2です。その制御ソフトウエアはVersion 3.18.1のWaveForms(Windows版)です。WaveFormsのマニュアルの在処は以下です。

WaveForms Reference Manual

測定対象の実機をアップデート

測定対象の実機(といっても部品2個だけれども)は前回とほとんど一緒です。微妙にアップグレードしてます。電流を測定するのに前回のようにシャント抵抗が5%精度では寂しいので 「金属皮膜抵抗 1/4W 100Ω ±0.1%」に変更しました。回路は以下です。testFixture

まあ電圧の測定精度の問題もあるのだけれど、抵抗の精度が良くて困ることはないかと。100Ωで計算楽だし。現物回路が以下です。ズボラなブレッドボードのままじゃん。ブレッドボードの接点であちこち抵抗ついてるじゃん。まあ、その辺は気にしないね。1N4148DUT

測定用のJavaScript

今回から測定っぽく、Loopで繰り返ししてます。上記回路図のようにAD2のチャネルを設定した後、スクリプトをRunしたときの動作はこんな感じ。

    1. ScopeのCH1/CH2、WavegenのCH1を初期化(DC測定のつもり)
    2. ポップアップウインドウを開いて、開始電圧、終了電圧、電圧ステップを入力してもらう
    3. 開始電圧<終了電圧の間、電圧ステップ毎にCH1とCH2の平均電圧測定を繰り返す。なお電圧を変更したときは1秒待ってから測定する(DCだからって待ちすぎ?)
    4. CH1の電圧測定値は既知の値の抵抗値で割って電流換算する
    5. 測定値は画面に出力するともにCSV形式でファイルにも出力する

まあ、初期設定すれば後はテキトーにデータを取ってくれるスクリプトの原型のつもりであります。

clear();
print("DC sweep, measure CH1 current CH2 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 startV = Tool.getNumber("Start voltage[V]:",0.1,-5.0,5.0,3);
var endV = Tool.getNumber("End voltage[V]:",1.0,-5.0,5.0,3);
var stepV = Tool.getNumber("Step voltage[V]:",0.1,-5.0,5.0,3);
var vARRAY = [];
var iARRAY = [];
while (startV < endV) {
    Wavegen1.Channel1.Simple.Offset.value = startV;
    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);
  var ch1i = ch1V*1000/shuntReg;
  iARRAY.push(ch1i);
    print("SET: ", startV.toFixed(3), "[V]");
    print("CH2v:", ch2V.toFixed(5), "[V]");
    print("CH1i:", ch1i.toFixed(3), "[mA]");
    startV += stepV;
}
Wavegen1.stop();
File("C:/tmp/vARRAY.csv").write(vARRAY);
File("C:/tmp/iARRAY.csv").write(iARRAY);
実験結果

メンドイのでGUI設定のデフォルト値のまま、0.1V毎、たかだか10点の測定をRunしてみました。AD2のスクリプトの出力ウインドウに表示された結果が以下に。OutputWindow

ファイル出力されているCSVファイルから表計算ソフトで作成したグラフが以下に。1N4148_IVgraph

実験自動化?できるかな?

お手軽ツールで今更学ぶアナログ(150) WaveForms、測定データのセーブあれこれ へ戻る

お手軽ツールで今更学ぶアナログ(151) WaveForms、なんとなくVf測定、精度は? へ進む