NI製品ディスカッション

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

C言語で電圧を計測する為のプログラム(照度センサ)

解決済み
解決策を見る

大学生です。

現在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;
}

すべてをダウンロード
0 件の賞賛
メッセージ1/5
3,883件の閲覧回数
解決策
トピック作成者yanyan229が受理

NJL7502Lのようなフォトトランジスタですが、USB6009で測るべきなのはNJL7502Lの両端の電圧ではなく、直列につながっている10kΩの抵抗の両端です。

 170829-pic1.png

 

 

 

 

 

 

 

 

 

 

フォトトランジスタは照度に応じた電流源とみなすことが出来て、その電流が直列の抵抗に流れるので、その電圧を測るのです。

ちなみに回路写真の方は抵抗の方が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」と表示されているので、結果の表示上はうまくいっているように見えますが、、、

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

丁寧にご回答いただきまして、ありがとうございます。

USB6009で「抵抗の両端」の電圧を測るように測定を行いたいと思います。

 

結果については、おっしゃる通りです。

質問したかったのは、

CSVファイルにUSB6009で取得した電圧値を記録したいのですが、どのようにプログラムを追加していけばいいのかが分からないということでした。

分かりにくい質問をしてしまい申し訳ありません。

0 件の賞賛
メッセージ3/5
3,830件の閲覧回数
解決策
トピック作成者yanyan229が受理

最初のご投稿が「添付のような結果になってうまくいかない」と「また、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ならカンマ不要で改行だけ入れていけば良いので・・

 

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

ご回答いただきまして、有難うございます。

先日の回答をいただいてから、プログラムを変更しまして、

無事CSVファイルに出力ができました。

 

丁寧に教えていただきまして有難うございました。

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