Analog Discovery 3 〜パターンジェネレータでのパルス波形設定方法

Analog Discovery

Analog Discovery 3のパターンジェネレータ機能で、パルス波形の設定方法がよくわからなかったので、改めて確認してみることにしました。


WaveFormsアプリを起動し、「Patterns」をクリックしてPatternsウィンドウを開きます。「+(Click to Add channels)」をクリックして「Signal」を選択、「DIO 0」を選んで「Add」をクリックし、ウィンドウに「DIO 0」を表示させます。
「DIO 0」のパターン編集ウィンドウを開いて(編集アイコンをクリック)「Type」で「Pulse」を選択すると、以下のパラメータが設定できるようになります。

Output

「PP」「OD」「OS」のいずれかを選択します。
PP(Push Pull)では「0-1」で、OD(Open Drain)では「Z-1」で、OS(Open Source)では「0-Z」で、それぞれパルス波形がスイッチングします。

Idle

パターンジェネレータが停止しているときの論理を指定します。
例えば、パターンジェネレータの実行期間を0.5usとしたとき、パターンジェネレータ終了時の論理はIdleの設定によって以下のように変わります。

Start

パターンジェネレータ実行開始時(時刻ゼロのとき)の論理を指定します。

Low/High

Low/Highそれぞれのカウンタ値を指定します。
カウンタ値×タイムステップ(Dividerで設定)でLow期間、High期間が決まります。
「Start」で設定した論理が時刻ゼロのときの論理になり、その後はLow、Highそれぞれの期間をおいてLowとHighが交互にスイッチングします。
なお、ここで指定できるカウンタ値は最大で「32768」なので、例えばタイムステップが10nsのときのパルスの周期は最大でも「10ns×32768×2 = 655.36us」となります。

Counter Init

パターンジェネレータ実行開始時のカウンタ値を別途指定できます。
例えば、「Divider=1」「Low=1」「High=1」のとき、Low幅=10ns、High幅=10nsで周期20nsのパルス波形になりますが、ここで「Counter Init=10」にすると、パターン先頭に100nsのLow期間を入れることができます。

Divider

基準周波数(100MHz)に対する分周値を指定します。
例えば、「Divider=1」ならタイムステップは10ns、「Divider=10」なら100ns、「Divider=1000」なら10usとなります。

Divider Init

パターンジェネレータ実行開始時の分周値を別途指定できます。
例えば、「Divider=1」「Low=1」「High=1」のとき、Low幅=10ns、High幅=10nsで周期20nsのパルス波形になりますが、ここで「Divider Init=10」にすると、パターン先頭のLow期間のみ100nsにすることができます。

Repetition

パルスの繰り返し回数を指定します。
「Idle」値によって、繰り返し終了後の論理が変わります。


さて、私がつくりたかったパターンは、「ふたつの信号が1msの遅延差でHighに変化し、10nsの遅延差でLowに変化する」というものなのですが、10nsの遅延差を表現するためにタイムステップを10ns(Divider=1)にすると、つくることができるパルスの周期は最大でも「655.36us」になってしまうため、1msの遅延差をつくることはできません。

このため、スクリプトエディタをつかって、複数のパルス波形の設定(パターン1とパターン2)を準備し、それらを交互に反映させてパターンジェネレータを何回も繰り返して実行することにしました。

スクリプトは以下のようになります。

Patterns1.Channels.DIO0.Type.text = "Pulse";
Patterns1.Channels.DIO1.Type.text = "Pulse";
Patterns1.Channels.DIO0.Output.text = "PP";
Patterns1.Channels.DIO1.Output.text = "PP";
Patterns1.Channels.DIO0.CounterInit.text = "Start";
Patterns1.Channels.DIO1.CounterInit.text = "Start";
Patterns1.Channels.DIO0.DividerInit.text = "Divider";
Patterns1.Channels.DIO1.DividerInit.text = "Divider";

for(var count=0; count<10; count++) {
    // ===== パターン1 =====
    // パルスのパターン設定
    Patterns1.Channels.DIO0.Idle.text = "1";
    Patterns1.Channels.DIO1.Idle.text = "1";
    Patterns1.Channels.DIO0.Start.value = 0;
    Patterns1.Channels.DIO1.Start.value = 0;
    Patterns1.Channels.DIO0.Low.value = 1;
    Patterns1.Channels.DIO1.Low.value = 2;
    Patterns1.Channels.DIO0.High.value = 3;
    Patterns1.Channels.DIO1.High.value = 2;
    Patterns1.Channels.DIO0.Divider.value = 100000;
    Patterns1.Channels.DIO1.Divider.value = 100000;
    Patterns1.Channels.DIO0.Repetition.value = 1;
    Patterns1.Channels.DIO1.Repetition.value = 1;
    // パターンジェネレータの実行期間設定
    Patterns1.States.Run.value = 4e-3;
    Patterns1.States.Repeat.value = 1;
    // パターンジェネレータ実行
    Patterns1.run();
    Patterns1.wait();
    // ===== パターン2 =====
    // パルスのパターン設定
    Patterns1.Channels.DIO0.Idle.text = "0";
    Patterns1.Channels.DIO1.Idle.text = "0";
    Patterns1.Channels.DIO0.Start.value = 1;
    Patterns1.Channels.DIO1.Start.value = 1;
    Patterns1.Channels.DIO0.Low.value = 3;
    Patterns1.Channels.DIO1.Low.value = 2;
    Patterns1.Channels.DIO0.High.value = 1;
    Patterns1.Channels.DIO1.High.value = 2;
    Patterns1.Channels.DIO0.Divider.value = 1;
    Patterns1.Channels.DIO1.Divider.value = 1;
    Patterns1.Channels.DIO0.Repetition.value = 1;
    Patterns1.Channels.DIO1.Repetition.value = 1;
    // パターンジェネレータの実行期間設定
    Patterns1.States.Run.value = 40e-9;
    Patterns1.States.Repeat.value = 1;
    // パターンジェネレータ実行
    Patterns1.run();
    Patterns1.wait();
}

パターン1とパターン2で変更しないパラメータは、最初に設定してあります。

パターン1では、DIO0とDIO1がLow→Highに1度だけスイッチングします。
「Divider=100000」にしているので、タイムステップは1msになります。DIO0の「Low=1」、DIO1の「Low=2」なので、DIO1はDIO0よりも1カウント(1ms)遅れてHighになります。
パターンジェネレータの実行期間を4msにして、1度だけ実行します。

パターン2では、DIO0とDIO1がHigh→Lowに1度だけスイッチングします。
「Divider=1」にしているので、タイムステップは10nsになります。DIO0の「High=1」、DIO1の「High=2」なので、DIO1はDIO0よりも1カウント(10ns)遅れてLowになります。
パターンジェネレータの実行期間を40nsにして、1度だけ実行します。

これをループで10回繰り返しています。

パターンジェネレータが出力したパターンを、オシロスコープで観測してみました。

実行結果全体はこちらです。パターンジェネレータの実行はスクリプト任せなので、実行間隔がまちまちになり、パルスの幅が実行のたびに変わっていますが、10回のパルスが出力されています。

Low→Highスイッチング時の拡大波形はこちらです。ふたつの信号が1msの遅延差でスイッチングしています。

High→Lowスイッチング時の拡大波形はこちらです。ふたつの信号が10nsの遅延差でスイッチングしています。

繰り返し回数をさらに増やしても、所望の結果が得られました。

作業内容が煩雑にはなりましたが、所望のパルス波形を出力させることができました。