ADボードでリアルタイムサンプリング
プログラムはこちらです
#define NUM 20000
void CAdDrawGraphDlg::OnFileout()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
int nRet;
int i = 0, j = 0, file_count = 0;
char fname[32];
HANDLE hDeviceHandle;
ADSMPLREQ SmplConfig;
ADBOARDSPEC BoardSpec;
WORD wSmplData;
FILE *fp = NULL;
ULONG ulSmplNum = NUM;
/* デバイスのオープン */
if((hDeviceHandle = AdOpen("FBIAD1")) == INVALID_HANDLE_VALUE){
AfxMessageBox("デバイスのオープンに失敗しました",MB_OK, 0);
return;
}
nRet = AdGetSamplingConfig(hDeviceHandle,&SmplConfig);
if(nRet != AD_ERROR_SUCCESS){
AfxMessageBox("サンプリング設定情報の読み出しに失敗しました",MB_OK, 0);
}
nRet = AdGetDeviceInfo(hDeviceHandle, &BoardSpec);
if(nRet != AD_ERROR_SUCCESS){
AfxMessageBox("デバイスの情報取得にに失敗しました", MB_OK, 0);
}
while(1){ /* 無限ループ */
/*時間の取得*/
int H,M,S;
/* config初期化 */
SmplConfig.SmplChReq[0].ulChNo = 2;
// SmplConfig.ulSmplNum = NUM * i;
//SmplConfig.ulTrigMode = AD_ETERNITY;
SmplConfig.fSmplFreq = 20000;
SmplConfig.SmplChReq[0].ulRange = AD_5V;
nRet = AdSetSamplingConfig(hDeviceHandle, &SmplConfig);
if(nRet != AD_ERROR_SUCCESS){
AfxMessageBox("サンプリング条件設定に失敗しました",MB_OK, 0);
}
nRet = AdStartSampling(hDeviceHandle, FLAG_SYNC);
/* 書き込みファイルのオープン */
sprintf(fname, "DATA.%d.csv", file_count);
fp = NULL;
if((fp = fopen(fname, "w")) == NULL){
/* error */
return;
}
setbuf(fp, NULL); /* ライブラリ内バッファリングを無効にする */
for(i = 0;; i++){
SmplConfig.ulSmplNum = NUM * i;
wSmplData = 0;
/* NUM回データを取得 */
for(j = 0; j < NUM; j++){
ulSmplNum = 1;
double val;
if(AdGetSamplingData(hDeviceHandle, &wSmplData, &ulSmplNum)
!= AD_ERROR_SUCCESS){
val = wSmplData;
val = ((val * 10) / 4096) - 5;
fprintf(fp, "%d, %f\n", i * NUM + j, val);
//fprintf(fp, "[%d], %d, %d\n", ulSmplNum, i * NUM + j, wSmplData);
}
else{
val = wSmplData;
val = ((val * 10) / 4096) - 5;
CTime theTime=CTime::GetCurrentTime();
// mm=theTime.GetMonth();
// dd=theTime.GetDay();
H =theTime.GetHour();
M =theTime.GetMinute();
S =theTime.GetSecond();
fprintf(fp, "%d,%d:%d:%d, %f\n", i * NUM + j,H,M,S, val);
//fprintf(fp, "%d, %d, %d\n", ulSmplNum, i * NUM + j, wSmplData);
}
}
if(nRet != AD_ERROR_SUCCESS){
AfxMessageBox("CSVファイル作成に失敗しました", MB_OK, 0);
}
} /* end of for */
fclose(fp);
file_count++;
} /* end of while */
/* デバイスのクローズ */
nRet = AdClose(hDeviceHandle);
if(nRet != AD_ERROR_SUCCESS){
AfxMessageBox("デバイスのクローズに失敗しました");
}
fclose(fp);
}
問題は20000点で1秒時刻が進むはずですが2000点で1秒時計が進んでしまいます。
時刻以外は正常で、1周期1sの波形を入力したときはそのしっかり20000点存在するので1秒間に
20000点でサンプリングしています。
解決策があれば教えてください。
お礼
回答ありがとうございます。 よろしければ、もう少し詳しく教えてください。 お願いします。
補足
えぇ、多分そうでは無いかとも思ったのですが…… 何処を変える(オーバーライドする?)のか、教えていただけないでしょうか?