基于单片机的USB便携多道系统
本文作者:admin
点击:
2007-04-10 00:00
前言:
Y-记数),供能谱分析、测量使用。而传统的多道系统一般采用NIM插件的标准模式。近几年来,国内外能谱仪器的发展出现了标准向VXI,Compact PCI变革及数字化便携化等多种趋势。USB(通用串行总线)是一种最近几年逐步在数据通信领域广为应用的新型总线技术,其通信协议规范目前已发展到2.0版本,其高速传输模式可达480mb/s。与其它串行总线相比,USB具有成本低、速度快、总线供电,支持热插拨和易于扩展等特点。为此,本文提出一种基于单片机的USB便携多道系统。上位机(PC)完成显示、控制等各项人机交互功能。下位机(MCU)完成固件程序(USB协议),多道采集数据,响应控制等各类任务。
系统硬件设计
本系统的功能模块包括数据采集、USB通信两大部分。结构框图如下:
整个系统设计方案体现了系统的工作原理:Motorola Mc68HC908GP32单片机是整个系统的核心,通过该单片机片内的8位A/D转换功能模块,可以实现对输入脉冲信号的采集。输入的脉冲信号通过一个数字逻辑单元,可以触发Mc68HC908GP32的“输入俘获”功能模块的中断,从而及时地启动A/D转换,进行数据采集。A/D转换得到的数据,以“按道存储”的方式,存储在RAM中,等待由USB接口送出,给计算机系统显示处理。
另一个主要的功能模块是基于PDIUDBD12接口芯片的USB的通信功能。考虑到单片机选型的通用性,本方案选择外加USB接口芯片PDIUDBD12,它与Mc68HC908GP32单片机之间的通信,采用8位并行数据的方式,通过IRQ中断的方式来通知单片机。
系统软件设计
本系统的软件设计主要包括上位机(PC)USB设备驱动程序及控制软件和下位机(MCU)的设备固件(USB控制协议软件和单片机的A/D软件)程序的编写。
● 设备固件设计
USB协议共有4根电缆,除了GND和VBus之外,D+D-是一对差分的信号线。USB设备是即插即用,只要某一个U SB带点联接上了一个USB设备,USB总线就会进行系统枚举操作,来自动完成设备的配置。USB协议共有4种数据传送方式,具体特点如下:
PDIUSBD12芯片完成USB协议的底层封装。当其完成一个USB事件,而需要单片机的参与时,以中断的方式通知单片机Mc68HC908GP32,而单片机则通过读取中断标志位和数据来进一步判断事件的类型,然后做出相应的控制响应。如前所述,单片机与PDIUSBD12之间的通信是通过8位并行口实现的。当地址A0 为0时,Mc68HC908GP32从端口PortA读取、写入数据。而当A0为1时,Mc68HC908GP32则可以向PDIUSBD12写入一系列控制指令,从而完成配置USB端点、写端点缓存、读取端点数据等各种操作。
完成整个USB协议的封装,乃至实现基于USB的各种复杂的系统任务,需要一函数的形式对本控制操作进行封装。采用的分层的程序结构如下:
1.USB协议配置、向量请求:在PDIUSBD12指令层提供的函数基础上,完成对于USB上电配置、向量请求(Vendor Request)等各类事件的响应处理。
2.PDIUSBD12指令层:在HAL硬件抽象层的基础上,将PDIUSBD12的各种指令操作进行封装,向上提供C语言函数形式的指令接口。
3.HAL硬件抽象层:对于PDIUSBD12的数据读、写,以及各种指令的写入进行封装,仅此层与具体硬件电路相关,其相关代码实现如图:
● PC系统软件
USB驱动程序
本系统开发的设备需要实现自己定义的特殊控制、读写操作,因此需要新的设备类,故要编写自己新的驱动程序。写时遵循WDM(Windows Drivers Model)方式,可以采用Driver Studio 工具软件来编写,自定义3种向量请求(Vendor Request),进行多道系统的控制。当一个应用程序需要从硬件端口读取数据时,是通过调用标准Win32 API函数,如RealFile来实现的。而Win32子系统模块(如KERNEL32.DLL)通过调用平台相关的系统服务接口实现该API,与平台相关的系统服务将调用内核模式支持例程。Windows2000/xp的所有内核模式I/O操作都使用一个公用的数据结构(IRP),内核发送各种IRP请求给WDM驱动程序。这里只简要叙述本项目驱动程序开发的相关原理和步骤,详细源代码请参考相关书籍。
PC端的控制、显示程序
PC端的控制、显示程序是本项目的用户接口,数据的显示、用户控制等功能,都需要在该程序上实现,用VC来开发。
应用VC来实现一个界面程序的开发,并不是十分复杂的工作,关键是程序的数据采集、显示和对多道系统的控制。可以使用unsigned int类型的全局数组变量data[256]来保存所有道的计数,使用多线程技术。当单击启动按扭时,程序便创建新的线程,并且通过IOCTL控制USB多道启动,然后在新的线程中以一定的时间间隔(10ms~20ms)不断地从USB总线上读取多道数据,累加到数组data[256]中;而程序自身的主线程,则不断地依据data[256]数组的值,刷新屏幕显示的多道能谱。当单击停止按扭或是设定采集时间到时,程序则通过IOCTL停止USB多道设备的数据采集,终止USB采数的线程,并且停止屏幕谱形的更新。
系统调试
通过反复的虚拟在线运行后,该系统工作稳定,最大计数65535,定时误差不超过30ms,输入脉冲幅度0.5V~5V。另在调试过程中,有数据丢失问题,修改USB通信的IRQ中断的工作方式,即:当中断发生时,仅仅将一个标志变量置位,中断程序就返回。而由主循环中,再来检查该标志位,如置位则调用相应的USB处理函数,完成USB时间的响应。这样,在USB事件处理过程中,是可以响应输入脉冲信号的中断的。事实上,USB通信完成了前台任务,而多道数据采集成了惟一的后台任务。
结语
与传统的NIM插件多道系统相比,本系统通过USB与PC机连接,不仅使数据量增大,而且更易于进行数据处理。体积小,即插即用,经济简单,人机交互界面友好,而且基于计算机系统,便于数据的进一步分析和使用。
参考文献:
[1] 许永和.EZ-USB FX系列单片机USB外围设计和应用[M]. 北京:北京航空航天大学出版社,2002.
[2] 周立功,等.PDIUSBBD12 USB固件编程与驱动开发[M]. 北京:北京航空航天大学出版社,2003.
[3] 顾学群,刘建峰.MSC1210单片机在多通道数据采集系统中的应用.自动化仪表,2005(1):45-46.