基于虚拟仪器的汽车检测仪设计与实现
0 引 言
汽车产业已成为国民经济增长的一个亮点,随着科学技术的发展,汽车检测经历了人工检验、简单仪器仪表测量、电脑控制的自诊断系统和专用的故障诊断仪等阶段。这些检测手段不同程度地存在着操作复杂、稳定性差、检测效率低、检测误差大等缺点。电子技术和计算机技术在汽车上的普及运用,对汽车售后维修服务提出了更高要求,促使在汽车的故障诊断中采用更多的快速、简便和智能化仪器,要求检测仪器实时采集和反映汽车工况的技术数据或曲线,以此来进行汽车故障的诊断。近年来,国内外很多公司和高校把虚拟仪器技术运用到生产和科研中,取得了一定的经济和社会效益。虚拟仪器相对于传统仪器具有以下优势:(1)仪器功能由用户自行定义;(2)丰富并增强了传统仪器的功能;(3)测量稳定性与重复性好;(4)经济性好;(5)系统构建周期短,易于进行功能扩展。将虚拟仪器引入到汽车行业,为汽车检测技术带来了新的活力。
影响最大的虚拟仪器编程语言是美国NI公司的LabVEIW和LabWindoWs/CVI,还有其他基于WINDOWS操作系统的可视化编程工具如VB、C++、Delphi等。VB是一种非常方便的Windows应用程序编程开发平台,它最有力的就是快速创建可视化用户界面,把复杂而完善的Windows操作系统的使用融于易于学习和使用的高级语言中,因而受到广大工程技术人员的普遍欢迎。
1 虚拟式汽车检测仪的结构
开发的汽车检测仪是基于数据采集卡的PC-DAQ结构。系统的结构如图1所示,由硬件和软件两大部分构成。
硬件的核心是一台PC,I/O接口设备采用阿尔泰的PCI2006数据采集卡。该卡具有14位分辨率的A/D转换器,提供了16(双极)/32(单极)模拟输入通道,输入信号幅度可以经程控增益放大至合适的范围,保证最佳转换精度;32位PCI总线,支持PCI2.2协议,即插即用;单通道400 kHz采样频率,伪同步采样减少通道间的采样时差,8 KB深度FIFO存储器保证数据的完整性;软件部分支持Windows XP系统下的I/O接口仪器驱动程序,包括对VB、C++、Delphi以及LabVEIW的驱动程序,编程使用的VB语言运用其相应的驱动程序对该卡进行数据采集的编程。
该卡主要分为4大块:(1)模拟前端的信号输入、调理电路;(2)对模拟输入信号进行AD转换的模数转换部分;(3)基于FPGA的控制部分;(4)和上位机进行通信的接口电路。
2 PCI2006数据采集的编程实现
该卡能用3种不同方式即非空查询方式、半满方式和中断方式进行数据采集。
2.1 PCI2006的设备管理
由于驱动程序采用面向对象编程,所以要使用设备的一切功能,用CreateDevice函数创建一个设备对象句柄hDevice,有了这个句柄,就拥有了对该设备的绝对控制权。然后将此句柄作为参数传递给其他函数,如Init-DeviceProAD可以使用hDevice句柄以程序查询方式初始化设备的A/D部件,ReadDeviceProAD函数可以用hDe-vice句柄实现对A/D数据的采样读取,SetDeviceDO函数可用实现开关量的输出等。最后可以通过ReleaseDevice将hDevice释放掉。
2.2 用非空查询方式采集数据
有了hDevice设备对象句柄后,便可用InitDeviceProAD函数初始化A/D部件,关于采样通道、频率等参数的设置是由这个函数的pPara参数结构体决定的。只需要对这个pPara参数结构体的各个成员简单赋值即可实现所有硬件参数和设备状态的初始化。然后用StartDeviceProAD启动A/D部件,开始A/D采样,然后用ReadDeviceProAD_No-tEmpty反复读取A/D数据以实现连续不间断采样。当需要暂停设备时,执行StopDeviceProAD,当需要关闭AD设备时,ReleaseDeviceProAD便可实现,但设备对象hDevice依然存在。ReadDeviceProAD_NotEmpty虽然主要面对批量读取,高速连续采集而设计,但亦可用它以单点或几点的方式读取A/D数据,以满足慢速采集需要。具体执行程序框图如图2所示。
2.3 用半满方式采集数据
用StartDeviceProAD启动A/D部件,开始A/D采样,接着调用GetDevStatusAD_Half函数以查询A/D的存储器FIFO的半满状态,如果达到半满状态,即可用ReadDeviceProAD_Half函数一批半满长度(或半满以下)的A/D数据,然后再接着查询FIFO的半满状态,若有效再读取,就这样反复查询状态反复渎取A/D数据即可实现连续不间断采样。
当需要暂停设备时,执行StopDeviceProAD,当需要关闭 A/D设备时,ReleaseDeviceProAD便可实现,但设备对象hDevice依然存在。ReadDeviceProAD_Half函数在半满状态有效时也可以单点或几点的方式读取A/D数据,只是到下一次半满信号到来时的时间间隔会变得非常短,而不再是半满间隔。
2.4 用中断方式采集数据
用CreateDevice函数创建设备对象,同时调用CreateSystemEvent函数创建一个内核事件对象句柄hEvent赋给InitDeviceIntAD的相应参数,它将作为接收A/D半满中断事件的变量。启动A/D部件,开始A/D采样,接着调用Win32 API函数WaitForSingleObject等待hEvent中断事件的发生,在中断未到时,自动使所在线程进入睡眠状态(不消耗CPU时间),反之,则立即唤醒所在线程,执行它下面的代码,此时您便可用ReadDeviceIntAD函数读取一批半满长度(或半满以下)的A/D数据,然后再接着等待FIFO的半满中断事件,若有效再读取,就这样反复读取A/D数据即可实现连续不间断采样。用同样函数可暂停和关闭A/D设备。
- 虚拟仪器:在开放架构基础上创建用户定义的测试系统(09-19)
- 什么是虚拟仪器?(10-23)
- 基于虚拟仪器技术的短波电台自动测试系统(10-23)
- 宽带多媒体网关测试方法研究(10-27)
- 采用模块化仪器,对新兴音频和视频应用进行测试(02-19)
- 基于虚拟仪器技术的航空机载电子设备自动测试系统(03-03)