【LabVIEWでDAQを扱う⑥】DAQでアナログ出力時のポイント

LabVIEWでDAQを扱う

スポンサーリンク

LabVIEWでデータ測定用のハードウェア(DAQ)を扱おうという初心者の方に向けて、道しるべになるような情報を発信していこうという試みです。

シリーズ6回目としてDAQでアナログ出力を扱う際のポイントについて紹介します。

この記事は、以下のような方に向けて書いています。

  • DAQのアナログ出力についてもっと知りたい
  • アップデートレートの役割って?
  • 再生成モードって何?

もし上記のことに興味があるよ、という方には参考にして頂けるかもしれません。

なお、前回の記事はこちらです。

スポンサーリンク

アナログ出力について

これまでの記事では、主にアナログ入力の電圧連続測定のサンプルを例に、DAQのプログラムでよく使用される関数の説明やタイミング、トリガの紹介をし、実際にアナログ入力を行う際の配線やサンプリングの種類、読み取り時のデータタイプの話を紹介してきました。

アナログデータの入力(測定)は、タスクとしてチャンネルは必ず設定し、必要に応じてタイミングやトリガを設定しタスク開始すればもうデータを取得できていました。

一方で、アナログ出力については「どんなデータを出力するか」を指定する必要があります。関数としては、入力で使用していたDAQmx読み取りとの対をなす、DAQmx書き込みを使用するということになります。

アップデートレートの考え方

アナログ入力のときにはサンプリングレートをDAQmxタイミングの関数で指定することで、測定するデータの間隔を指定していました。

アナログ出力もタイミングという概念はあって、同じくDAQmxタイミングの関数で指定します。次の項目で扱うようにDAQmxタイミングの関数を使用した場合にはハードウェアタイミングの信号出力になりますが、要は一つ一つのデータを出力する間隔をどの程度の時間とするかを決められます。

サンプルでは、基本関数発生器の関数を使用していますが、この関数はサンプリングレートとサンプル数を決めて波形のデータを用意することができます。

サンプルレートが変わると、生成する波形にどういった影響があるかについて確認していきます。なお、データ測定のときの「サンプリングレート」と区別するために、信号出力については「アップデートレート」と表現しますが、DAQmxタイミングの関数へ入力する時の名称はあくまで「サンプリングレート」です。

出力信号のアップデートレートが小さくなると、同じ信号を表現するのにもデータの細かさが変わります。これは信号を実際にハードウェアから出さなくても、基本関数発生器の関数で簡単に確認することができます。

人の目にはアップデートレートが100でもそれなりに正弦波の形を見ることができますが、信号を受け取る側もまたサンプリングレートという決まった間隔でしかデータを取得することはできないため、例えばアップデートレートよりも早いサンプリングレートになるともはやきれいな正弦波は得られないことになります。

以下は、実際にハードウェアから出力した信号を別のハードウェアで測定したときの結果です。

測定の際のサンプリングレートは1000 Hzで統一し、出力側のアップデートレートは100 Hzと1000 Hzとしています。

アップデートレートがサンプリングレートより遅い場合にはカクカクしているのが分かると思います。そりゃそうですね、出力する側のデータが変化するよりも早く、データの測定を行っていることになるので。

また今度は、試しにDAQmxタイミングの関数に与える(アップデート)レートの値と、DAQmx書き込みの関数に与える出力信号のレートを別々にしてみることを考えます。そのために下のようなプログラムを用意しました。

このプログラムを使用して、DAQmxタイミングの関数に渡すレートの値と、出力信号波形のレートを変えると、本来出力したい信号通りにいかないことがわかります。例えば、正弦波であれば、出力したい正弦波の周波数ではなくなってしまいます。

もちろん、 DAQmxタイミングの関数に渡すレートの値と、出力信号波形のレート の差が大きいほど余計に本来の信号の周波数とは異なってしまいます。(下の図の右側は測定時の結果を表わしていますが、下のグラフは上グラフと比べて表示するサンプル数が10倍になっています)

このため、信号出力時のアップデートレート(DAQmxタイミングに入力する値)の大きさはデータの細かさに関係し、DAQmx書き込みの関数に渡す出力したい信号の波形データ自身のレートは出力信号の情報(正弦波で言えば周波数など)に関係します。

サンプルのように、二つのレートの値を一致させる書き方であれば問題がないのですが、必ずしもサンプルで用意されたような基本関数だけで構成するわけではないと思うので、この点は注意が必要になります。

データの書き込み方

アナログ出力プログラムで他に気を付けるのは、データの書き込み方についてです。

DAQを使用したプログラムによってハードウェアから信号を出す際の方法は、ハードウェアタイミングとソフトウェアタイミングで異なります。また、ハードウェアタイミングではざっくり、再生成を許可する、許可しないの二通りのプログラムパターンがあります。

これらの使い分けとしては、

  • どのように信号出力を制御したいか
  • 出力信号を素早く変更する必要があるか

でどれを使用するかを決めることになります。

一番簡単なソフトウェアタイミングから紹介していきます。これもサンプルファインダに電圧-オンデマンド出力というサンプルがあるのでこれを例に説明します。

このサンプルはソフトウェアタイミングとなっておりDAQmxタイミングの関数が使用されていません。

DAQmx書き込みの関数にループ内で値を入力しているため、フロントパネル上で値を変更することで出力値も都度都度変更することができます。

ただし、出力値の変更のタイミングはあくまでソフトウェア側でDAQmxタイミングの関数に新しい値が入力されてから、となり、この入力のタイミングはソフトウェアの動作環境に依存します。

