LabVIEWでデータ測定用のハードウェア(DAQ)を扱おうという初心者の方に向けて、道しるべになるような情報を発信していこうという試みです。
シリーズ5回目としてDAQでアナログ入力を扱う際のポイントについて紹介します
この記事は、以下のような方に向けて書いています。
- DAQでアナログ入力についてもっと知りたい
- 配線の構成や測定のタイミングって?
- データの解析や保存をするには?
もし上記のことに興味があるよ、という方には参考にして頂けるかもしれません。
なお、前回の記事はこちらです。
アナログ入力について
前回までで、アナログやデジタルの入出力に共通した要素を紹介してきました。今回からはアナログの入力、出力、デジタルの入力、出力で分けてそれぞれに特有な内容を紹介していこうと思います。
まずはアナログ入力です。アナログ入力のプログラムで注意点として、
- 配線の構成
- 同時かマルチプレクスか
- 「波形」か「配列」か
あたりのことを取り上げます。
配線の構成
配線は正しい信号測定を行う際に考えるべきポイントになります。主な区分としては、差動、基準化シングルエンド(RSE)、非基準化シングルエンド(NRSE)に分かれます。
ハードウェアによって特定の配線でしか構成できないものもありますが、複数の種類から選べるものも多いです。
とても大雑把に説明すると、
- 基準化シングルエンド(RSE):測定信号のマイナス側とDAQデバイスのアナログ入力のグラウンドを共有し各チャンネルで一つの信号を測れるものの、グランド間の電位差(コモンモード)の影響が入る
- 差動:測定信号のプラスとマイナスをそれぞれアナログ入力のプラスとマイナスにつなぐことでコモンモードの影響を除去するが、その分使用できるチャンネル数が半分になる
- 非基準化シングルエンド(NRSE):測定する信号すべてのグラウンドが共通している場合に使用できる、コモンモードを除去してかつチャンネル数も半分にならない構成
と言えます。これらはあくまで大まかに説明しただけですが、信号源が浮動型か設置型か等でも構成が変わります。
チャンネル数の話が出ていますが、例えば基準化シングルエンドと差動どちらも使用できる、32チャンネルのNI 9205というモジュールを使用する場合、基準化シングルエンドだと32チャンネルすべてを使用できますが、差動型だと16チャンネルしか使用できないことになります。
ここら辺の区別は、NI DAQmxヘルプ(デフォルトの場所だとC:\Users\Public\Documents\National Instruments\NI-DAQ\Documentation)の中の測定の基礎知識>>信号タイプ>>アナログ接続に関する注意事項>>アナログ入力信号を接続する>>測定システムのタイプと信号ソースが参考になるかと思います。
ハードウェア側でワイヤ配線を適切にした後には、ソフトウェア側でもしっかり指定する必要があります。
デフォルトという設定は使用するハードウェアごとにどれがデフォルトか異なるのでヘルプ(NI-DAQmxデバイスに関する注意事項>>物理チャンネル>>内部チャンネル>>デフォルトの入力/出力端子構成)を確認するか、明示的にこの構成、というものを指定します。
もし、適切な配線はどれか判断するところまではできたものの実際のピン配列に迷った場合には、DAQアシスタントのExpress VIが便利です。
おいおい、Express VIを使用するんだったらプログラム組む必要ないじゃん、という声が聞こえてきそうですが、接続方法を知る際にどのピンをどう接続するかの接続ダイアグラムを確認するという目的で重宝する、というだけです。プログラムそのものはExpress VIではなく下位関数を使用して書けるに越したことはありません。
同時かマルチプレクスか
これも信号測定を行う上で考えるべきポイントになる場合がありますが、ハードウェアの仕様の話となり、ソフトウェア側で変更できるものではありません。
簡単に言えば、一つのデバイスで複数のチャンネルがあった場合に、すべてのチャンネルが文字通り「同時に」サンプリング(してアナログデジタル変換)するか、あるいは個々のチャンネルのサンプリングは変換クロック分の時間差を持つのか、の違いです。
同時にならないのは、一つのデバイスで、複数のチャンネルが、一つのADC(アナログデジタル変換器)を共有するために、次々にチャンネルを切り替える(この切替の仕組みがマルチプレクスと呼ばれています)必要があるためです。
このことも、NI DAQmxヘルプでNI-DAQmxの概念>>タイミングとトリガ>>ハードウェアタイミングとソフトウェアタイミング>>サンプルタイミングタイプ>>マルチプレクスサンプリングと同時サンプリングに記載があります。
実際にどのハードウェアが同時でどのハードウェアがマルチプレクスタイプなのかを見分ける方法としては、デバイスの仕様書のサンプリングについての記述のされ方を見て判断できます。S/sと書かれていたらマルチプレクス、S/s/chと書かれていたら同時になります。
なんだ、マルチプレクスみたいに完全に同時じゃなくても測れればいいや、と思った方がいるかもしれませんが、マルチプレクスタイプで注意する必要があるのは、この制限によって使用するチャンネル数が増えると使用できる最大サンプリングレートもその分小さくなることです。
例えばNI 9205は250 kS/sということでサンプリングレートが250 kHzまでいける・・・というのは1チャンネルのときのみで、2チャンネル測定に使用している場合には最大で125 kHzのサンプリングレートしか出せません。
もし32チャンネル、シングルエンドで使用している場合には、7.8125 kHzまでしか出せない、ということになりますのでご注意を。
「波形」か「配列」か
これはDAQmx読み取りの関数の設定のお話です。以前の記事でもちらっと紹介しました。
波形データタイプか配列で信号の値を取得するという違いだけなのですが、時間の情報も併せてほしいということであれば波形データタイプ一択になります。
なぜなら、波形データタイプは、「配列のデータタイプに時間情報を合わせたもの」だからですね。
時間の情報なんていらないよ、信号がとれればいい、と考えている方でも、もしその信号を何か解析したい、例えばFFTをかけたいと考えた場合には波形データタイプを使用します。
実際波形データでなくても配列でもFFTの関数にデータを入力して実行できるし結果も得られるのですが、正しい値にはならない場合が多いです。FFTは信号の中の周波数の成分をあらわにする解析ですが、時間の情報がないと周波数の情報が正しく得られなくなるためです。
信号入力でプログラムが止まる?
DAQmx読み取りの関数は以前にも紹介した通り読み取るサンプル数として指定したサンプル数がハードウェア側でたまったら関数から抜け出しループが次に進みます。
これ、言い換えれば、サンプルが集まるまでDAQmx読み取りの関数でプログラムが止まっていることになります。
この場合、例えばWhileループに対する停止ボタンを押しても、DAQmx読み取りが実行されるまで停止はされないことになります。DAQmx読み取りが実行されるのは、サンプル数として指定した数のサンプルが得られたときかあるいはタイムアウトの設定時間(単位は秒)が過ぎたときだけです。
この弱点を克服できる書き方が、イベントストラクチャを使用したプログラムです。
これはサンプルファインダの中のサンプルを確認したほうが早いと思うので、こちらを見てみます。
イベントストラクチャを、ハードウェアのサンプリングをイベントとして登録、使用することで、サンプルが指定した数たまればDAQmx読み取りが実行されますが、それまでDAQmx読み取りの関数を実行することはなく、ユーザーの操作を待つ状態となります。
このように書くことで、何か他に割り込みで処理させたいこと(Whileループを停止しプログラムを終了させる、など)を実装しても瞬時に反応できるようになります。
測定した信号の解析や保存について
さて、上記の注意事項を考えたうえでプログラムを組めばあとは実行して測定が行えます。
測定した値はそのまま扱うこともありますが、解析をしたり、保存することができます。これらの操作を電圧の連続入力のサンプルなどに付け加える場合には必ずサンプルを別名で保存してから編集をします(でないとオリジナルのサンプルを編集してしまうことになるためです)。
解析についてはすぐ上の項目で既に出てきましたが、他にも色々な関数があるので解析に役立てられます。基本的に波形データを入力して使用します。
解析の関数は、波形のスカラデータを受け付けるので、DAQmx読み取りの関数でNチャンネルと指定して波形の配列をデータとして得ている場合には指標配列の関数やForループを使ってスカラとしてやります。
データの保存については、もちろんどんな形式でもその通りのプログラムを組めばいいだけなのですが、LabVIEWを使用する上でおすすめされるのはTDMSだと思います。
実際TDMSというファイル形式は便利で、波形データをそのまま入力できること、ファイルにプロパティを持たせることができることといった利点が挙げられます。
TDMSについては別記事でも解説しているので良かったらこちらもご覧ください。
プログラム例としては、例えば以下のようなプログラムが考えられます。
もしキュー関数を知っているという方でしたら、データを測定するループとデータを保存するループを分けるために以下のプログラムにした方がより便利です。
ひとまずアナログ入力についてまずこれくらいのことを知っておけばサンプルを使った測定やある程度の応用ならできると思います。
このような感じで、次回の記事ではアナログ出力について扱っていこうと思います。
基本的に使用する関数は共通しているものが多いのですが、出力のプログラム特有の書き方もあるのでそこを紹介していこうと思います。
もしよろしければ次の記事も見ていってもらえると嬉しいです。
ここまで読んでいただきありがとうございました。
コメント