请教AI_ContVScale()函数的问题? 点击:993 | 回复:2



a1b2c3

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 3回
  • 年度积分:0
  • 历史总积分:59
  • 注册:2002年10月21日
发表于:2002-10-22 14:10:00
楼主
PSDASKManual.pdf手册的 5.1.2 Synchronous Continuous Analog input programming Scheme中为把采集到的数据转换成电压实际值,用AI_ContVScale()函数。我用时转换结果一半正确一半错误,很奇怪!(板卡上硬件跳线应该没问题) ***我的用法:(Borland C++Builder5环境,Tchart控件图形显示) U16 FBuffer[1024]; F64 FVoltageArray[1024]; AI_ContReadChannel(Card9113ID_Two, 0, AD_B_10_V,FBuffer, 1024, 25000,SYNCH_OP); AI_ContVScale( Card9113ID_Two, AD_B_10_V,FBuffer,FVoltageArray,1024); for (int j=0; j<1024; j++) { Series1->AddXY(i+1,FVoltageArray[j],"",clRed);//画图显示 i+=1; } 如果不用AI_ContVScale(),而手动转换 for (int k=0; k<1024; k++) { FVoltageArray[k] = ((FBuffer[k]&0xFFF)*20)/4096-10; } 也不对. ***例子程序Samples\9113\sdk9113DbfInt\9113cint.c 中的用法: //变量声明 U32 *ai_buf;//很奇怪,函数原型中用 U16 *ai_buf?? //start动作之后 AI_9113_Config(card,TRIG_INT_PACER); AI_AsyncDblBufferMode (card, 1) AI_ContReadChannel(card, channel, AD_B_10_V, ai_buf, data_size, (F64)sample_rate, ASYNCH_OP) do { do { AI_AsyncDblBufferHalfReady(card, &HalfReady, &fstop); } while (!HalfReady); AI_AsyncDblBufferTransfer(card, ai_buf); for (i=0; i<data_size; i++) { adinput = ai_buf[i] & 0xfff; newy=io_pos[0].y+172-(174*adinput)/4096; newx = i*336/data_size+output_pos[15].x+35; //...(省略) } //这个for循环里怎么这样转换成实际电压值???172,174,336如何解释??? pdf文档的附录C数据格式中对PCI-9113板卡,对continuous AI,是32位数据,而AI_ContReadChannel()中的参数要16位的缓冲,这是怎么回事???



李侃

  • 精华:22帖
  • 求助:0帖
  • 帖子:30帖 | 813回
  • 年度积分:0
  • 历史总积分:1015
  • 注册:2002年2月27日
发表于:2002-10-21 18:17:00
1楼
dask.h头文件的声明是: I16 __stdcall AI_ContReadChannel (U16 CardNumber, U16 Channel, U16 AdRange,U16 *Buffer, U32 ReadCount, F64 SampleRate, U16 SyncMode); 而9113例子程序中声明是U32 ai_buf,可能和PCI总线带宽为32bit有关,所以例子接着将无用的16bit(高位)屏蔽掉。 adinput = ai_buf[i]; cur_channel = (adinput>>16) & 0x1f; AI_ContVScale我以前用过,好像只要把参数设对就可以了。 所以你应该将U16 FBuffer[1024];改为U32 FBuffer[1024];然后仿照例子进行屏蔽操作即可。

a1b2c3

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 3回
  • 年度积分:0
  • 历史总积分:59
  • 注册:2002年10月21日
发表于:2002-10-22 14:10:00
2楼
改为U2 FBuffer[1024];,就和AI_ContReadChannel()的原型中参数类型 U16 *Buffer不匹配,我编译时出错(c++buider5). 我调试查看FBuffer里,每两个连续的16位单元中第一单元的低12位为有效数据,第二单元16位全是0.那么我每32位就手工转化低12位数据为实际电压值这样操作没错吧?不会丢数据吧?我的应用对实时性要求较高. 十分感谢!

热门招聘
相关主题

官方公众号

智造工程师