基于LabVIEW的USB实时数据采集处理系统的实现
3 基于AN2131Q的单光子采集系统
该采集系统由笔者自行开发并用于单光子计数种子活性快速检测仪中。它主要由将光子信号转为电信号的光电倍增管(PMT)及其辅助电路和基于AN2131Q的USB采集卡组成。PMT及其前置放大器、放大器、甄别器等辅助电路能将微弱的光子信号转换为15ns的标准TTL脉冲信号,脉冲信号经过分频处理后再被USB采集,USB将采集的结果实时地传给主机处理。
3.1 USB采集卡的硬件组成
该采集卡由微控制器、USB通信接口、主机以及数字I/O端口组成,如图1所示。
笔者设计了一种同步传输方式的单片方案,应用了内置微处理器的USB设计——EZ-USB AN2131Q。它是Cypress公司的一种内嵌微控制器的80脚USB芯片,包含三个8位多功能口,8位数据端口,16位地址端口,二个USB数据端口,二个可定义16位的定时/计数器和其他输入输出端口。其采用一种基于内部RAM的解决方案,允许客户随时不断地设置和升级,不受端口数、缓冲大小和传输速度及传输方式的限制。片内嵌有一个增强型8051微控制器,其4个时钟的循环周期使它比标准8051的速度快3倍。采用同步传输方式将单片机的计数值实时传送给主机,而主机对计数器的控制信号则采用块传输方式传送。EZ-USB是Cypress公司推出的USB开发系统,它为USB外设提供了一种很好的集成化解决方案。EZ-USB在其内核已做了大量繁琐的、重复性的工作,这样就简化了开发代码,进而缩短了开发周期。此外,开发商还提供了配套的开发软件(包括编译软件uVision 51、调试软件dScope 51、控制软件EZUSB Controll Panel)以及驱动程序GPD(General Purpose Driver)接口,以便于用户进行开发使用。
图2 开启设备和获取采集数据的流程图
3.2 USB采集卡的软件构成
在USB的Firmware中,采取同步传输(Isochronous Transactions)和块传输(Bulk Transactions)两种传输方式。同步方式用来实时传送采集的数据,块传输主要用来传输主机命令信号和USB的状态信息。块传输中利用端点(Endpoint)2。两种传输方式的核心中断程序如下:
void ISR_Sutok(void)interrupt 0 //块传输方式
{
//initialize the couters in the 8051
TMOD=0x05;
TCON=0x10;
TH0=0;
TL0=0;
Thb=0,
TH0=0;
TL0=0;
thb=0;
EZUSB_IRQ_CLEAR();
USBIRQ=bmSUTOK; //Clear SUTOK IRQ
}
void ISR_Sof(void)interrupt 0 //同步传输方式
{
if(TCON&0x21){ //Deal with the counter overflow
TH0=0;
Tl0=0;
THB++;
TCON&=0xdf;}
IN8DATA=TH0; //3 Bytes counter result
IN8DATA=TL0;
IN8DATA=THB;
EZUSB_IRQ_CLEAR();
USBIRQ=bmSOF; //Clear SOF IRQ
}
在LabVIEW应用程序中设计了一Usb.dll文件作为LabVIEW与USB的驱动程序。由于EZ-USB开发系统中已经提供了底层驱动程序(GPD)接口函数,用户只需调用这些函数即可与USB设备连接。因此在DLL的编制中只需调用它提供的函数,大大节约了开发时间,提高了开发速度。创建的Usb.dll文件中包含了如下五个输出函数,功能说明如表1所示。
表1 Usb.dll包含函数的功能说明
Control | 主机对USB设备的控制 |
ReadResult | 获取USB发送到主机的数据 |
StartIsoStream | 启动设备的同步传输流 |
StartThread | 得到标准设备的设备描述符 |
StopThread | 关闭设备的同步传输流 |
其定义如下:
LPSTR_declspec(dllexport)_stdcall Control(int input);
int_declspec(dllexport)_stdcall ReadResult(void);
int_declspec(dllexport)_stdcall StartIsoStream(void);
int_declspec(dllexport)_stdcall StartThread(void);
int_declspec(dllexport)_stdcall StopThread(void);
开启设备和获取采集数据的过程如图2所示。它的主要功能有:开启或关闭USB设备、检测USB设备、设置USB数据传输管道(pipe)和端点(endpoint)、实时从USB接口采集数据、显示并分析数据。
程序在VC++6.0环境下编制成功后自动生成DLL文件。调用时,在框图程序窗口打开FunctionPalette(功能模板),在Advanced模块包含有对库函数的调模块,即CallLibraryFunction。把编写好的DLLs放在当前目录或特定目录下。在功能模板放置函数调用模块,然后选Configure,出现对话框。根据LabVIEW与DLLs的参数对应关系填写好DLL文件的路径(DLL文件不在当前目录下)、被调用函数名、参数的类型及返回类型。需要注意的是,当调用多个函数时要分别填写参数的个数和对应的类型,而且在调用过程中应保持数据位的一致。填好选择OK按钮后,LabVIEW将自动生成各参数的入口及出口状态,这样就实现了LabVIEW与DLLs的调用。
通过上述方法成功实现了LabVIEW与USB驱动程序的数据交换,从而实现了以LabVIEW为应用程序的USB实时采集处理系统。将USB采集卡增加A/D或D/A并对电路作相应的改动后,即可实现传统采集卡的所有功能。很明显,这种集成了USB接口优点和LabVIEW图形化编程语言的采集处理系统与传统采集卡相比具有不可比拟的优势,不仅性价比高、通用性高、易于开发、数据处理简单,且可以大大缩短开发时间。