你好,欢迎访问达普芯片交易网!|  电话:010-82614113

动态采集程序涉及到驱动程序中部分概念的分析

发布时间:2008-11-12阅读:958

  (1)缓冲区。在驱动程序进行A/D或D/A转换时,有3个相关的概念需要分清楚:采集板上的FIFO,计算机内存中的内部缓冲区和用户缓冲区。

  FIFO为采集板卡上自带的,ΠFO缓冲区可以达到更高的采集频率,如PCI1710使用4KB的FIFO缓冲区后,最高采样频率可达到100kHz。但是有些型号的采集板不带FIFO缓冲区。

  内部缓冲区和用户缓冲区是数据采集程序动态分配给驱动程序使用的两块内存区域。内部缓冲区主要由驱动程序使用,驱动程序从板卡FIFO中或寄存器将数据通过中断方式或DMA方式传输到内部缓冲区。在例程中该Buffer指针一般用hBuf命名。

  如果是非循环采集,采样完设置好的数据个数后采集停止,驱动停止往内部缓冲区存放数据。如果循环采集,内部缓冲区会循环使用,用户需要在BufferChange事件用DRVFAlTransfer及时将数据取走,以免被新到的数据覆盖。可以放到用户缓冲区中,或者进行存到硬盘的其他数据操作。
 
  用户缓冲区是用户自己用来存放数据的地方,例程中开辟的大小和内部缓冲区一致,这只是示例。实际应用当中,用户可以根据需要开辟用户缓冲区的大小。例如开辟一个较大的用户缓冲区,在循环采集中将每次采集的数据依次存放其中。采集结束后统一处理。在例程中该Buffer指针一般用hUserBuf命名,两者还有一个区别在于,内部缓冲区中存放的是RawData(原始数据),用户缓冲区中存放的可以是原始数据也可以是Float Data电压值。通过pt-FAlTransfer,DataType参数来确定转换时是原始数据还是电压值。关于原始数据和电压值的区别后面会有介绍。
 
  中断触发方式的A/D转换中这3种缓冲区的使用如图所示。
 
  (2)内部缓冲区的使用方式。驱动程序在操作内部缓冲区时是将内部缓冲区分为上下两半缓冲区来分别操作。通过这样来保证高速连续采集时,数据不会丢失。在采集时驱动程序从板卡FIFO或寄存器中将数据传输到内部缓冲区中,当内部缓冲区半满时驱动程序发出Buffer-Change事件。用户通过执行DRV_FAlCheck函数返回的HalfReady来判断是上半部分还是下半部分缓冲满了,然后执行DRV_FAlTransfer来将相应的缓冲中的数据取走。
 
  在不了解数据采集的DMA触发方式时,很容易把在中断触发方式下,调用DRV_FAI-IntScanStart函数的同时使用FIFO和内部缓冲区的方式认为是双缓冲区工作方式,进而对PTFAlCheck结构的ActiveBuf域产生误解。实际上,双缓冲区是指同时使用A、B两个内部缓冲区。这是PCL1800卡在DMA触发方式下的特殊工作方式,由DRV_FAlDualDmaStart函数启动。只有PCL1800卡支持双缓冲方式。在中断触发方式下不能同时使用双缓冲区的工作方式。所以我们一般使用PT_FAlTransfer,ActiveBuf=0即单缓冲模式。
 
  (3)设计FIFO的目的。为了防止在高速数据采集时丢失数据,特别是在像Windows这样的多任务操作系统下。通常板卡完成A/D转换后,将数据写人到数据输出寄存器中,接着使用DMA或中断服务功能将数据传输到CPU/内存。如果没有FIFO功能,每次硬件完成A/D转换后,会改写保存在数据寄存器中的值,如果上次A/D的数据在新数据到来之前被传输到CPU,那么这个数据就丢失了。如果使用∏FO功能,新数据仅仅被添加到FIFO缓冲区的第二个位置上,而不会覆盖原先的数据。随后的数据会依次排列到缓冲区中。当你想从∏FO缓冲区中搬移数据时仅仅需要从数据寄存器中读取一个数据即可,这样将会把最初的数据取出,FIFO中下一个位置的数据会取代数据寄存器中的值,你可以在任何时候传输来自FIFO缓冲区中的数据,当你在传输旧的数据时,硬件会将最新的数据保存在FIFO中,从而防止数据丢失。你也可以在FIFO半满或全满时,一次性地传输数据。由于这样减少了CPU的时间,因此非常适合于大量的高速数据传输。

  (4)循环(cycle0)和非循环(no_cycle)。循环和非循环是指内部缓冲区的使用方式。
 
  非循环方式下,内部缓冲区作为一个整体使用。在非循环方式下执行一次DRV FAI_Int-ScanStart/DRV_FAllntStart函数只能进行有限次(次数就是通过参数count设置的采样个数)的A/D转换,DRV_FAltntScanStart函数执行过程中将所有数据都放到内部缓冲区;A/D转换结束后,在ADS_EVT_Terminated事仵的处理函数中再用DRV_FAlTransfer函数将数据传送到用户缓冲区中。
 
  循环方式下,内部缓冲区分为两个半区使用。执行一次DRV_FAllntScanStart/DRV_FAIIntStart函数可以进行无限次的A/D转换,直到调用DRV FAI_Stop函数。这种方式下有限的内部缓冲区不可能容纳无限多的采集数据。因此,将内部缓冲区分成前后对等的两个半区。当前半区填满后产生一个ADS_EVT_Bufchange事件,采集程序中的事件检查循环捕获这个事件,调用DRV_FAI_Transfer函数把数据传送到用户缓冲区;与此同时DRV_FAllntScanStart/DRVFAllntStart函数将新转换的数据放到内部缓冲区的后半部分。当后半区填满后再产生一个ADS_EVT_Bufchange事仵,并用DRV_FAIInt_ScanStart/IntStart函数将新转换的数据放到数据传输完毕的前半缓冲区,如此循环。
 
  (5)RaW Data(原始数据)和VOLTAGE(电压值)。以PCL818为例,它的转换芯片是12位的,所以它可以把采集的电压量程分为4096段,这种方式称为量化,而Raw Data就是将被采集量量化后的整数值。驱动程序将量化值用3位十六进制数表示,所以Raw Data的示数范围就是000~fff,在内部缓冲区中的数值就是这种量化的原始数据。用户缓冲区中存放VOLTAGE(电压值),将Raw Data转化为电压值由CRVFAlTransfer函数完成,当PTFAlTransfer的DataType=0时,不进行Raw Data到电压值的转化,这时候在用户缓冲区中得到的就是量化的12位十六进制整数值。
 
  (6)增益列表起始地址。在编写数据采集程序时,都要考虑多通道同时采集,而且都要考虑开始通道的任意性,所以通常的做法是为增益列表开辟一块增益列表存储区,从0开始每个存储单元对应一个通道的增益值,但是要注意,在起始通道不为零时不能将这个存储区的起始地址直接赋给驱动函数的“增益列表起始地址”参数,如PTFAIInt ScanStart结构的Gain-List域;因为驱动程序是直接从“增益列表起始地址”参数表示的起始地址去提取起始通道的增益值,而不会根据“起始通道”参数在增益列表中选取对应的增益值。

在线人工客服

点击这里给我发消息

点击这里给我发消息

点击这里给我发消息

010-82614113

客服在线时间周一至周五
9:00-17:30