码,全面支持Windows XP的OLE自动化、多线程等功能。用Delphi语言对PCI2006数据采集卡进行编程比其他语言具有更多独特的优点[1]。
1 数据采集卡结构
PCI2006数据采集卡的结构组成如图1所示。该卡具有14位分辨率,提供了16(双极)/32(单极)模拟输入通道,32位PCI总线,支持PCI2.2协议,即插即用,单通道采集频率为400kHz。
图一 数据采集卡结构组成 图自己画,画的好点,这个一看就是从别处截来的
该卡由预处理电路、A/D转换器、8KB深度FIFO缓冲器、高频时钟、集成于FPGA芯片的PCI接口控制器、D/A转换器和输入输出接口等组成。被采集的信号经传感器接收后输入预处理电路。预处理电路包括多路开关、程控放大器等,其作用是对信号切换,放大调理,使之适应A/D转换器的输入需求。A/D转换电路负责将模拟量转换成数字量,转换后的数字量信号在PCI接口控制器的控制下,被依次写入FIFO存储器。这里的PCI接口控制器是将PCI软核(IP Core)嵌入FPGA芯片实现的,符合PCI局部总线规范,可以实现完整的PCI主控模块和目标模块接口功能,作为PCI目标设备,可实现基本的传送要求。整个板卡在一高度稳定的时钟控制下,进行有序的
工作,这一时钟由高频时钟发生器产生。
2 连续大容量数据采集与处理编程
2.1 如何管理PCI设备
该卡有3种不同采集方式即非空
查询方式、半满查询方式和半满中断方式。它提供了Windows XP系列下包括支持VB、VC++、Delphi以及LabVEIW的驱动程序,本文应用Delphi语言运用其相应的驱动程序对该卡进行数据采集与处理的编程。
驱动程序采用面向对象编程,定义不同的函数来关林PCI设备。如用CreateDevice函数创建一个设备对象句柄hDevice,有了这个句柄,就拥有了对该设备的绝对控制权。然后可用此句柄作为参数传递给其他
函数,如InitDeviceProAD可以使用hDevice句柄以程序查询方式初始化设备的A/D部件,ReadDeviceProAD可以用hDevice句柄实现对A/D数据的采样读取,SetDeviceDO可用hDevice句柄实现开关量的输出等。最后可以通过ReleaseDevice将hDevice释放掉。
2.2 设置数据采集线程和数据处理线程
为了实现连续大容量数据采集和处理,采用数据采集线程和数据处理线程的设计思想。数据采集线程在正常采集中不能有任何窗口图形操作。只有这样,这个线程才不会被堵塞而保证正常连续的数据采集。通过再开辟数据处理线程,也叫用户界面线程,将采集的数据显示在屏幕上。最初,数据处理线程不做任何工作,而是在Win32 API函数WaitForSingleObject的作用下进入睡眠状态,此时它不消耗CPU任何时间,即可保证数据采集线程取得指定长度的数据到用户空间,再用Win32 API函数SetEvent将指定事件消息发送给数据处理线程,数据处理线程即刻恢复运行状态,迅速对这批数据进行处理,如计算、在窗口绘制波形、存盘等操作。数据处理线程是非工作流程,如果用户移动窗口等操作堵塞了该线程,而数据采集线程则在不停地采集数据,数据处理线程会因此而丢失数据采集线程发来的某一段数据。如果不另加处理,这个情况肯定有发生的可能。可采用缓冲队列技术来解决这个问题。
2.3 缓冲队列技术与程序实现
假设数据采集线程每一次从设备上取出8KB数据,创建一个缓冲队列,在用户程序中开辟一个两维数组如pADBuffer[Count][DataLen],DataLen为数据采集线程每次采集的数据长度,Count为缓冲队列的成员个数。假如设成32,则这个缓冲队列实际上就是数组pADBuffer[32][8192]的形式。两个线程首先要通过改变Count(数据采集线程用ReadIndex,数据采集线程用CurrentIndex)的值。当数据采集线程在A/D部件被InitD