09-30-2014 09:00 PM
アナログ(8Ch)とディジタル(1Ch)を外部クロックに同期してサンプリングしています。
外部クロックにノイズが入る場合があるので以下の手順で外部クロックにフィルターをかけているのですが、PCI-6250(M-Series)では正常に動作するのですが、
PCIe-6351(X-Series)では、AIタスクを開始した時に以下のエラーがでます。
X-SeriesではM-Seriesと同じ方法は使用できないのでしょうか?ご存知の方がいらしたら教えて頂けないでしょうか、宜しくお願いします。
1.手順
#define AI_CHANNEL "Dev1/ai0:7"
#define DI_CHANNEL "Dev1/port0/line1" // [P0.1]
#define AI_SAMPLING_CLOCK "/Dev1/PFI8" // [PFI 8/P2.0]
#define DI_SAMPLING_CLOCK "/Dev1/ai/SampleClock"
#define CLOCK_FILTER "Dev1/ctr0" // [PFI 8/P2.0]
#ifdef X_SERIES
#define FILTER_PULSE_WIDTH 5.120000e-6 // 5.12 usec (X-Series)
#else
#define FILTER_PULSE_WIDTH 6.425000e-6 // 6.425 usec (M-Series)
#endif
// 外部クロックのフィルター
// ClockFilter[Ctr0]タスクを作成する
DAQmxCreateTask("", &clockFilterTaskHandle);
// ClockFilter[Ctr0]を作成する
edge = DAQmx_Val_Rising;
DAQmxCreateCICountEdgesChan(clockFilterTaskHandle, CLOCK_FILTER, "", edge, 0, DAQmx_Val_CountUp);
// ClockFilter[Ctr0]の最小幅を設定する
dDIGFilterTime = FILTER_PULSE_WIDTH;
DAQmxSetCICountEdgesDigFltrMinPulseWidth(clockFilterTaskHandle, CLOCK_FILTER, dDIGFilterTime);
// ClockFilter[Ctr0]を有効にする
DAQmxSetCICountEdgesDigFltrEnable(clockFilterTaskHandle, CLOCK_FILTER, DAQ_MX_TRUE);
// ClockFilter[Ctr0]のタスクをコミットする
DAQmxTaskControl(clockFilterTaskHandle, DAQmx_Val_Task_Commit);
// サンプリング
// AIタスクを作成する
DAQmxCreateTask("", &aiTaskHandle);
// DIタスクを作成する
DAQmxCreateTask("", &diTaskHandle);
// AIチャネルを作成する
DAQmxCreateAIVoltageChan(aiTaskHandle, AI_CHANNEL, "", DAQmx_Val_Diff, -DAQ_MX_AI_FULL_VOLT, DAQ_MX_AI_FULL_VOLT, DAQmx_Val_Volts, NULL);
// AIサンプリングクロックを設定する
dSampleRate = SAMPLE_COUNT * 2.0;
edge = DAQmx_Val_Rising;
sampleCount = SAMPLE_CYCLE * SAMPLE_COUNT;
DAQmxCfgSampClkTiming(aiTaskHandle, AI_SAMPLING_CLOCK, dSampleRate, edge, DAQmx_Val_FiniteSamps, sampleCount);
// DIチャネルを作成する
DAQmxCreateDIChan(diTaskHandle, DI_CHANNEL, "", DAQmx_Val_ChanPerLine);
// DIサンプリングクロックを設定する
DAQmxCfgSampClkTiming(diTaskHandle, DI_SAMPLING_CLOCK, dSampleRate, DAQmx_Val_Rising, DAQmx_Val_FiniteSamps, sampleCount);
// DIタスクを開始する
DAQmxStartTask(diTaskHandle);
// AIタスクを開始する
DAQmxStartTask(aiTaskHandle);
※)ここでエラーが発生する
2.エラー
DAQmxStartTask error : -200775(Terminal has already been configured with a different Minimum Pulse Width by another task.)
3.その他
ちょっと検索したら、Xシリーズではこの対策は必要ない?(英語なのではっきりとした意味は分かりません)というような記述があるようですが、
実際にノイズが入っていると思われるのは、USBタイプ(USB-6351、X-Series)のものです。
http://digital.ni.com/public.nsf/allkb/9ECE7DBE7DF338BD86256F8600734A41
Note: This workaround is not required for X Series DAQ Devices under most cases since
digital filtering is built into the DAQmx Driver for these devices for more subsystems.
解決済! 解決策の投稿を見る。
10-02-2014 04:18 AM
DaqQ 様
こちらで調査させて頂いたところ、-200775のエラーが発生するのはCtr0へ2回ほど接続しているためと思われます。
X Seriesの場合はPFI8を指定すると内部フィルタの前の信号を参照している可能性がございますので、
DAQmxCreateCICountEdgesChanで1回目の接続、DAQmxCreateAIVoltageChanで2回目の接続になると考えます。
(M Seriesでエラーが発生しない理由としては内部経路が異なるためと考えます。)
対策としては AI_SAMPLING_CLOCK を明確に "/Dev1/Ctr0Source" と指定していただき再度動作をご確認いただけますでしょうか。
また、X Seriesの場合はCounterを消費せずに入力信号を直接フィルタすることが可能になりますので、
Clock Filter関数の替わりに以下の関数を使用することで効率良くリソースを利用いただけると思います。
DAQmxSetSampClkDigFltrEnable
http://zone.ni.com/reference/en-XX/help/370471Y-01/mxcprop/attr221e/
DAQmxSetSampClkDigFltrMinPulseWidth
http://zone.ni.com/reference/en-XX/help/370471Y-01/mxcprop/attr221f/
デジタル信号のサンプリングクロックはアナログ用のクロックを参照しているようですので、
上記の関数はAIサンプリングクロックを設定されている部分に追加することになると考えています。
技術部 山縣
10-02-2014 10:12 PM
NI 技術部 山縣様
お世話になっています。ご回答、有難うございました。教えて頂いた通りに修正したらエラー発生しませんでした。
また、X Seriesについて教えて頂きたいのですが、DAQmxSetSampClkDigFltrEnable、DAQmxSetSampClkDigFltrMinPulseWidth関数は全てのDI(※1)で使用できるのでしょうか。
ボードでもUSBユニット(※2)でも同じプログラムで使用可能ですか。お手数ですが宜しくお願いします。
(※1) 外部クロックとして使用していないDI、バッファオペレーションでクロックに同期して連続で読み込んでいるDIなど。
(※2) PCIe-6351、USB-6351、USB-6353等
10-05-2014 09:18 PM
Xシリーズの場合、デジタル入力チャンネルはデジタルフィルタに対応しているようです。
詳細や他に対応している端子に関しては以下のリンク先をご確認願います。
XシリーズおよびNI661デバイスのデジタルフィルタに関する注意事項
http://zone.ni.com/reference/ja-XX/help/370466AA-0112/mxdevconsid/digfiltxseries/
また、USBやPCI関係なく対応していると思います。
技術部 山縣
10-05-2014 10:39 PM
NI 技術部 山縣様
お世話になっています。了解しました。有難うございます。