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の遅延差でスイッチングしています。

繰り返し回数をさらに増やしても、所望の結果が得られました。
作業内容が煩雑にはなりましたが、所望のパルス波形を出力させることができました。

