您当前的位置:首页 > 应用 > 电源

基于USB HID类数据通信的直流电源监控设计

时间:2013-08-22 12:39:30 来源:电子技术 作者:杨洪程,陈家新,张晓铀,杨立新

摘要:为了实现直流电源的监控,提出了一种具有USB HID数据通信功能的直流电源设计方案。详细论述了基于STM32 USB固件库(USB-FS Device library V3.3)的自定义HID类下位机的实现,介绍了如何在VC2010集成开发环境中编写多线程上位机程序并运用PlotLab(一个快速信号绘图和可视化的VCL组件)显示实时波形,最后再以实验开发板和PC实现了HID数据通信,证明了此监控设计方案的可行性。
关键词:STM32;USB HID;VC2010;固件库

    USB的“即插即用”使其成为了现行十分流行的计算机应用接口,从最初的USB1.1到USB2.0及已经出现的USB3.0协议,USB取得了很大的发展,并有取代RS232之趋势,越来越多的电子设备开始包含USB接口,当电子设备拥有了USB接口,设备将会更易实现数据通信方便设备的使用和功能的扩展。

1 USB HID类简介
   
在众多的USB设备类型中,HID类是Windows完全支持的第一批设备类型,它是为一些人工的输入输出设备而设计的,连接到计算机的USB设备几乎都包含HID类,用于信号控制。Windows系统自带了HID类的驱动程序,所以使用HID类来实现数据通信将无需为其开发、安装驱动,PC应用程序可以直接使用Windows API与之进行通信,这样将会大大的降低开发难度,缩短开发周期。

2 电源系统概述
   
直流电源基于STM32F107VC设计,可以通过电源的LCD和键盘或者PC上位机监控电源,PC上位机可以设定电源的输出并能以1 kHz或者100 kHz(只持续0.1 s)的采样率观察电源的输入输出波形。整个电源的系统简化框图如图1所示,市电经PFC(功率补偿)后经过不可控整流电路变成直流,STM32F107X主控模块通过电源面板或者USB接口连接PC上位机实现用户交互,同时STM32F107X利用AD检测电源的输入输出,运用数字PID产生PWM控制BUCK电路将整流后的直流变换成用户想要的输出,单端反激电路为主控模块提供5 V电源,这些与平常的BUCK直流电源相比除了拥有USB接口其他并无太多差异。整个下位机软件流程图如图2所示,下位机程序在开始时初始化外设和定义全局变量,再开启USB、DMA和定时器等中断,之后就循环等待本地面板的控制并刷新面板,DMA在将AD采样电源输入输出得到的数值存入4个全局变量之后产生中断将4个全局变量根据发送模式送入USB发送缓冲区,定时器定时利用这4个全局变量和PID算法控制电源的输出,USB中断将发送缓冲区的数据发送给上位机和将接收到的数据存入接受缓冲区并根据接收到的数据更改下位机的全局标志位。

a.JPG

b.JPG


    USB HID类的速度有限,最大有效数据速度为64 kByte/s(最大1 kHz的传输频率,每次最大传输64 Byte),本设计采用的速度是:16kBy te/s(1 kHz的传输频率,每次传输16Byte);这样在不使用缓存的情况下只能以1 kHz的采样率显示实时波形,为了显示更高采样率的波形本设计使用了12 k的缓冲区存储100 kHz采样率的数据,12 K的缓冲区可以存储1 000次采样的数据,在下位机采样率为100 kHz的情况下1 000次采样对于下位机是0.1 s钟,但对于上位机却是1秒钟,所以上位机选择100 kHz采样率查看下位机输入输出的操作每秒钟只能操作一次,这也能基本满足谐波分析的需求。本设计中上下位机传递的16 Byte中每个字节的含义如图3所示。

c.JPG



3 USB HID接口系统设计
   
USB接口系统框图如图4所示,USB接口系统有3个部分组成:USB主机,USB设备和USB互连;USB设备分为集线器(Hub)和功能(Function)两类,集线器为USB端口扩展用,本设计USB设备为功能类即下位机,到主计算机的USB接口叫做USB主机,USB互连主要是USB设备与主机的连接和通信。由图4可知要实现本设计中的USB接口,对于上位机需要调用HID类的驱动完成上位机程序编写,对于下位机要设计接口硬件电路和利用固件库完成数据收发工作。

d.JPG


3.1 接口硬件设计
   
STM32F107X拥有符合USB 2.0(全速12 MB/s)并支持主从设备转换(On-The-Go)的标准外设,在本设计中USB外设只工作在设备模式下,但在接口硬件设计时为主机模式留了余地,方便以后设备升级为OTG USB。STM32F107的PA10、PA11和PA12引脚分别对应OTG USB的ID、DM和DP信号线,设计时只要连接到USB的接插件即可。OTG USB比其他USB多出的ID信号线是用于两个OTG USB互连时协调主从关系的,另外OTG USB的电源需要是可控的:可以选择由总线供电又可以由自己供电;所以设计时USB电源需经一个IO控制的开关(三极管即可)上拉到电源。
3.2 下位机软件设计
   
