『StudentZone』2月号の日本語記事がアップされるまでの「つなぎ」として、Digilent AD2、WaveFormsのScript制御の練習を続けてまいりたいと思います。いよいよ今回は実験自動化っぽいことをやってみます。印加するDC電圧をプログラムで制御しながら、そのときの電流、電圧を測定するだけのもの。
※「お手軽ツールで今更学ぶアナログ」投稿順 indexはこちら
※ 練習している「学習用」万能測定ツールは、Digilent製 Analog Discovery 2です。その制御ソフトウエアはVersion 3.18.1のWaveForms(Windows版)です。WaveFormsのマニュアルの在処は以下です。
測定対象の実機をアップデート
測定対象の実機(といっても部品2個だけれども)は前回とほとんど一緒です。微妙にアップグレードしてます。電流を測定するのに前回のようにシャント抵抗が5%精度では寂しいので 「金属皮膜抵抗 1/4W 100Ω ±0.1%」に変更しました。回路は以下です。
まあ電圧の測定精度の問題もあるのだけれど、抵抗の精度が良くて困ることはないかと。100Ωで計算楽だし。現物回路が以下です。ズボラなブレッドボードのままじゃん。ブレッドボードの接点であちこち抵抗ついてるじゃん。まあ、その辺は気にしないね。
測定用のJavaScript
今回から測定っぽく、Loopで繰り返ししてます。上記回路図のようにAD2のチャネルを設定した後、スクリプトをRunしたときの動作はこんな感じ。
-
- ScopeのCH1/CH2、WavegenのCH1を初期化(DC測定のつもり)
- ポップアップウインドウを開いて、開始電圧、終了電圧、電圧ステップを入力してもらう
- 開始電圧<終了電圧の間、電圧ステップ毎にCH1とCH2の平均電圧測定を繰り返す。なお電圧を変更したときは1秒待ってから測定する(DCだからって待ちすぎ?)
- CH1の電圧測定値は既知の値の抵抗値で割って電流換算する
- 測定値は画面に出力するともに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のスクリプトの出力ウインドウに表示された結果が以下に。
ファイル出力されているCSVファイルから表計算ソフトで作成したグラフが以下に。
実験自動化?できるかな?