基本関数の組合わせで出力波形をデザインする

Tips

スポンサーリンク

この記事で扱っていること

  • 基本関数を組み合わせて出力波形を決める方法

を紹介しています。

注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。

機器から信号を出力する際には、その出力信号のデータを「定義」する必要があります。

機器側にする設定として、アップデートのレート、つまり何秒間隔で出力値を更新していくのかと、実際の出力値を集めたデータ(配列)を決める必要があります。

例えば正弦波を出す場合であっても、「正弦波を出す」という設定を機器にすればそれでOK、というわけにはいかず、その正弦波の一つ一つの値を細かく決めてそれらがアップデートレートで定められた時間間隔で次々出力され最終的に全体として正弦波を形作るようにします。

もちろん手作業で正弦波のデータ一つ一つを決めていくのは現実的ではないので、実際は波形データ生成の関数を使用して「正弦波」およびその他の波形を指定してそれにあった波形データを用意します。

もちろんこれらの各種波形の配列をつなぎ合わせていけば正弦波の後に方形波を出して、といった組み合わせもできるのですが、いちいち違う波形ごとにプログラムを作るのは面倒です。

そこで正弦波のみならず、他の基本関数つまり方形波、三角波、ノコギリ波そして直流信号、これらを組み合わせて出力する際に便利なサブVIを用意してみました。これを使用することで基本関数を組み合わせた波形を定義し実際に出力させることができます。

以下では実際の出力としてはDAQデバイスを使用しています。

スポンサーリンク

どんな結果になるか

メインのVIは、電圧の連続出力のサンプルをベースにしています。トリガの機能は特に必要なかったので省きました。

プログラムを実行すると、出力波形をデザインするためのサブVIが立ち上がります。このサブVIでは、正弦波、方形波、三角波、ノコギリ波および直流信号をそれぞれ定義できるようになっており、周波数や振幅、位相、サンプル数を指定できます。

addボタンを押すと追加できるだけでなく、removeボタンを押すことで取り消ししてどんどん戻ることができます。

また、出力の波形に追加する前にそのパラメタでどんな波形になるかを一時的に確認するための機能も設けています。

この画面で構成を終えたら後はその構成した波形がそのまま出力されます。実機を使って出力データを入力測定したときの結果を見たときの例がこちらです。

プログラムの構造

メインのVIは、サンプルの電圧連続出力をコピーしトリガの機能を省いた状態としており、DAQmx書き込みに渡すデータをサブvi、wave_design.viで構成します。そのためにこのサブVIはVIプロパティで「呼び出されたらフロントパネルを表示」および「元々閉じていたら実行後にフロントパネルを閉じる」の設定をしておきます。

wave_design.viのフロントパネルには、タブ制御器で各波形のパラメタ設定のための枠を設けています。

なお、wave_design.viのサブVIはメインVIからアップデートレート(サンプルプログラムの表記だとサンプリングレート)を受け取り、デザインした波形をメインVIに渡すのですが、これら入出力を行う際に必要な制御器、表示器はサブVIのフロントパネルに表示させておく必要がないため、フロントパネルの下の方に置いておき、ウィンドウサイズを小さくして隠しています(下の図のように、実際には各種制御器や表示器が他にもあるのですがフロントパネルの大きさを調整して事実上見えなくさせています)。

また、メインVIの中でこのサブVIに行き着く前に何かエラーが起きた場合にもすぐにメインVIが止まれるように、wave_design.vi全体をケースストラクチャで囲み、エラーが起きたら何もせずに終了するようにしました。

サブVIの中身はイベント駆動型のステートマシンとしています。各ステートで共有しているデータは

  • wave array:波形のY値の配列
  • array info:一回addするたびにいくつの波形が追加されたか、その波形の数を記録している配列。removeのときに、wave arrayからいくつデータを削除すればいいかを判断
  • tempo info:一時的にデータを表示させる際に使用する波形のY値の配列
  • dt:メインVIの方で指定したアップデートレートの情報の逆数
  • state:ステートマシンのステートを移動する際の列挙体

となっています。

それでは各ステートを確認します。

簡単なのはinitialステートとfinishステートです。initialステートでは各配列の初期化を行っています。またfinishステートではWhileループの条件端子にTRUEを渡してWhileループを止める役割を持ちます。

次にwaitステートです。ここでイベントの発生を待ちます。イベントは全部で5つありますが、このうち4つは単にステートを移動させる際のトリガとなっているだけです。

タブ制御器や各種基本関数のパラメタを変更したときに発生するイベントでは、タブ制御器に応じて各波形パラメタから波形データを生成し、これをtempo infoに渡しています。波形の生成には、関数パレットで信号処理の中にある波形生成パレットの各関数を使用しました。

addステートでは、tempo infoに入れていた各波形のY値配列をwave arrayに追加し、このY値配列のサイズをarray infoに登録します。

removeステートでは、array infoの最後にあった、つまり最後にaddされたデータをwave arrayから削除します。array infoには、addされていた波形の配列のサイズがそれぞれ含まれているので、最後にaddされた配列が例えば1000個の要素を持っていたのであれば、wave arrayの最後の1000点を削除すればいい、ということになります。

またこのステートではarray info自体もその配列の最後の値を削除しています。

temporaryステートでは、tempo infoのデータをグラフに表示しています。

これらのステートを組み合わせることで、望みの順で基本関数をつなげて出力させることができるようになります。

あらかじめいくつかの波形を用意しておく

上記の方法では、VIの実行の度に新規で波形をデザインする必要があります。これでもいいっちゃいいのですが、例えばいくつかパターンを用意しておいて、プログラム実行時にそれらのパターンを選んで使用するということもできると思います。

そのためには、あらかじめいくつかのそれらの波形をファイルに保存しておいて、出力プログラムを使用時にファイルを選ぶことで出力させるという方法が便利だと思います。

この場合、波形をデザインするプログラムではファイル出力する仕組みが必要です。一番便利なのは波形データをそのまま配線して保存できるTDMSファイルですね。

出力プログラムの側では、実行時にどのファイルを使用するかを選ばせます。

こうすることで、一度作った波形を何度も使用するといった使い方ができます。

出力プログラムは単純な正弦波だけ、とか方形波だけ、といったことはNIサンプルファインダのサンプルを使用すればすぐにできますが、これらを組み合わせる場合だと少し工夫が必要になります。その一例として本記事が参考になればうれしいです。

ここまで読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました