08-29-2017 04:50 AM
大学生です。
現在USB6009を用いて電圧計測を行っているのですが、
USB6009等を触るのがはじめてになります。
VisualStudio2015でプログラミングをしています。
照度センサ(NJL7502L)を用いて、電圧を測定するプログラムを作成したいのですが、うまくいきません。回路は添付の通りになっています。抵抗の大きさは10KΩです。
1000Hzで10秒間計測したいと考えているのですが、添付のような結果となります。
また,CSVファイルにも電圧を出力したいと考えているのですが、方法が分かりません。
-----------------------------------------------------------
int main(void)
{
int32 error = 0;
TaskHandle taskHandle = 0;
int32 read;
float64 data[10000];
char errBuff[2048] = { '\0' };
/*********************************************/
// DAQmx Configure Code
/*********************************************/
DAQmxErrChk(DAQmxCreateTask("", &taskHandle));//
DAQmxErrChk(DAQmxCreateAIVoltageChan(taskHandle, "Dev1/ai0", "", DAQmx_Val_Cfg_Default, -10.0, 10.0, DAQmx_Val_Volts, NULL));
DAQmxErrChk(DAQmxCfgSampClkTiming(taskHandle, "", 1000.0, DAQmx_Val_Rising, DAQmx_Val_FiniteSamps, 10000));
/*********************************************/
// DAQmx Start Code
/*********************************************/
DAQmxErrChk(DAQmxStartTask(taskHandle));
/*********************************************/
// DAQmx Read Code
/*********************************************/
DAQmxErrChk(DAQmxReadAnalogF64(taskHandle, 10000, 10.0, DAQmx_Val_GroupByChannel, data, 10000, &read, NULL));
if (read>0)
printf("Acquired %d samples\n", (int)read);
Error:
if (DAQmxFailed(error))
DAQmxGetExtendedErrorInfo(errBuff, 2048);
if (taskHandle != 0) {
/*********************************************/
// DAQmx Stop Code
/*********************************************/
DAQmxStopTask(taskHandle);
DAQmxClearTask(taskHandle);
}
if (DAQmxFailed(error))
printf("DAQmx Error: %s\n", errBuff);
printf("End of program, press Enter key to quit\n");
getchar();
return 0;
}
解決済! 解決策の投稿を見る。
08-29-2017 08:32 AM - 編集済み 08-29-2017 08:34 AM
NJL7502Lのようなフォトトランジスタですが、USB6009で測るべきなのはNJL7502Lの両端の電圧ではなく、直列につながっている10kΩの抵抗の両端です。
フォトトランジスタは照度に応じた電流源とみなすことが出来て、その電流が直列の抵抗に流れるので、その電圧を測るのです。
ちなみに回路写真の方は抵抗の方がVCCにつながっているように見えますが(赤がVCCなら)・・それは今どちらでもよくて、とりあえずUSB6009は「抵抗の両端」の電圧を測るようにしてください。
(回路写真・回路図のような接続では、暗い時5Vくらいで、200~300luxで約4Vまで下がり、1000~2000luxで0Vくらいまで落ちる挙動なのではないかと予想)
それから「うまくいかない」とのことですが、それだけだと、どううまくいってないのか分からないので、「どういう結果になるはずなのに、そうならずこれこれの結果になっている」としないと、どううまくいかないのか分からないので・・
1000Hzで10秒計測するとすると、10000サンプルだと思いますが、計測結果は
if (read>0)
printf("Acquired %d samples\n", (int)read);
で「Acquired 10000 samples」と表示され、
DAQmaxFailed(error)でエラーが無いので「DAQmx Error: xxxx」は表示されず、
その次の行の
printf("End of program, press Enter key to quit\n");
で「End of program, press Enter key to quit」と表示されているので、結果の表示上はうまくいっているように見えますが、、、
08-29-2017 09:17 AM
丁寧にご回答いただきまして、ありがとうございます。
USB6009で「抵抗の両端」の電圧を測るように測定を行いたいと思います。
結果については、おっしゃる通りです。
質問したかったのは、
CSVファイルにUSB6009で取得した電圧値を記録したいのですが、どのようにプログラムを追加していけばいいのかが分からないということでした。
分かりにくい質問をしてしまい申し訳ありません。
08-30-2017 07:29 AM
最初のご投稿が「添付のような結果になってうまくいかない」と「また、CSVに出力したい」の2つが課題と読んでいたので・・
「データは取れている」ということでしょうか。あるいは、まだ出力できるようになっていないためデータ数はOKだがデータが取れているかどうか確認できないということかも知れませんが。
データ数がOKなので配列には取りこめているとして、「CSVに書き出す」のならLabVIEWの疑問ではなくC/C++の疑問でしょうかね。「既にdata[] という配列に read 個のデータが格納されている」「これをcsvファイル(要はテキストファイル)に書き出したい」ということであれば、ご存知かも知れませんが、fopen()関数、fprintf()関数、fclose()関数を使ってできると思います。
======
#include <stdio.h> //ファイル入出力
:
/*** main冒頭変数宣言 ***/
FILE *fp; //FILE構造体
int i;
/*** main途中データ取得後 ***/
if(NULL!=(fp=fopen("c:\\folder\\filename.csv","w"))){
// パス区切りの"\"は2個並べる。漢字はダメ文字があるので注意("表"など)
for(i=0; i<read; i++){
fprintf(fp,"%.6f\n",data[i]); //小数点以下6桁で順次出力
}
fclose(fp);
}
======
みたいなのではダメですかね。
csvはカンマ区切りテキストですが、縦1列だけで構成されるcsvならカンマ不要で改行だけ入れていけば良いので・・
08-30-2017 09:20 PM
ご回答いただきまして、有難うございます。
先日の回答をいただいてから、プログラムを変更しまして、
無事CSVファイルに出力ができました。
丁寧に教えていただきまして有難うございました。