PCI-9114HG多道连续采集问题(续) 点击:1137 | 回复:9



别再吃鸽

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 29回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2003年11月20日
发表于:2003-12-05 13:38:00
楼主
yoyo1101,谢谢你百忙中的答复,毫无疑问,你是我心眼里最可爱的人, 以至我都想以身相许,可惜我也是男人呀. 下面咱还要提提我的问题呢. 问题在我看来是解决了,程序源代码如下,不知道是不是对呢? PCI-9114HG的multiple AD-Channels一起连续采集时,是怎样一个时序呢? 请结合以下程序给咱点拨点拨. 我在程序中设置Scan Rate为2000Hz(Per channel),即0.5ms;总采样频率为 2000Hz*32通道=64000Hz. PCI-9114HG在采集时是不是每个扫描间隔(即每0.5ms)每道转换一个样点, 这样0至31通道都各得到一个样点(姑且称为一帧)? 道间切换的时差是多少呢,可以不用考虑吗? 程序中32个通道每个通道都采了16K个样点,那么总计花了多少时间呢, 该怎么计算? 还有,the size of circular AI-Buffer是多少? AI_AsyncDblBufferHalfReady时即半满时,能读回来几个样点? //以下是程序源代码: // // P9114AsyncCAI.cpp // // // Before using this program,you must use the utility-- // "NuDAQ PCI Configuration Utility"--to allocate at least 256KBytes // memory spaces for AI-Buffer. // // 32Channels*2048Samples*4Bytes(size of per sample) = 256KBytes // #include <windows.h> #include <stdio.h> #include <conio.h> #include "dask.h" // PCI_9114HG : Continuous AI //constants definition #define CardNumber 0 #define ADChanCount 32 #define LastADChan (ADChanCount-1) #define ScanCount 2048 #define SampleRate 64000.0000 //Scan Rate(Hz): 64000.0000/32 = 2K //Sampling-Length per AD channel,in samples #define SampLen 16384 //variables definition I16 cardID = -1; I16 err=0; BOOLEAN fstop = 0; BOOLEAN HalfReady = 0; U32 AccessCnt = 0; U32 MemSize = 0; U32 InBuf[32*SampLen]; //AI data buffer F64 vaiData[32*SampLen];//volt-value of AI data //total numbers of current transferred samples U32 CurSamples = 0; int main(int argc, char* argv[]) { FILE* fp; int SampNo,ADChan; char szLine[1024]; char szTmp[100]; fp = fopen("D:\\P9114AsyncCAI.TXT","w+t"); if(fp==NULL) { printf("not found file.\n"); exit(1); } cardID = Register_Card(PCI_9114HG, CardNumber); if (cardID<0) { //Error occurs !! //ToDo : Handle error here printf("Error: Register_Card(). errcode=%d\n",cardID); exit(1); } err = AI_InitialMemoryAllocated(cardID,&MemSize); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here printf("Error: AI_InitialMemoryAllocated().\n"); exit(1); } else printf("Ok : MemSize=%d KB!\n",MemSize); if (MemSize*1024 < ScanCount*ADChanCount*sizeof(U32) ) { //available memory size for analog input in the device driver //is smaller than the data size specified!! //ToDo : do something here printf("Error: AI-Buffer is too small!\n"); exit(1); } err = AI_AsyncDblBufferMode(cardID, 1);//enable double-buffer mode if (err!=NoError) { //Error occurs !! //ToDo : Handle error here printf("Error: AI_AsyncDblBufferMode().errcode = %d\n",err); exit(1); } err=AI_9114_Config(cardID, TRIG_INT_PACER); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here printf("Error: AI_9114_Config().errcode=%d\n",err); exit(1); } err=AI_ContScanChannels (cardID, LastADChan, AD_B_10_V,NULL, ScanCount*ADChanCount, SampleRate, ASYNCH_OP); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here printf("Error: AI_ContScanChannels(). errcode = %d\n",err); exit(1); } do { do { AI_AsyncDblBufferHalfReady (cardID, &HalfReady, &fstop); } while (!HalfReady); //half buffer data is ready for read AI_AsyncDblBufferTransfer (cardID, &InBuf[CurSamples] ); CurSamples += ScanCount/2; printf("CurSamples = %lu\n",CurSamples); } while (CurSamples<ADChanCount*SampLen); printf("sampling completed!\n"); err = AI_AsyncClear(cardID, &AccessCnt); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here printf("Error: AI_AsyncClear().errcode=%d\n",err); } printf("Now converting the acquired data to volt values...\n"); err = AI_ContVScale(cardID,AD_B_10_V,InBuf,vaiData,ADChanCount*SampLen); if (err!=NoError) { //Error occurs !! //ToDo : Handle error here printf("Error: AI_C