本设计利用ST公司为STM32系列提供的USB固件库(本设计采用USB-FS Device library V3.3)完成下位机HID类程序的编写。USB固件库在下位机中的具体运用方法可参考文献,USB固件库被分为硬件驱动层(STM32_USB-FS_Device_Driver)和应用接口层(Application Interlace layer),硬件驱动层管理USB的硬件设备和USB标准协议的直接交互,它又由Low Layer和Medium Layer两个层组成,应用接口层在最终应用和USB固件库核心之间为用户提供了一个完整的接口,我们只需要修改和使用应用接口层的的函数即可完成下位机的HID类程序编写,整个固件库中应用接口层的文件及其各自作用:usb_conf.h是配置文件、usb_desc(.h,.c)是USB设备描述文件、usb_prop(.h,.c)是USB设备特定属性设置文件、usb_endp.c是非控制端点的正确传输中断服务文件、usb_istr(.h,.c)是USB设备中断处理文件和usb_pwr(.h,.c)是USB设备电源和连接管理文件。
    USB下位机程序分为3部分:USB控制器的初始化、主机请求响应和通信数据收发3个部分:USB控制器的初始化包括端点的使能、中断方式、数据缓存的设置等;USB HID类设备固件程序至少需要响应获取描述符(GET_DESCRIPTOR)、设置地址(SET_ADDRESS)、设置配置(SET_CONF IGURAT ION)、设置闲置(Set_Idle)四种请求;通信数据收发部分的主要工作是以中断方式向数据缓冲区读写数据。另外ST公司提供了Custom _HID案例,只需要在此基础上修改就可实现本设计的HID类。
    USB控制器的初始化我们需要修改usb_prop(.h,.c)文件中的CustomHID_Reset(void)函数使其初始化端点的数据量达到自己的需求。主机请求响应和通信数据收发本设计都是采用的中断方式,下位机程序在Stm32f10x_it.c文件内处理下位机所有中断,USB中断的情况下程序会跳转到usb_istr.c文件中处理所有USB中断,USB中断分为端点中断和非端点中断,非端点中断主要包括各种协议上的中断(总线挂起、复位、唤醒,帧起始、应答等),非端点中断程序将会跳转其他文件处理,端点中断的情况下程序会跳转到otgd_fs_int.c文件处理所有端点中断,端点中断分为控制端点中断和其他端点中断,控制端点主要用于枚举它的处理程序我们不需要改动,我们的数据通信使用的是其他端点中断,其他端点中断的情况下程序将跳转到usb_endp.c文件使用自定义的用户处理函数,本设计需要编写这些自定义的用户处理函数完成通信数据收发部分设计,例如如在接受中断中使用USB_SIL_Read(EP1_OUT,Receive_Buffer)函数可以将端点1(OUT)的数据读到Receive_Buff er[]数组中。对于主机请求程序在Custom_HID案例的基础上需要修改usb_desc(.h,.c)中的设备、配置和报告描述符后由程序内部函数(控制端点中断的处理函数)使用这些描述符完成USB枚举过程,修改比较多的是端点描述符和报告描述符,具体修改可以参考文献。
3.3 PC上位机程序编写
   
本设计的USB HID上位机应用程序是在VC2010集成开发环境下,利用Windows自带HID类驱动的API和PlotLab(一个快速信号绘图和可视化的VCL组件)开发的多线程人机交互界面。上位机程序流程图如图5所示,上位机程序是MFC的对话框程序,程序的界面负责显示和接受用户的输入,在程序的开始建立了两个线程和一个多媒体定时器,两个线程分别为读数据和写数据服务,多媒体定时器的中断为显示波形服务。

e.JPG


    要打开USB设备就要利用HID类驱动提供的API,这些API在hid.lib和setupapi.lib中,图6说明了我们用到的API和使用这些API的流程。

f.JPG


    多媒体定时器提供了Windows系统下精准定时,本设计中使用每1ms中断来使用PlotLab显示实时波形,PlotLab是一个快速信号绘图和可视化的VCL组件,由美国Mitov软件公司基于自由OpenWire技术开发的,它提供了虚拟示波器和瀑布图等功能。设置完VC2010对PlotLab的地址后并include<CSLScope.h>后即可使用其提供的波形显示API,例如使用Scope.Channels[0].Data.AddYPoint(Value)函数就可以在示波器0通道显示序列中加入Value。为了提高界面的交互能力,本设计使用了多线程技术,在VC2010中使用AfxBeginThread()函数可以建立线程并指定处理函数。

4 实验测试
   
在实验开发板上实现了本设计:下位机将上位机发送的数据回传给上位机,上位机显示波形。图7和图8是在设定电源输出为电压1.111 V和电流2.222 A的情况下得到的,图7是由BUS Hound软件监视USB接口所得,图8是上位机界面。在图7中可见数据与上位机发送的数据一致:电压1.110V精确到毫伏则为1110对应16数据包中7、6和5 3个字节数据为0X000456,电流2.221A精确到毫安则为2221对应16数据包中4、3和2 3个字节数据为0X0008AD,其他数据为命令;也可以见到每次发送间隔并不是非常准确的1ms,这是由于PC主机的windows系统并不是硬实时系统,所以在主机要引入多媒体定时器以确保界面显示的时间轴准确。图8是上位机界面截图,可见其显示的数据与收到的数据一致:输出电流为2.221 A图中Y轴精确到毫安即为2221,输出电压为1.110V图中Y轴精确到毫伏即为1110,示波器的X轴为采样点数目;另外PlotLab提供的示波器还具有放大缩小和保存波形等功能,这让人机交互界面更加人性化。

g.JPG



5 结论
   
文中提出了一种以STM32F107VC为主控芯片具有USBHID类数据通信功能的直流电源设计方案,文中详细论述了如何在电源和PC上位机之间实现USB HID类数据通信,最后运用实验开发板和PC实现了USB HID数据通信并完成上位机的界面的编写,达到了预期的效果,证明了基于USBHID数据通信的电源监控设计方案的可行性和稳定性。

推荐图集

 
 
顶一下
发表评论 共有条评论  
用户名: 验证码:

技术子站

推荐博客