08-24-2020 01:16 AM
電圧自動計測プログラムを作りたいと思っています。
イメージとしては以下になります。
オシロスコープのチャンネル0と1にそれぞれ電圧(方形波)を入力。
印加されている電圧がそれぞれグラフでリアルタイムに見れる。
任意時間ごとに電圧値を記録し、csvファイルで保存。
大分ざっくりですが、このようなプログラムを作りたいです。
初心者故、何から手を付けてよいかわからない状態です。
アドバイス等頂けると幸いです。
使用したいデバイスは以下になります。
オシロスコープ:NI USB-5132/5133
LabVIEW 2017
解決済! 解決策の投稿を見る。
08-24-2020 03:11 AM
take76さん、はじめまして。
始めたばかりということなので、すでに実施済みかもですが、ざっくり流れを書いてみます。
・NI-Scopeのインストール:ドライバのインストールです。CDなどもあったと思いますし、ウェブからもダウンロードできます。LabVIEW 2017であれば、最新のNI-Scope20.0でも互換性があるので、インストールをしてください。
・サンプルを検索:ヘルプ>>サンプルを検索でサンプルファインダーを開いて、左下からハードウェア(USB-5132/33)を追加した上で、チェックを入れると利用できるサンプルがフィルタできます。
・サンプルはハードウェア入力と出力>>NI-SCOPE>>Getting Started あたりが良いかと思います。
・サンプリングレートはどれくらいでしょうか。また記録した電圧にて何を確認されたいのでしょうか。(最大値がみたいとか、方形波に乗っかるノイズが見たいとか)
あとは「任意時間」の間隔がある程度余裕があれば、ループの中でデータを形成した上でスプレッドシートに書き込みの関数でデータを保存することになると思います。(条件によって、キューの利用や変数の利用も必要になると思います。)
最終的なCSVのイメージなども合わせて検討いただくとより詳細にアドバイスできるかと思います。
また、すでに試されたことまで記載いただくとそこをベースにお話も可能かと思います。(NI-Scopeのサンプルを動かすところまではできた、など)
08-25-2020 12:08 AM
ke525さん ご回答ありがとうございます。
お教えいただいたGetting Startedについては動作することを確認いたしました。
チャンネル0は印加電圧となっておりまして、確認したいのはチャンネル1の1個の方形波あたりの振幅なのですが、言葉だけでは説明し難いので、添付画像を参照して頂けるとありがたいです。
添付画像のV1,V2,V3の値を1個の方形波ごとに求めたいと思っています。
黒い「with PD」の波形がチャンネル1に入力される電圧で、青い「without PD」の波形は計算値となっております。V1,V2,V3はそれぞれ黒い波形と青い波形の差になっており、符号を残したまま記録したいです。添付画像の場合、V1=-40[V]、V2=35[V]、V3=30[V]といった感じです。サンプリングレートは1.5M程度で周波数は10kHz~50kHzを想定しています。
最終的には求めたV1,V2,V3をある式に入れて計算し、一つの答えを出します。
それを1個の方形波ごとに0行1列の配列にしたいと思っております。
大変分かりにくくて申し訳ございませんが、ご回答いただけると幸いです。
08-25-2020 09:47 AM
take76さん
おおよそされたいことがわかりました。ありがとうございます。
まずは、一つ分の波形を取って、V1-3を計算するところからですね。
トリガーを指定して、波形を取ると、Getting Startedの場合はクラスタ配列で結果が出てくると思いますので、
・指標配列を使って、チャンネル0と1に分割
・それぞれを 名前でバンドル解除 を使って 波形(wfm)を抽出
・必要に応じて部分配列を使って、1波形分を抽出
・抽出したチャンネル0と1の配列に、計算を入れてV1-3を計算
・とある式に入れて X を演算
ここからはデータを保存しますが、2通りくらいあると思います。
1. ループごとに答えをまとめる空の配列を準備していただき、そこに追加(ただし、集録時間が長いと途中で処理時間が間に合わなくなる可能性あり)手っ取り早いのは、X をWhileループの右側につなげて、ワイヤがつながっている■を右クリックからトンネルモードをIndexにします。(自分の環境がCommunityなので英語なのでちょっと文言が違うかもですが。。。)Whileループから出てきたXの配列を最後にファイルに保存。
2. ループごとにファイルに追加保存。ここは若干テクニックが必要で、スプレットシートに書き込みの関数は、関数の中で ファイルを開く→書き込む→閉じる、をしており、ループの中で使うと効率的でなく、データが増えてくるとループ処理時間に影響を与えてしまいます。
一番良いのは、下記のイメージのように、Whileループの外で 開くと閉じる とすることで処理への影響を軽減できます。
V1-3ですが、やり方は色々とあると思いますが、例えば、添付いただいた絵のような1波形分が部分配列で抽出できているのであれば、
V1 = 青の最小値 - 黒の最小値
V2 = 黒の最大値 - 青の最大値
V3 = 黒の配列の最後の値 - 青の配列の最後の値
とかでおおよそは出せると思います。
V1、V2が若干横着してしまっているので、立上りと立ち下がりのタイミングの値を取ろうと思ったら、もうちょっと工夫が必要かと思います。
ハードウェアが無いので、処理時間とループの影響など評価はできないですが、ステップごとに進めていただければなんとかなるかなと思ってます。
08-27-2020 07:16 AM
ke525さん 回答ありがとうございます。
教えていただいたことを自分なりに取り入れて作ってみました。
問題点を下記にまとめましたので、アドバイスいただけないでしょうか?
また、作製したviを添付いたしますので、そちらを参照して頂けると幸いです。
・今回はXについてのみデータの保存を試みたのですが、うまくいきませんでした。もう少し詳細に教えていただけないでしょうか?
・部分配列を使って1波形分を抽出する際に、今回は0~50サンプル目(1Mサンプルの内)までに絞ってみたのですが、綺麗に方形波が出るときと、方形波が見切れるときがあるのですが、何か解決策はありますでしょうか?
・また、部分配列で抽出すると最初の方形波しか見ることができません。すべて見る場合にはどうすればよいですか?(例えば繰り返し周波数が10kHzの場合だと、1秒間に20k個の方形波があるのですが、そのうちの最初の1個しか見れません。)
長くなりましたが以上になります。
ご回答いただけると幸いです。よろしくお願いいたします。
08-28-2020 02:41 AM
take76 さん、
>>・今回はXについてのみデータの保存を試みたのですが、うまくいきませんでした。もう少し詳細に教えていただけないでしょうか?
上記は、どのようにうまくいかないのでしょうか。ちなみに、今は見たところバイナリで保存するようになっていますが、意図されて、でしたでしょうか。
為念ですが、ファイル書き込みはバイナリとテキストの2種類あるので、単純にデータを見たいのであれば、テキストが良いかと思います。
パフォーマンス観点ではバイナリが良いですが、開くときもちゃんと開かないと文字化けになります。
>>・部分配列を使って1波形分を抽出する際に、今回は0~50サンプル目(1Mサンプルの内)までに絞ってみたのですが、綺麗に方形波が出るときと、方形波が見切れるときがあるのですが、何か解決策はありますでしょうか?
これはトリガーを設定して、いつも同じタイミングの波形を見れるようにするとよいかと思います。
例えばチャンネル0をソースとして、立ち上がりエッジで0V以下から0V以上に変わるタイミングをトリガーとして取れば、ほぼ同じ波形が見えるようになると思います。
なお、若干不安なので試していただきたいですが、下の図の3つの関数はWhileループの左側に出したほうが良かった気がします。(試してエラーになってしまったら戻してくださいm(_ _)m)
設定関連はWhileループ外で行わないと、毎回設定しようとしてパフォーマンス低下の原因になる気がします。違ったら申し訳ないですが。。
>>・また、部分配列で抽出すると最初の方形波しか見ることができません。すべて見る場合にはどうすればよいですか?(例えば繰り返し周波数が10kHzの場合だと、1秒間に20k個の方形波があるのですが、そのうちの最初の1個しか見れません。)
これはチャンネル0と1に分けたグラフを全波形分みたいということですか?
一応、すでにある「波形グラフ」がチャンネル0と1の全波形データかと思いますが、そちらではだめでしょうか。
ちょっとうまく理解できていない気がするので、単純に波形グラフを部分配列で抽出する前のワイヤにつなげればよいかと思ったりしていますが、違いますでしょうか。
08-30-2020 08:37 PM
ke525さん ご回答ありがとうございます。
・データの保存についてですが、ご指摘のようにファイル書き込みをテキストに変更したところ、うまくいきました。ありがとうございます。
・設定関連については、Whileループ外に出したところエラーもなかったため、今後はこちらを使わせていただきます。
・トリガについてもうまくいったのですが、説明が不足しておりましたので、補足させていただきます。今回サンプリングレート1MS/s、レコード長1Mで測定しているため1秒間のデータが取得できました。その1秒間に取得できるすべての方形波について、それぞれV1~3を求めたいという意味で前回質問させていただきました。そこでforループを使おうとしたのですが、部分配列で抽出する際に下図のような不良ワイヤのエラーが出てしまいます。何か解決策はありますでしょうか?
ご回答よろしくお願いいたします。
08-31-2020 01:23 AM
ke525さん
先ほどの質問ですが自動指標を解除することで無事完成させることができました。
いろいろ教えていただきありがとうございました。