Analog Discovery 2にはWavegenという任意波形を出力する機能があります。今回は、その機能の使い方を調べてみました。
前回の記事は、こちら。オシロとデジアナの使い方を簡単にまとめてあります。
ANALOG DISCOVERY2 | ぼくのマイコン開発のメモ (tekuteku-embedded.xyz)
スペックは以下のとおり。(digilent社サイト参考)
- 出力電圧 : ±5V
- 分解能 : 14bit
- サンプリングレート : 100MS/s
- 周波数帯域 : 20MHz
操作方法
WaveForms起動後に左横のWavegenをクリックします。
下の画面があらわれます。
だいたいの画面の説明は以下の通り。
Simpleモード
上半分は波形生成したものをオシロで測定した結果、下半分がWavegenの設定画面です。
波形も色々な種類が用意されていて、簡単に変えられます。
Basicモード
これはスライダーで無段階に調整できます。
Customモード
これは計算式で波形つくったり、CSVから読み込んだり、色々と波形を加工しながら形状をつくりこむモードです。基本的には1周期分のデータをつくって、そのあとで、そのデータを指定した周波数で繰り返し出力するみたいな流れです。
こんなCSVデータをつくってみます。
下の画面がCustomモードのホーム画面になります。左側のNEWを押すと、波形設定用のウィンドウが表示されます。
fileタブを選択し、importボタンを押し、csvファイルを選択します。
さっきのCSVファイルを選択ダイアログで選択すると、下のような読み込み設定画面があらわれます。右グラフ見ると分かるようにデータは、勝手に-100~+100%で正規化されてます。
データ自体はColumnのところで読み込む列を指定できます。よければ、右下のOK。
元の画面にもどってきて、もう一回OK。
元の画面に戻ってきて、波形が登録されました。リストの右に周波数と振幅、オフセット値などを設定できます。最終的な波形を右のグラフで確認して、OKならば、再生ボタンを押して、出力を開始します。
下がカスタム波形を1MHz周期で出力した結果(上半分)です。
Sweepモード
モードには、sweepとdampという機能があり、sweepは周波数を時間で変化させ、dampは振幅を変化させます。それぞれ初期値と最終値と遷移時間を決められます。
下の画面はSweepとDampを同時に設定した時の例です。
外部のSWをトリガにして、波形を出力したい
実験してて、結構やりたいのが、外部のSW操作をしたタイミングで、波形を出力するみたいなことです。
これはトリガーモードを変更すればいけます。
その前にせっかくなので、SW信号の電源もAnalogDiscoveryから取りたいとおもいます。DCジャックに電源をいれて、V+から3Vの電源をとれるようにします。
Suppliesというところから下の画面をひらき、3Vを入力してONします。これでV+に電源がきます。
SWをこんな感じで電源にぶら下げて、信号をオシロの1番ピンにつなげます。そして、波形確認用にW1はオシロの2番につなげます。
まず、スコープのトリガ設定をChannel1のFallingに設定して、SWを押すとトリガーがはいるようにしときます。
つぎにWavegenの画面にうつって下のようにトリガー先をScopeのRisingに設定します。
そして、Scope側もWaveGen側も再生ボタンを押し、トリガー待ち状態にして、SWを押せば、そのタイミングで波形が出力されます。
結果が下。ちゃんとFallingのタイミングで波形が出力されました。めでたし。
手動でダイアル的なのを回しながら出力の周波数を変更したい
今度は、写真のようにオシロのチャンネルにポテンショメータをつないで、ダイアルを回すと、出力波形の振幅と周波数を変えるというのをやってみます。
既存機能ではできませんが、色々調べたら、script機能を使うと、java scriptベースで、WaveFormsの機能を操作できるようです。
メニューからScriptをクリックします。
下のような画面がひらきます。
サンプルとして、コードを書いてみました。メソッドの内容はヘルプで結構詳しく書いてあるので、使い方に困ることはありませんでした。
// This script adjusts the Wavegen offset based on Scope measurement.
clear()
if(!('Wavegen' in this) || !('Scope' in this)) throw "Please open a Scope and a Wavegen instrument";
var freq_ini = 1;
var amp_ini =2;
Wavegen.Channel1.Mode.text = "Basic"; //basicモードでひらく
Wavegen.Channel1.Basic.Type.text = "Sine"; //sin波を指定
Wavegen.Channel1.Basic.Amplitude.value=amp_ini; //振幅の初期値
Wavegen.Channel1.Basic.Frequency.value = freq_ini; //周波数の初期値
Scope.Trigger.Trigger.text = "Scan"; //オシロをscanモードにする
Wavegen.run(); //波形出力スタート
Scope.run(); //スコープスタート
for(;;){
if(!Scope.wait()) throw "Stopped";
var ch1_val = Scope.Channel1.measure("Middle");//ch1の値ゲット
Wavegen.Channel1.Basic.Amplitude.value = ch1_val; //値を変更
Wavegen.Channel1.Basic.Frequency.value = ch1_val;
}
一応、できたがレスポンスは遅い
ポテンショを0Vから3Vまでゆっくり変化した時の結果が以下です。オレンジがポテンショ電圧で青が出力した波形です。
なんか想像していたよりも、かなり追従性が悪くなっています。Script内のfor文の実行周期がかなり遅いようです。
リアルタイムにびしばし設定を変更するのは想定されてなさそうです。どちらかというとCase1 ,2, 3みたいにテストケース毎に切り替えていくような使い方が向いていそうです。
他にも、WaveForms SDKというもあり、他のアプリケーションからAPIで操作できるようですが、これだと、制御周期をあげることができるのでしょうか。今度調べてみます。
ともかく、波形のカスタマイズも自在にでき、Script機能もあり、wavegenは、使いやすく、多機能ですね。waveforms (・∀・)イイ!!。
テスト関連の仕事はこれで自動化して、リモートワークは夢でないかも・・・。
シグナルジェネレータばんざい。