yoyo1101

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 590回
  • 年度积分:0
  • 历史总积分:645
  • 注册:2002年8月30日
发表于:2003-11-25 09:29:00
1楼
在你所描述的情况下,A/D转换的时序是按照64000Hz来进行的,也就是每1/64000秒时间采集一个点,那么从每个通道来看就是每0.5ms采集一个点,各个通道间会有1/64000秒的时差。 如果每个通道都采集16k个点的话,会花费16k/2k=8s的时间。 the size of circular AI-Buffer是指在NuDAQ PCI Configuration Utility中为板卡分配的Buffer大小,那么半满时采集回的点数就和你设置的Buffer的一半大小有关了。

别再吃鸽

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 29回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2003年11月20日
发表于:2003-11-30 19:50:00
2楼
我总算知道AI_ContScanChannels()这个函数的不好。 他并不是时序上无间隔的采一帧数据的, 我的程序要用来采集地震信号,必须在一瞬间完成一帧数据的采集, 相临两道的两样点之间不应该有间隔时间。 请问有什么函数能不间断的采集一帧数据呢?

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-12-01 09:22:00
3楼
可以外加一个采样保持电路,就可以实现多通道同步采集了,不是更好

yoyo1101

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 590回
  • 年度积分:0
  • 历史总积分:645
  • 注册:2002年8月30日
发表于:2003-12-01 10:07:00
4楼
你对采样速率和精度有什么要求?也可以考虑PCI-9118系列,它提供Burst + SSH方式,外加采保很方便;如果必须是PCI-9114的话,也可以通过外接采保来实现,但最好用外部时钟了,将外时钟分频后作为采保的触发信号。

别再吃鸽

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 29回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2003年11月20日
发表于:2003-12-01 14:56:00
5楼
freshman大侠,PCI-9114可是单A/D converter呀,能实现同步吗?

别再吃鸽

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 29回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2003年11月20日
发表于:2003-12-01 14:57:00
6楼
9118贵出不少呢!没人愿多花钱呀。

yoyo1101

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 590回
  • 年度积分:0
  • 历史总积分:645
  • 注册:2002年8月30日
发表于:2003-12-01 16:16:00
7楼
那么就只有外加采保了,但可能就得用外时钟,因为板卡本身无法提供S&H的触发信号,用外时钟的话就可以将外时钟信号32分频后的信号提供给采保作为触发。

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-12-05 12:34:00
8楼
to 罗鸣: 单A/D芯片的卡也可以采集同步数据呀。为每个通道前端加锁存器。先锁存在扫描通道,就可以得到某时刻的所有通道的同步采集数据了。不过这种方式要加前端锁存电路,并且要与板卡A/D芯片之间做通讯。实现起来控制过程比较麻烦一点。而且这样的采集频率不会很高。

别再吃鸽

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 29回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2003年11月20日
发表于:2003-12-05 13:38:00
9楼
二大虾, 你俩的主意不错! 用外部时钟同步使能各通道前端的锁存器,锁存住某时刻的所有通道的数据,然后依次将其转换,就得到一帧样点,这样真的不错. 我们要求的采样间隔不高,只要0.50ms,1.00ms,2.00ms,4.00ms, 8.00ms,16.00ms这几档.应该能达到吧. 我们预计要用PCI-9114ADG(250K A/D),自己在各通道前端还要加信号放大电路呢,这样才能采到微伏级的极棒或检波器的电压信号. 我们要做的是两位一体机,电法(用32道)和地震(用24道)二合一. 之前我们用过ACL-8112HG做过电法仪(GDZD-16电法仪,16通道,MS-DOS系统,前端只加放大器,异步采集),已经投产了. 由于用于地震行业,才有同步采集的严格要求.

热门招聘
相关主题

官方公众号

智造工程师