基于USB总线的虚拟仪器技术
发布时间:2008/6/3 0:00:00 访问次数:583
关键词:虚拟仪器;usb; labview;测试系统;dll
序言
在水下航行器的动力测试系统中,测试参数种类繁多,测试环境复杂,存在强的噪声干扰,并且,由于测试的目的不同,要出现不同的组合测试,所以要求测试系统具有较好的组态性能和易维护性。然而,传统的测试系统设备复杂、功能单一、灵活性差。如果将虚拟仪器技术引入到水下航行器的动力测试系统中,特别是引入基于usb总线的虚拟仪器技术, 不但可以满足动力测试系统的要求,而且可以实现所建立的测控系统具有开放式工业标准性、互换性和互操作性以及现场设备的智能化等优势。另外,还具有节省硬件数量及成本、节省维护开销与提高可靠性等特点。
硬件设计
系统总体结构
水下航行器动力装置研究中要进行很多参数的测试,其中包括电压、电流、有功功率、无功功率、扭矩等,未来的研究还会涉及到噪声、振动等参数的测试。不同的参数其测量方法不尽相同,本文所详述的测试系统总体框图如图1所示。下面将重点介绍基于usb总线的数据采集卡的硬件和软件设计。
usb数据采集卡硬件设计
鉴于usb协议的复杂性(需要编写大量的固件代码),基于usb总线的数据采集卡的控制芯片采用at89c55wd(自带20k的程序存储器,足以满足需要)。采集卡的adc采用8位的adc08909。usb接口芯片采用philips公司的pdiusbd12,该芯片采用goodlink技术的连接指示器,在通讯时使led闪烁,这种技术对于usb接口调试十分有用。pdiusbd12与at89c55wd、adc0809的接口电路如图2所示。pdiusbd12和at89c55wd采用总线方式连接,通过中断方式进行数据交换。
软件设计
这里只介绍与usb数据采集卡相关的软件设计,包括单片机固件程序、采集卡驱动程序、动态链接库(dll)、用户应用程序。
单片机固件程序设计
固件程序主要完成两个方面的工作:adc采样服务和pdiusbd12同主机的通讯。程序采用积木式结构,各模块程序分工如下:
*硬件提取层:对单片机的i/o口、数据总线等硬件接口进行操作;
* pdiusbd12命令接口:指对pdiusbd12器件进行操作的模块子程序集;
*中断服务程序:当pdiusbd12向at89c55wd发出中断请求时,读取pdiusbd12的中断传输来的数据,设定事件标志位和setup包数据缓存区并传输给主程序;
*标准请求处理程序:对usb的标准请求进行处理;
* 厂商请求处理程序:对usb的厂商请求进行处理;
*主循环程序:发送usb请求、处理usb总线事件和对用户功能进行处理。
固件程序的主循环框图如图3所示。
数据采集卡驱动程序设计
数据采集卡驱动程序的设计目标是编写在windows2000下使用的驱动程序。usb设备驱动程序的设计是基于wdm的,传统开发工具是microsoft公司的windows 2000ddk,这种方法的优点是能使开发者对整个驱动模型有较为深入的理解,使得开发过程更为灵活。但是对于初学者来说工作量、难度都较大,因此一些公司纷纷推出了诸如driverworks、driver winzard等驱动开发工具,这些工具的特点是只需添入少量的代码,就可自动生成相对完善的驱动程序,但是缺乏灵活性。本设计中开发驱动程序采用的是前一种传统方法,在visual c++工程环境下编写源代码,然后在windows 2000ddk环境下编译成sys驱动文件,最后编写安装信息文件,具体过程较为复杂,在此不再详述。
dll程序设计
所谓dll就是一个包含了若干函数的可执行模块。其作用是通过dma的方式读取存储在pdiusbd12 fifo中的采样数据,并把它们存储在开辟的数据缓存区中,以供用户应用程序调用。使用这种方法的优点是允许若干个应用程序共享某个函数的单个副本,实现了代码数据、硬件资源等的共享。
由于在win32系统中,每个设备都抽象成文件,dll只需通过几条简单的文件操作api(应用程序接口)函数就可实现与驱动程序中某个设备通讯,因此编写dll时应充分应用api函数。本设计中用到的api函数主要有:open_file( )、open_dev( )、deviceiocontrol ( )和readfile( )。dll在visual c++中的win32 dynamic-link library开发模板下编写,由于用户应用程序采用labview编写,因此还需将labview.lib库文件添加到开发模板中,这样才能编译生成正确的dll文件。
用户应用程序设计
用户应用程序将采用ni公司的labview7.0编写。labview中dll的调用是通过clf(call library function)节点实现的,在使用之前需要对它进行配置,配置完成后,clf节点的函数原型为:char usbread (char dbfsize, unsigned char *code, char *databuf),dbfsize为所读取数据长度;*code为返回的错误代码指针(为了调试方便);*databuf为所读取的数据指针。需要注意的是在调用dll之前,labview程序中需要对*databuf赋初值,否则lab
关键词:虚拟仪器;usb; labview;测试系统;dll
序言
在水下航行器的动力测试系统中,测试参数种类繁多,测试环境复杂,存在强的噪声干扰,并且,由于测试的目的不同,要出现不同的组合测试,所以要求测试系统具有较好的组态性能和易维护性。然而,传统的测试系统设备复杂、功能单一、灵活性差。如果将虚拟仪器技术引入到水下航行器的动力测试系统中,特别是引入基于usb总线的虚拟仪器技术, 不但可以满足动力测试系统的要求,而且可以实现所建立的测控系统具有开放式工业标准性、互换性和互操作性以及现场设备的智能化等优势。另外,还具有节省硬件数量及成本、节省维护开销与提高可靠性等特点。
硬件设计
系统总体结构
水下航行器动力装置研究中要进行很多参数的测试,其中包括电压、电流、有功功率、无功功率、扭矩等,未来的研究还会涉及到噪声、振动等参数的测试。不同的参数其测量方法不尽相同,本文所详述的测试系统总体框图如图1所示。下面将重点介绍基于usb总线的数据采集卡的硬件和软件设计。
usb数据采集卡硬件设计
鉴于usb协议的复杂性(需要编写大量的固件代码),基于usb总线的数据采集卡的控制芯片采用at89c55wd(自带20k的程序存储器,足以满足需要)。采集卡的adc采用8位的adc08909。usb接口芯片采用philips公司的pdiusbd12,该芯片采用goodlink技术的连接指示器,在通讯时使led闪烁,这种技术对于usb接口调试十分有用。pdiusbd12与at89c55wd、adc0809的接口电路如图2所示。pdiusbd12和at89c55wd采用总线方式连接,通过中断方式进行数据交换。
软件设计
这里只介绍与usb数据采集卡相关的软件设计,包括单片机固件程序、采集卡驱动程序、动态链接库(dll)、用户应用程序。
单片机固件程序设计
固件程序主要完成两个方面的工作:adc采样服务和pdiusbd12同主机的通讯。程序采用积木式结构,各模块程序分工如下:
*硬件提取层:对单片机的i/o口、数据总线等硬件接口进行操作;
* pdiusbd12命令接口:指对pdiusbd12器件进行操作的模块子程序集;
*中断服务程序:当pdiusbd12向at89c55wd发出中断请求时,读取pdiusbd12的中断传输来的数据,设定事件标志位和setup包数据缓存区并传输给主程序;
*标准请求处理程序:对usb的标准请求进行处理;
* 厂商请求处理程序:对usb的厂商请求进行处理;
*主循环程序:发送usb请求、处理usb总线事件和对用户功能进行处理。
固件程序的主循环框图如图3所示。
数据采集卡驱动程序设计
数据采集卡驱动程序的设计目标是编写在windows2000下使用的驱动程序。usb设备驱动程序的设计是基于wdm的,传统开发工具是microsoft公司的windows 2000ddk,这种方法的优点是能使开发者对整个驱动模型有较为深入的理解,使得开发过程更为灵活。但是对于初学者来说工作量、难度都较大,因此一些公司纷纷推出了诸如driverworks、driver winzard等驱动开发工具,这些工具的特点是只需添入少量的代码,就可自动生成相对完善的驱动程序,但是缺乏灵活性。本设计中开发驱动程序采用的是前一种传统方法,在visual c++工程环境下编写源代码,然后在windows 2000ddk环境下编译成sys驱动文件,最后编写安装信息文件,具体过程较为复杂,在此不再详述。
dll程序设计
所谓dll就是一个包含了若干函数的可执行模块。其作用是通过dma的方式读取存储在pdiusbd12 fifo中的采样数据,并把它们存储在开辟的数据缓存区中,以供用户应用程序调用。使用这种方法的优点是允许若干个应用程序共享某个函数的单个副本,实现了代码数据、硬件资源等的共享。
由于在win32系统中,每个设备都抽象成文件,dll只需通过几条简单的文件操作api(应用程序接口)函数就可实现与驱动程序中某个设备通讯,因此编写dll时应充分应用api函数。本设计中用到的api函数主要有:open_file( )、open_dev( )、deviceiocontrol ( )和readfile( )。dll在visual c++中的win32 dynamic-link library开发模板下编写,由于用户应用程序采用labview编写,因此还需将labview.lib库文件添加到开发模板中,这样才能编译生成正确的dll文件。
用户应用程序设计
用户应用程序将采用ni公司的labview7.0编写。labview中dll的调用是通过clf(call library function)节点实现的,在使用之前需要对它进行配置,配置完成后,clf节点的函数原型为:char usbread (char dbfsize, unsigned char *code, char *databuf),dbfsize为所读取数据长度;*code为返回的错误代码指针(为了调试方便);*databuf为所读取的数据指针。需要注意的是在调用dll之前,labview程序中需要对*databuf赋初值,否则lab