急急!pci9812数据采集问题 点击:1239 | 回复:7



oanni

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 3回
  • 年度积分:0
  • 历史总积分:9
  • 注册:2005年7月31日
发表于:2005-07-31 11:25:00
楼主
问题很急,早晨发了这个帖子,在论坛里没看到,重发一下。 各位老师:你们好!我现在在用ADLINK PCI9812进行数据采集,我有个问题希望能到老师们的解惑。我用matlab和c++实现了对第一个通道的数据采集,但我希望能实现单独对第二个通道的数据采集。我用的是XP SP2系统,下面是我的程序,可是就是不能采集数据,请老师们帮看看问题出在哪,非常感谢。 /* $Revision: 1.1 $ */ // mexSample.cpp // Automatically generated by Matlab AppWizard version 1.0 // // This is the gateway routine for a MATLAB Math/Graphics Library-based // C MATLAB MEX File. #include "afx.h" #include "mex.h" #include "math.h" #include "dask.h" #include "DAQHeader.h" int StartSample(U32 ScanCount,F32 SampleRate,double *dpDataOut); void mexFunction( int nlhs, // Number of left hand side (output) arguments mxArray *plhs[], // Array of left hand side arguments int nrhs, // Number of right hand side (input) arguments const mxArray *prhs[] // Array of right hand side arguments ) { U32 ScanCount; F32 SampleRate; long nResult; double dResult,*dpDataOut=NULL; if(nrhs!=2) mexErrMsgTxt("Only two input argument is allowed."); else if(nlhs>2) mexErrMsgTxt("Only two output argument is allowed."); ScanCount=(long)mxGetScalar(prhs[0]); SampleRate=*(mxGetPr(prhs[1])); //dpDataOut=(double *)mxCalloc(nDataNum, sizeof(double)); plhs[0]=mxCreateDoubleMatrix(ScanCount,1,mxREAL); dpDataOut=mxGetPr(plhs[0]); nResult=StartSample(ScanCount,SampleRate,dpDataOut); dResult=nResult; plhs[1]=mxCreateScalarDouble(dResult); return; } //constants definition #define CardNumber 0 #define ADChan 0 //AI config constants definition #define ClkSel P9812_AD2_GT_PCI|P9812_CLKSRC_INT #define TriggerLevel 127 #define PostCount 0 int StartSample(U32 ScanCount, F32 SampleRate, double *dpDataOut) { I16 cardID = -1; I16 err=0; U32 AccessCnt = 0; U32 MemSize = 0; U16 InBuf[65536]; //AI data buffer F64 InVolBuf[65536]; // AI voltages buffer U32 i; cardID = Register_Card(PCI_9812, CardNumber); if (cardID<0) { return -1; //Error occurs !! //ToDo : Handle error here } err = AI_InitialMemoryAllocated(cardID,&MemSize); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here } if (MemSize*1024 < ScanCount*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_9812_Config(cardID, P9812_TRGMOD_SOFT, P9812_TRGSRC_CH1, P9812_TRGSLP_POS, ClkSel, TriggerLevel, PostCount); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here } err=AI_ContReadChannel (cardID, ADChan, AD_B_1_V, InBuf, ScanCount, SampleRate, SYNCH_OP); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here } err=AI_ContVScale (cardID, AD_B_1_V, InBuf, InVolBuf, ScanCount); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here } for (i=0;i<ScanCount;i++) { dpDataOut[i]=InVolBuf[i]; } //Release_Card(cardID); return 0; } 各位老师,采用单独的不同通道,是否就是将下面的函数中的P9812_TRGSRC_CH1参数进行修改就行了: err=AI_9812_Config(cardID, P9812_TRGMOD_SOFT, P9812_TRGSRC_CH1, P9812_TRGSLP_POS, ClkSel, TriggerLevel, PostCount)。



oanni

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 3回
  • 年度积分:0
  • 历史总积分:9
  • 注册:2005年7月31日
发表于:2005-08-01 08:37:00
1楼
没人给我解惑一下吗? 我看过大家以前发的帖子,有人说AI_ContReadChannel函数只能采集零通道的数据,有人说又不是。到底是怎样的,请大家帮帮忙,这个问题已经困扰我几天了。我就想知道怎样采集一通道的数据,请各位老师指点。

Davi

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 4回
  • 年度积分:0
  • 历史总积分:13
  • 注册:2004年7月06日
发表于:2005-08-01 10:28:00
2楼
1.单个通道采集时,只能用通道0 2.2个通道采集时,只能用通道0和1 3.不能进行3个通道采集 4,能进行4个通道采集0,1,2,3 所以你的做法是不对的

oanni

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 3回
  • 年度积分:0
  • 历史总积分:9
  • 注册:2005年7月31日
发表于:2005-08-01 10:53:00
3楼
非常感谢davi的帮助。我想再请教一个问题,如果我用两个通道采集时,9812卡采集数据的流程是怎样的,是0通道采集一段数据再1通道采集一段数据吗?如果是,每个通道采集的数据点(或采集的时间)可以控制吗?0、1通道的数据可以最后将之分开吗。

Davi

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 4回
  • 年度积分:0
  • 历史总积分:13
  • 注册:2004年7月06日
发表于:2005-08-06 08:41:00
4楼
多通道采集时,9810采用扫描式查询,每次采集一个数据,轮换采集,对于你说的两通道采集,数据存放是这样的,buffer[0],buffer[2],buffer[4].....存放通道0的数据,buffer[1],buffer[3],buffer[5].....存放通道1的数据.

oanni

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 3回
  • 年度积分:0
  • 历史总积分:9
  • 注册:2005年7月31日
发表于:2005-08-06 11:13:00
5楼
感谢davi。我还遇到一个问题,向大家请教。在采集卡0通道无信号输入的情况下进行采集,采集的数据有时是一个三角波形(0~0.25V),有时没有。请问这是怎么回事?是否是我的采集卡有问题了?

huojunya

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 16回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2004年10月22日
发表于:2005-08-06 12:38:00
6楼
我也请教一个关于PCI9812的数据采集问题: 我的问题是现保存数据个数太少了,如何才能保存更多的数据? 我在单缓存重复扫描程序中调用: AI_ContScanChannelsToFile(cardID, LastADChan, AD_B_5_V, (unsigned char*)file_name, ScanCount*ADChanCount, SampleRate, ASYNCH_OP来保存数据到文件中,在使用过程中我发现数据个数ScanCount*ADChanCount(ScanCount为扫描次数,ADChanCount为通道个数)受缓存大小的限制。如果缓存是1024KB大约可保存500000个数据;如果缓存更大可以保存更多的数据。 而我需要保存更多的数据(最好大到不受限制)有什么办法可以解决?双缓存的程序可否解决? 如果可以HalfReady和fstop又如何设定?相应双缓存保存数据到文件程序代码如下: err=AI_ContScanChannelsToFile(cardID, LastADChan, AD_B_5_V, (unsigned char*)file_name, ScanCount*ADChanCount, SampleRate, ASYNCH_OP); do { do { AI_AsyncDblBufferHalfReady (cardID, &HalfReady, &fstop); } while (!HalfReady); //half buffer data is ready for read AI_AsyncDblBufferTransfer (cardID, NULL); }; } while (!fstop);

danshui0128

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 8回
  • 年度积分:0
  • 历史总积分:10
  • 注册:2004年2月09日
发表于:2005-08-07 10:25:00
7楼
我用PCI-9812开发出测试电子镇流器,请教各位,用PCI-9812做那方面产品的测试?

热门招聘
相关主题

官方公众号

智造工程师