このため、例えば正弦波のような滑らかな曲線の信号を出力するには不向きです(例えばマウスを動かすなどしてPCへの負荷を与えるとカクつきます)。

試しに実際にソフトウェアタイミングで正弦波を出力しこれを測定した場合には以下のような結果となります。(ソフトウェアタイミングの方では次のミリ秒倍数まで待機の関数で1 msごとに値を変えようとしているので、信号測定側は1000 Hzで信号測定をしています)

逆に、そこまで頻繁に値が変化しないような場合や、定電圧を与えるような場面ではこのソフトウェアタイミングのプログラムの実装が簡便です。プログラムの途中で一定電圧の値を変更することもできますし、DC電圧の制御に向いている、ということになります。

次に、ハードウェアタイミングの再生成を許可するプログラムを見てみます。なお、後で再生成を許可しない方法も紹介しますが、特に何も指定せずにプログラムを組んだ場合のデフォルトでは再生成を許可する状態です。電圧 – 連続出力のサンプルの組み方がこれにあたります。

まずはプログラムの作りをじっと見て、ソフトウェアタイミングの場合との違いを見つけます。

そう、ソフトウェアタイミングの場合と異なり、タスクが始まる前にDAQmx書き込みの関数を使用して、Whileループの中ではタスク完了確認という関数しかおかれていません。

ハードウェアタイミングでDAQのデバイスから信号を出す際には、常に「どんな値の信号を出すか」を指定する必要があります。にもかかわらず、上の図のプログラムは、タスクを開始する前には信号の値を波形データとしてDAQmx書き込みに入力していますが、それ以降は出力信号の指定を行っていません。

実はここに「再生成」の意味があります。この「再生成」とは、ハードウェア側のバッファで「一度DAQmx書き込みの関数に入力されたデータを再度生成して出力する」という意味になっています。

簡単に言えば、一度タスクを開始する前に出力データを書き込んでおいたら、その信号を出した後は勝手にその信号を再度生成して出力を続けますよ、という意味になります。

これを踏まえると再生成を許可しないプログラムの意味がよりわかるかと思います。こちらもサンプル電圧(非生成) – 連続出力があるのでこれを例にとります。

こちらの再生成を許可しない場合には、Whileループの中にDAQmx書き込みの関数があり、毎ループで出力する信号を決めています。たとえ前のループと同じ信号を出力する場合であっても、ひっきりなしに信号を書き込んでやる必要があります。

この再生成を許可する、しないはプロパティノードで指定することができます(プロパティノードで明示的に指定をしていない場合には再生成を許可するモードになっています)。

注意点としては、「再生成を許可するモードであってもWhileループ内でDAQmx書き込みを使用して出力信号値を入力してもよい」ことです。

ただしこの場合、再生成を許可している関係で、新しく出力したい信号をDAQmx書き込みに入力しても、ハードウェア側では再生成を行って前の波形データを用意しているかもしれません。そのため、実際にハードウェアから新しい波形が出力されるタイミングが遅れることがあります。

この遅れを短くしたい場合には、アップデートレートを上げて再生成された信号データを早く出力させるか、あるいは再生成を許可しないモードにすることになります。

上記のように、ソフトウェアタイミングなのかハードウェアタイミングなのか、再生成を許可するのかしないのかは、どのような信号を出したいかでおのずと決まってくると思うので、要望に合わせて適切に選んでください。

連続か有限か

今までの話は基本的に連続モードを前提に紹介してきました。

アナログ入力でDAQmxタイミングの関数で連続か有限かを選べたように、アナログ出力であっても連続モード以外に有限モードが選べます。

ただ、出力の有限モードについてはあまり説明するまでもなく、「指定した有限の数の出力したいデータを出力して終わり」というだけです。

ただし、プログラムの書き方として注意する必要がある部分が一か所あって、それはタスク開始後に「DAQmx完了まで待機」の関数をおくことです。この関数は、「指定した有限個のデータを全てハードウェアから出力するまで待機」する役割を果たします。

逆に言えば、この関数がないと、せっかく出力値として指定したデータが全部出力される前にタスクが停止してしまいます。タスクが停止したら指定したデータ配列の途中であってもその時点での出力で終了してしまいます。

ちなみに、連続モードのときには、Whileループの中でDAQmxタスク完了確認という関数を使用していました。この関数は、実際は合ってもなくてもプログラム自体は動作します。

ただ、もしWhileループだけがあった場合にはDAQ関係でエラーが起きた場合にそれを検出することができなくなります。エラーの検出を行うために何かしらのDAQに関わる関数をおかないといけない・・・そんなときに使用すると思っておけば大丈夫だと思います。

プログラム終了後の出力値

アナログ出力のプログラムは、DAQmx書き込みの関数に入力したデータを出力します。では、プログラムが終了した場合にはハードウェアからの出力値は0になるかというとそうではなく、電源が入っている状態では、最後にプログラムで出力していた値が出続けることになります。

そのため、例えばもしプログラム終了時には特定の値(0 Vなど)にしたいということであれば、実際に出力したかった値を出す部分を終えた後に、0 Vが出力されるようにDAQmx書き込みの関数に入力する必要があります。

もちろん、0 V以外の任意の値にもすることができます。

アナログ出力を扱う上ではまず以上のことに気を付けてプログラムを書いていけばいいと思います。

ここまででアナログ入力と出力を扱ったので、次回はデジタルの入出力を扱います。

もしよろしければ次の記事も見ていってもらえると嬉しいです。

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

コメント

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