お手軽ツールで今更学ぶアナログ(158) AD2、遅延計測スクリプト機能追加と小ネタ

Joseph Halfmoon

アナデバ社(ADI社)の日本語版記事の最新号をキャッチアップできたので、再びAnalog Discovery2のスクリプトの練習に戻ります。第155回では2つのチャネル間の信号の立ち上がりの時間差を「遅延」とみなして測定。今回は立ち上がり、立下りの区別なく、「エッジ間」ということで測定できるようにしてみました。

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

前回のスクリプトの練習は以下の回でした。今回は以下で作成したスクリプトの機能追加、兼リファクタリング?的な。機能追加とリファクタリングは混ぜないのが宜しい気がしないでもないですが、元より泥縄。

お手軽ツールで今更学ぶアナログ(155) AD2のスコープ画面に遅延計測機能を追加する

今回機能追加したJavaScriptソース

ソースコードのファイル名と、結果表示のところでちょいと迷いました。Analog  Discovery2(以下AD2と略します)の制御ソフトであるWaveFormsのScriptタブでは、フツーに “.js”拡張子のスクリプトを実行できるようになってます。ところが、ScopeウインドウのMeasurement機能でScriptを呼ぼうとすると、”.txt”拡張子が既定になっています。ちょっとやってみたところでは既定値を”.js”には変更できないみたいっす。無理やり手動でファイル名と拡張子を ~.js と打てば.js拡張子のファイルも使用可能ではあるのです。でも既定値のままならマウス・クリクリで選択可能。拡張子を “.txt” にしてもScriptタブでは実行に問題ないです。WaveForms内で完結するのであれば、.js より .txt 推し。しかし、JavaScriptは、VSCodeで編集したい、という希望あり。どうしたもんか。

ソースが以下に。

// c1c2delay.js v0.2
// measure delay between edges
function detectEdge(mid, lev, cnt, dAry) {
    for (var idx = 0; idx < cnt; idx++){
        if ((lev * (dAry[idx] - mid)) < 0) {
            return idx;
        }
    }
    return 0;
}

function calcTime(idx, mid, ch, dAry) {
    if (idx > 0) {
        var s1 = ch.TimeOfVisibleIndex(idx-1)
        var e1 = ch.TimeOfVisibleIndex(idx)
        return s1 + ((e1 - s1) * (dAry[idx]-mid)/(dAry[idx]-dAry[idx-1]))
    }
    return 0;
}

var ch1 = Scope.Channel1;
var ch2 = Scope.Channel2;
var data1 = ch1.visibledata;
var data2 = ch2.visibledata;
var cnt1 = data1.length;
var mid1 = (ch1.measure("High")-ch1.measure("Low"))/2;
var mid2 = (ch2.measure("High")-ch2.measure("Low"))/2;
var c1lev = data1[0] - mid1;
var c2lev = data2[0] - mid2;

var idxH1 = detectEdge(mid1, c1lev, cnt1, data1);
var tim1 = calcTime(idxH1, mid1, ch1, data1);

var idxH2 = detectEdge(mid2, c2lev, cnt1, data2);
var tim2 = calcTime(idxH2, mid2, ch2, data2);

print(tim2 - tim1)
tim2 - tim1

前回のものに比べると主要な処理を関数に「リファクタリング」したので見通しがよくなったのでないかと。

なお、最後の2行も ScriptタブとScopeタブの両方で走らせるための「なんだかな~な」部分です。Scopeタブでは、スクリプト末尾で計算した値がそのままスクリプトの戻り値となってMeasurementウインドウに自動表示されます。フツーのJavaScript的にはなんだかな~な表現ですが、末尾行のtim2-tim1は必須です。一方、Scriptタブでは末尾行のtim2-tim1は特に問題発生しないですが、効果も発揮しないみたいデス。ScriptタブのOutputウインドウに値を表示するにはprint()使うしかないです(Scope側でprint()しても何も起こらないっぽいです。悪さもしないケド。)そこで末尾の2行と相成りました。

測定結果

適当にデジタル信号的な信号をCH1(黄色)、CH2(青色)に入れて、CH1-CH2間の「遅延」を測ってみました。赤の時間カーソルのX2Δ1の値と、上記スクリプトで計算したあMeasurementsウインドウのDelay値を比較してくだされ。

測定原則は以下です。

    1. 取得したデータ全長ではなく、グラフ表示中の時間スパンを処理対象とする(適当に表示エリアを調整して「測定」したい部分を画面に映すようにするとよい。)
    2. 時間スパンは、電圧的にはエッジの「ほぼ」VDD/2 点基準。VDD/2の電圧は、それぞれチャネルの信号のHigh値とLow値から計算する。
    3. 標示の左端の値がLOWであればLOW->HIGH遷移(立ち上がりエッジ)を計測し、左端の値がHIGHであればHIGH->LOW遷移(立ち下がりエッジ)を計測する

まずは、前回もできていたCH1立ち上がりからCH2立ち上がりまでの「遅延」

RR_EC

つづいて、CH1立ち上がりからCH2立下り。

RF

今度は、CH1立下りから、CH2立下り。

FF

最後はCH1立下りからCH2立ち上がり。

FR

Scriptの編集にVSCode使いたい

以下のように、フツーにVSCodeでAD2用のJavaScriptソースの編集は可能です。しかし、問題は先に述べた拡張子かと。.js であれば、VSCodeのJavaScript向け各種機能を活用できますが、.txt では寂しい限りです。measureDelayBetweenEdges

どしたものか?

お手軽ツールで今更学ぶアナログ(157) スピーカの周波数特性、ここでのBWって何よ? へ戻る

お手軽ツールで今更学ぶアナログ(159) AD8561コンパレータで外部トリガ入力を に進む