09-26-2011 08:39 PM
添付したLabVIEWのviは”Count Digital Events.vi”を参考にして作成したものです。
このviはパルスをカウントしてmillisecond multiple の時間経過したら、また0からカウントし、それを繰り返してグラフに出力します。
しかし、このviでは時間がmillisecond multipleに依存する、つまりパソコン内の時計に依存するので、パルス数を正確にカウントすることができませんでした。
そこで、時間(X軸)を一定の速度で低下するアナログ信号が出力されるポートがあるので、その信号を用いてプロットしようと考えています。
どのようなプログラムにすれば良いのかわからないので教えてもらえませんか?
よろしくお願いします。
09-28-2011 02:45 AM
domi_2005 様
ご投稿ありがとうございます。
日本ナショナルインスツルメンツ技術部の伊藤と申します。
早速添付のVIを拝見させて頂きました。添付のVIは、カウンタを使用したエッジカウントになります。
カウンタの動作としてはタスク開始の時点でハードウェアタイミングで行われることになりますが、カウンタの刻んでいる値を読み取る
タイミングは、Whileループの回るタイミング、つまりソフトウェアタイミングになります。
分かりやすく具体例で説明します。まず、周波数が1Hzのパルス信号があったとします。その信号を、このプログラムによって
エッジカウントを行うと、1Hzのパルスのためカウンタの読み取り値は通常1秒置きに値がカウントアップします。
ところが、Whileループ内の待機関数によって待機させるミリ秒単位の時間、つまりここでいうmillisecond multipleの値に3000という値を渡している場合、Whileループが回るタイミングというのは3000msec つまり3秒置きに処理されます。3秒置きに処理されるのに、1Hzの周波数を読み取れるか?というと読み取れないように見受けられますが、、ここでいう3秒置きにソフトウェアタイミングで処理されているのは、カウンタの刻む値を見に行くタイミングが3秒置きになります。 カウンタのカウントアップ自体の動作は、ボードの内部Clockを使用しているためより高速なハードウェアタイミングで行われ、カウンタの刻む値は確実に毎秒アップしています。
したがって、添付のプログラムを下記の設定で実行した場合、DAQmx読み取り関数から読み取られる値は、0→3(3秒後)→6(3秒後)→9(3秒後)→・・・・・というように出力されます。
・1Hzの固定周波数の読み取りを行う
・待機関数による待機は3000msec
また、添付のVIは、読み取り値をシフトレジスタに入力して引き算をおこなっているため、上記の設定で添付のプログラムを動作させた結果、下記の演算結果が波形チャートに表示されます。
読み取り値
ル-プ0の処理 0 - 0 = 0
ループ1の処理 3 - 0 = 3
ル-プ2の処理 6 - 3 = 3
ループ3の処理 9 - 6 = 3
....
以上の内容を踏まえた上で、ご希望の動作を行うプログラムとは、どのような動作を行うプログラムなのか、具体的にお伝え頂くことは可能でしょうか。
”時間(X軸)を一定の速度で低下するアナログ信号が出力されるポートがあるので”>一定の速度で低下するのは周波数のことでしょうか?電圧値のことでしょうか。
”その信号を用いてプロットしようと考えています。” >プロットさせたいのは信号そのものでしょうか、それともエッジカウント後のカウント値でしょうか。
より具体的な内容でご説明頂けますと幸いです。
宜しくお願い致します。
日本ナショナルインスツルメンツ技術部
伊藤
09-28-2011 07:50 PM
早速の返信ありがとうございます。
まず前半部に関してですが、今は動作確認のためパルスジェネレータから出力されているパルス信号をカウントしています。
その時に出力パルス信号を1Hzの様な少ない周波数なら誤差はほとんどありません。しあかし、出力パルス信号を1000Hzの様な多い周波数に設定するとカウント数が±1ぐらいの誤差が出てしまいます。
最終的には50000Hz程度のパルスをカウントしたいと思っているので誤差は出来るだけ少なくしたいと思っています。
ちなみに、現在DAQデバイスはPXI-6281を使用しています。
X軸の精度を高めるためには、外部からサンプルクロックを入れないと思い、今回添付したviを作成しました。
しかし、使用する測定用コントローラからY軸の値はTTLパルスから出力されるのですが、X軸用の信号がアナログ信号しか存在しません。
したがって、このアナログ信号をX軸にプロットしたいと考えています。
アナログ信号は0~-1.4Vぐらいまで電圧が低下します。
プログラムの概念図を添付します。
09-29-2011 03:59 AM
domi_2005 様
詳しくお伝え頂きまして誠にありがとうございます。
”出力パルス信号を1000Hzの様な多い周波数に設定するとカウント数が±1ぐらいの誤差”というのは、1kHzの信号からエッジカウントを1秒間行ったところ999や1001という値をカウントする、ということで間違いないでしょうか。仰る通り、カウンタのカウントレジスタ値を読み取るタイミングはソフトウェアタイミングですので、スタート後の1秒後に読み取るというプログラムにしても、実際にDAQmx読み取り関数が処理されるのはWhileのループレートに依存するため読み取ってきたのは999msec後や1001msec後となって、値に±1ぐらいの誤差が生じる可能性は考えられます。
ただ、その誤差というのは外部からのサンプルクロックを使用して正確にカウントレジスタのカウントアップが反映されたとしても、DAQmx読み取り関数によるカウントレジスタ値をいつ読み取るか、という部分でソフトウェアタイミングでの読み取りタイミングのため、改善されません。
先の投稿では分かりやすい具体例として、1Hzという低周波で説明させて頂きましたが、PXI-6281のカウンタ周波数は
80MHzです。その精度は50ppmですので、カウント周波数の誤差は4000Hz、つまり79996000Hz~80004000Hzの速度でカウンタのカウント値は刻まれております。
PXI-6281のカウンタを使用したエッジカウントとは、誤差を考慮したとしても79.996MHzまでの周波数をもつパルス信号であれば、パルスの立ち上がりもしくは立下りを検出します。
集録のタイミングを合わせて同期させる目的、もしくはサンプリングのタイミングが固定周波数でなく外部からの信号のタイミングによって行う場合は、外部からの信号をサンプルクロックとして使用しますが、domi_2005 様の作成されたプログラムにてPFIラインにサンプルクロックとして使用するために渡している信号の周波数はいくつでしょうか。
また、プログラム概念図を添付頂き誠にありがとうございました。
”アナログ信号をX軸にプロットしたい”ということは、XYグラフを使用してX軸のデータにはアナログ信号、Y軸のデータにはカウンタによるエッジカウント値を表示させるということでしょうか。
Xのアナログ信号を簡易的に10サンプル用意し、具体的に表示させたプログラムのサンプルをご覧下さい。連続的な信号であるアナログ信号のデータ(-1.4~0)をX軸、エッジカウント値をY軸としてXYグラフに表示させると添付画像のグラフ2のようなグラフになります。グラフ1には、Y軸の値とアナログ信号の値をそれぞれ2プロットによって表示させたグラフになります。
グラフ1とグラフ2、を用意させて頂きましたが、どのようなグラフプロットをご希望とされているのでしょうか。
お手数ですが何卒宜しくお願い致します。
10-02-2011 10:42 PM - 編集済み 10-02-2011 10:44 PM
2011.10.03
日本ナショナルインスツルメンツ技術部の伊藤様
返信遅れて申し訳ありません。
知識不足で申し訳ないのですが、PFIラインの意味を教えてもらえないですか?
“XYグラフを使用してX軸のデータにはアナログ信号、Y軸のデータにはカウンタによるエッジカウント値を表示させるということでしょうか” ⇒その通りです。
グラフを添付していただき、ありがとうございました。
グラフ2が私の希望するグラフに近いと思いました。
X軸信号は一定速度で低下する電圧の信号なので、添付したグラフ2の様に横軸がX軸信号でプロットした値になるのが理想です。
グラフ2の様に横軸がX軸信号でプロットを私が作成した“カウンタ_サンプルクロック.vi”に組み込みたいのですがどのようにしたらよろしいですか?
よろしくお願いします。
10-04-2011 12:43 AM
domi_2005 様
PFIラインというのは、トリガ・クロック信号を渡すために用意されたデジタルラインになります。
仕様書からもご覧頂けますが、PXI-6281には24のPFIラインが用意されています。
グラフ表示についてですが、先のメールにて添付させて頂いたVIからご覧頂けるように、XYグラフを用います。XYグラフに表示させるには、それぞれの軸に対応させるため2つの1次元配列が必要になります。
X軸信号用のデータとして1次元配列; (例として) 1.2 0.3 0.5 0.4 0.7
Y軸信号用のデータとして1次元配列; (例として) 10 15 16 14 13
もし上記のようにデータが存在した場合、上記のデータはXYグラフ上で5つのポイントとしてプロットされます。
(1.2,10)/(0.3,15)/(0.5,16)/(0.4,14)/(0.7,13)
XYグラフを使用してご希望の動作を行うには、上記の通りそれぞれの軸に対するデータを1次元的なデータが必要になります。
そのため、WhileループやForループから自動指標付けの出力トンネルを用いて1次元配列を得て、どのデータをループの処理を終えた
後でデータを渡して表示させるのがXYグラフの基本的な使用方法になります。
添付のサンプルviをご参考にして下さい。
10-12-2011 10:50 PM
日本ナショナルインスツルメンツ技術部の伊藤様
添付していただいたviを参考にして、今回添付したviを作成しました。
このviではX軸を[ i ]で取っています。
この[ i ]をアナログ信号を集録するDAQアシスタントと交換すると、そのアナログ信号をX軸にプロット出来るでしょうか?
また、このプログラムを動作したことによる結果を保存したい時はどのようにしたらいいのでしょうか?
10-20-2011 01:18 AM
domi_2005 様
VI添付して頂き誠にありがとうございます。
>この[ i ]をアナログ信号を集録するDAQアシスタントと交換すると、そのアナログ信号をX軸にプロット出来るでしょうか?
DAQアシスタントからの出力値が単一スカラーの数値であれば、ご希望の通りプロット出来ます。DAQアシスタントの読み取るサンプル数を
1にすることで、ループが回る度に1つの値のみ読み取るように設定されます。
ただし、配列連結追加とシフトレジスタを利用する際には注意が必要です。Whileループが回る度に、配列連結追加によって配列サイズが大きくなるデータは、LabVIEWが確保してきた配列用のメモリが一定量埋まると再割り当てを行います。作成されたプログラムは、PCのスペックによって差こそあれ、長時間実行し続けると遅かれ早かれメモリエラーを起こします。この問題を回避するには、Whileループが回り始める前に任意の配列サイズの配列を作成しておき、Whileループの処理ではデータと置換していくようにプログラムを編集します。そぅすることで配列サイズ全体としては固定になり、メモリの再割り当てを行わなくなるようにします。
また、配列サイズをXとした時には、WhileループがX回処理することで止まるように停止条件を編集します。
結果を保存したい場合には、大きく分けて下記の2通りあります。
1. 上位File I/O VIを用いて保存する。 → ループの処理が終わった後に保存
2. 下位File I/Oを用いて保存する。 → ループが回る度に得られたデータを保存
参考になるVIを、お送り頂いたプログラムから変更致しましたので添付致します。
以上、宜しくお願いします。
10-27-2011 05:40 AM
日本ナショナルインスツルメンツ技術部の伊藤様
viを添付して頂いてありがとうございます。
早速試してみますと、添付図の様になりました。
この時の入力パルス信号は133Hzなのですが、最初に約420個のパルスをカウントしています。
これは何が原因になっているのですか?
また、赤い丸で囲っている斜めの線は、何か意味があるのですか?
保存するデータは、1s毎の総カウント数ではなく、
フロントパネルに配列で表示されているX値とY値のデータを同時に保存したいと考えています。
つまり、添付してある表のように保存したいと考えています。
申し訳ありませんが、よろしくお願い致します。
10-31-2011 10:13 PM
domi_2005 様
>この時の入力パルス信号は133Hzなのですが、最初に約420個のパルスをカウントしています。これは何が原因になっているのですか?
最初に作成して動作確認した時点でのデータが残ってしまっていた可能性があります。XYグラフのYの値として入力しているい1次元配列のワイヤから、表示器を作成してデータをご確認下さい。
>また、赤い丸で囲っている斜めの線は、何か意味があるのですか?
斜めの線の部分は、単純にプロットを直線で結んでいる結果です。0というデータが1000個ある1次元配列を定義し、そこから集録されたデータを置換しているため、置換が行われていない部分はまだ0というデータを保持しております。
X値とY値の保存につきましては、参考になるプログラムのサンプルを作成致しましたので添付致します。ご希望のプログラムを作成する上でこちらをご参考にして頂けますようお願い致します。