NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

アナログ出力ボード:NI67シリーズのNI-DAQmxAPIを使用して、各CH独立した更新タイミングで値を出力する方法を教えてください。

いつもお世話になっています。
 
現在、NI6731を使用し、Visual Basic 6.0 でNI-DAQmxAPIを利用したソフトを作成しています。
目的は、上記ボードを使用して、4チャンネルの周波数の異なるSIN波形を出すことです。
周波数は、アプリケーションのGUIにより4チャンネル独立して変更できるようします。
 
今現状では、
変更のイベントが起きた際、
DAQmxCfgSampClkTimingで、rate(更新タイミング)を変更し、
DAQmxWriteAnalogF64で出力波形の更新タイミングのみ変更を行って周波数変更を行っています。
その場合、4チャンネルとも、更新タイミングが変わってしまい、周波数が全チャンネルずれてしまいます。
DAQmxStopTaskを行って、DAQmxCreateTaskを再度行うことも試しましたが、
一瞬、周波数の不自然な変更が起こってしまいます。
 
4チャンネルそれぞれを独立して(非同期)に更新させることはできませんでしょうか。
 
以上よろしくお願いします。
 
 
 
0 件の賞賛
メッセージ1/5
3,748件の閲覧回数
uzushio様

周波数を変更する場合ですが、いったんタスクを停止し、再度設定を行い、そしてタスクを再度スタートさせる方法になるかと思います。
具体的には、

DAQmxStopTask()
設定や違うデータの書き込み
DAQmxStartTask()

といった順番になります。

もし上記の方法でも問題が生じる場合には、
再度ディスカッションフォーラムに投稿していただけますでしょうか。
また、その際にはどのようにプログラムされているかも教えていただければと思います。

お手数ですがよろしくお願いいたします。

日本ナショナルインスツルメンツ
湯田
メッセージ2/5
3,720件の閲覧回数

早速のご返信ありがとうございました。

説明不足で申し訳ございません。

 

>周波数を変更する場合ですが、いったんタスクを停止し、再度設定を行い、そしてタスクを再度スタートさせる方法になる。

 

上記の方法で、確認いたしましたが、周波数の不自然な変動が起こってしまいます。(具体的には、60.00Hz→60.01Hzと連続的に変動させたいのですが、60.00Hz→59.0Hz(一瞬)→60.01Hzとなってしまい、連続的に変動しない。)

これは、タスクを停止し、再設定を行っている間、微小な時間ですが、信号が出力されないため起こるのではないでしょうか?

以下、御社のサンプルに押しボタンのGUIを追加し、以下のコードを追加しました。不連続な周波数の変更が確認できると思います。

Private Sub Command1_Click()

‘再設定

    samplesPerBufferTextBox.Text = samplesPerBufferTextBox.Text + 10

    desiredSampleClockRate = ((frequencyTextBox.Text) * (samplesPerBufferTextBox.Text)) / (cyclesPerBufferTextBox.Text)

    sampsPerCycle = samplesPerBufferTextBox.Text / cyclesPerBufferTextBox.Text

    resultingFrequency = (desiredSampleClockRate) / (sampsPerCycle)

   

    GenerateSineWave resultingFrequency, amplitude, desiredSampleClockRate, numSampsPerChannel

 ‘タスク停止

    DAQmxErrChk DAQmxStopTask(taskHandle)

‘再スタート

    DAQmxErrChk DAQmxWriteAnalogF64(taskHandle, numSampsPerChannel, True, 10#, _

        DAQmx_Val_GroupByScanNumber, data(0), sampsPerChanWritten, ByVal 0&)

   

End Sub

 

 

上記の不連続な変動を防ぐために、常に同じ形の波形を出力し、

DAQmxCfgSampClkTimingで、rate(更新タイミング)を変更し、

DAQmxWriteAnalogF64で出力タイミングのみの変更を行って、出力波形の周波数変更を行っています。

 

そこで、

4チャンネルそれぞれを独立して(非同期)に、更新タイミングを変更させることはできませんでしょうか?

また、なるべく周波数が不連続に変動しない出力方法はありませんでしょうか?

 

以上よろしくお願いします。

0 件の賞賛
メッセージ3/5
3,706件の閲覧回数
uzushio様

ご連絡と詳細情報ありがとうございます。

4チャンネルそれぞれを独立して更新タイミングを変更する方法ですが、
出力される周波数の値を各チャンネルに対して別々に更新を行うことは難しくなります。
(ここでは、タスクを各チャンネルに対して止めて、ほかのチャンネルからは出力させておくということでよろしいでしょうか)

もしスムーズに周波数を変更したい場合には、
カウンタなどを使用してパルスを生成し、外部クロックとしてアナログ出力を行っていただく方法がございます。
しかし、こちらはすべてのチャンネルに反映されてしまうため、
複数チャンネルを別々に変更する際にはご使用いただくことができません。

そのため、もし可能であれば、
あらかじめ出力したい周波数のデータを作成し、
そのデータをLabVIEWで読み込み、ハードウェアに出力させる方法がございます。

もし周波数をスイープさせるということであれば、あらかじめファイルにデータを書き込んでいただければ
スムーズに周波数を変更していただくことも可能かと思われます。

上記に関してご質問などございましたら、
再度ディスカッションフォーラムよりご連絡ください。

日本ナショナルインスツルメンツ 湯田
0 件の賞賛
メッセージ4/5
3,658件の閲覧回数
日本ナショナルインスツルメンツ 湯田様
 
いつも大変お世話になっております。uzuhioです。
ご返信と詳細な情報提供ありがとうございました。

> タスクを各チャンネルに対して止めて、
> ほかのチャンネルからは出力させておくということでよろしいでしょうか
はい、ご理解されている通りです。
 
やはり、各チャンネルに対して別々に更新を行うことは難しいのですね。

> そのため、もし可能であれば、
> あらかじめ出力したい周波数のデータを作成し、
> そのデータをLabVIEWで読み込み、ハードウェアに出力させる方法がございます。
この方法しかなさそうなので、再度検討させて頂きます。
 
どうも、込み入った質問になり申し訳ございませんでした。
また、ご丁寧なご解答ありがとうございました。
 
今後もよろしくお願い申し上げます。
 
 

 
0 件の賞賛
メッセージ5/5
3,654件の閲覧回数