发表于:2003-07-24 15:34:00
6楼
非常感谢GaryLin的回复。我采集到数据好像都是大于零的情况。比如空采的话,数据都是32767。我刚才作了一个试验。我采用手册中转化电压的函数,这个函数,需要采集后的数据作为其中的一个参数。得到的结果是对于32767的数据而言,电压差不多就是0。我采用的是Unipolar模式即电压范围是0到10伏(Bipolar是+-5伏)。这么看来32767就是相对于0伏了。虽然电压我已经得到了。但是对于数据仍旧有参考价值。我所用的卡是ADLink PCI-9118/HR.这是我大体上的编程代码。
#define CardNumber 0
#define LastADChan 1
#define ADChanCount 2
#define ScanCount 65536
#define SampleRate 16000.0000
//AI config constants definition
#define ModeCtrl P9118_AI_UniPolar|P9118_AI_SingEnded
#define FunCtrl P9118_AI_DtrgNegative|P9118_AI_EtrgNegative
#define BurstNumber 0
#define PostCount 0
//variables definition
I16 cardID = -1;
I16 err=0;
U32 AccessCnt = 0;
U32 MemSize = 0;
I16 InBuf[131072]; //AI data buffer
F64 InVolBuf[131072]; // AI voltages buffer
cardID = Register_Card(PCI_9118HR, CardNumber);
if (cardID<0) {
//Error occurs !!
//ToDo : Handle error here
}
err = AI_InitialMemoryAllocated(cardID,&MemSize);
if (err!=NoError) {
//Error occurs !!
//ToDo : Handle error here
}
if (MemSize*1024 < ScanCount*ADChanCount*sizeof(I16) ) {
//available memory size for analog input in the device driver
//is smaller than the data size specified!!
//ToDo : do something here
}
err = AI_AsyncDblBufferMode(cardID, 0);
if (err!=NoError) {
//Error occurs !!
//ToDo : Handle error here
}
err=AI_9118_Config(cardID, ModeCtrl, FunCtrl, BurstNumber, PostCount);
if (err!=NoError) {
//Error occurs !!
//ToDo : Handle error here
}
//这里扫描通道
err=AI_ContScanChannels (cardID, LastADChan, AD_U_10_V, InBuf, ScanCount*ADChanCount, SampleRate, SYNCH_OP);
if (err!=NoError) {
//Error occurs !!
//ToDo : Handle error here
}
//这里取得电压值,他需要上面所得到的InBuf作为一个参数输入
err=AI_ContVScale (cardID, AD_U_10_V, InBuf, InVolBuf, ScanCount*ADChanCount);
if (err!=NoError) {
//Error occurs !!
//ToDo : Handle error here
}
Release_Card(cardID);
空采的话,所得到的数值是32767,电压是0。按照要求,如果是双极的话数据是-32768到+32767。而我所用是单极数据应该是0~65535。才对。