序
🔥 毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是:基于USB的经络信号检测系统的设计
第1章软件分析与设计
1.1系统总体设计
USB数据采集系统软件设计主要包括两部分:一是USB设备端的单片机软件,主要完成USB协议处理与数据交换(多数情况下是一个中断子程序)以及其它应用功能程序。二是PC端的程序,由USB设备驱动程序和应用程序两部分组成。公司在Express的开发包中提供了一个通用驱动程序,我们对该驱动程序进行了封装,完成应用程序与USB操作系统的接口功能。应用程序根据下位机的数据包格式及通信协议,提取出各种信息供其它模块使用。PC端程序的开发难度比较大,程序员不仅要熟悉USB协议,还要熟悉Windows体系结构并能熟练运用DDK工具。
1.2 固件程序设计
1.2.1 USB接口固件设计
对于单片机控制程序,目前没有任何厂商提供自动生成固件的工具,因此所有程序都要由自己手工编制。根据USB协议,任何传输都是由主机开始的,这样单片机作它的前台工作,等待中断。主机首先要发令牌包给USB设备, 设备接收到令牌包后就给单片机发中断,单片机进入中断服务程序,首先读C8051F320的中断寄存器,判断USB令牌包的类型,然后执行相应的操作。因此,USB单片机程序主要就是中断服务程序的编写。在USB单片机程序中要完成对各种令牌包的响应,其中比较难处理的是SETUP包,主要是端口0的编程。
1.2.2单片机主程序设计
主程序由两部分组成:第一、初始化单片机;第二、主循环部分,其任务是可以中断的,并对经络信号进行处理。在此选用了Keil C51语言进行了程序的调试和软件仿真。Keil C51开发系统可以完成编辑、编译、连接、调试和仿真等整个开发流程。可以用它来编辑C或汇编文件,然后由C51或A51编译器生成目标文件(.OBJ)。 目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS ). ABS文件由OH51转换成标准的HEX文件,以提供给调试器使用,进行源代码级调试,直接对目标板进行调试,也可以直接写入程序存储器中。
1.2.2.1 初始化过程初始化程序分为两个部分,首先初始化单片机内部寄存器,定时器,设置看门狗和外部I/O口,以及USB相关得寄存器进行初始化。
1.2.2.2 主循环部分完成初始化工作后,就可作其它的前台工作了,并在前台判断是否有Setup包(通过一个变量,当中断服务程序检测到有Setup包时,设置该变量),然后执行响应的控制传输。
本系统的主程序流程图如图1-2所示。
图1-1 主程序流程图
中断服务程序对时间敏感的,必须马上执行。前面己经提到C8051F320中的单片机固化程序主要就是中断服务程序。主程序和中断程序之间的数据交换主要是靠数据缓冲器和事件标志来完成的。
如中断流程图4-3所示,中断程序主要进行端点的控制。如表1-1所示,USB提供3组端点,其中端点0为设备缺省支持的控制端点:端点1为普通端点,可以作为块传输或中断传输端点;端点2称为主端点,主要用于大块数据的传输,采用双缓冲技术以更好的支持实时应用的等时传输,支持DMA操作。可以通过SetMode命令从1种传输模式中选择一种设置,即将主端点设置为等时传输或非等时传输。
端点 | 索引 | 传输方向 | 最大包尺寸(字节) |
0 | 0 1 | OUT IN | 16 |
1 | 2 3 | OUT IN | 16 |
2 | 4 5 | OUT IN | 64 |
表1-1 C8051F320端点类型
块输出端点:当D12需要接收一个来自USB总线上的数据包时,向CPU产生一个中断请求,CPU接收到中断请求信号后,马上服务于中断程序。在中断服务程序中,用单片机固化程序来将D12内部寄存器的数据转移到数据缓冲器(CPU内部RAM)中并等待主程序来处理,且将D12内部寄存器清空以便接收新的数据包。CPU可接着执行它的主程序,并且检查数据缓冲器中是否有新的数据并加以处理。在这种结构下,CPU不管数据是来自USB总线、串行口还是并行口,它的主要任务是查看数据缓冲器是否有新的数据以便处理。
控制端点:它和块输出端点在数据处理方面概念相同。当中断服务程序(ISR)在接收和储存控制数据包的同时,设置相应的寄存器标志。因为所有的标准设备、类等都是在协议层中处理的,ISR的这种结构则可以保持它的效率。
1.2.3设备配置信息
这是系统枚举并配置USB设备所依据的一系列数据结构的定义。这些数据结构完全遵循USB规范,并对厂商和设备特征。主要包括:1个设备描述符,,1个配置描述符,1个接口描述符,2个端口描述符,和若干字符串描述符(包括标识,厂商,产品,序列号)。这里,2个端口描述符定义分别定义了1个中断输出和1个中断输入端点,查询间隔为50毫秒。设备描述符中定义厂商ID,产品ID。两个ID构成硬件ID,系统将根据硬件ID查找并自动加载所需要的驱动程序。
图1-6 分层通信模型
图1-6中的通信模型是对主机与USB设备的一个分层通信模型的描述,它表明主机与USB设备之间软件以及数据通信的对应关系。主机软件通过对USB设备的端点和管道进行操作实现主机与USB设备之间的通信,USB总线接口层为主机和USB设备提供了物理的连接,USB设备层是通过控制管道将系统软件与逻辑设备连接起来,功能层通过数据管道将客户软件与USB设备的功能接口连接起来。对于USB设备层和功能层而言,这两层d都有其层间的逻辑通信,而这种逻辑通信实际上是通过USB总线接口层来完成其数据传输的。
1.3设备驱动程序
驱动程序使用在主机上,用来程序化一个UBS设备。在WindowS系统下,主机与设备之间的USB通信必须经过设备驱动程序来传输。设备驱动程序知道如何与系统的UBS驱动程序、以及与存取设备的应用程序沟通。应用程序不需要知道
它所通信的设备,其实际的连接地址、信号种类以及通信所用的协议等细节,这些工作是由设备驱动程序来处理的。应用程序只需知道设备的名称,或是设备的功能即可。
1.3.1 USB驱动程序层
WindowS系统中管理设备通信的部分是I/O子系统(I/0Subsystem)。I/O子系统分成数层,每一层包含一个或多个驱动程序,通信的要求在这些层次间分别传递。在1/0子系统内有一个UBS子系统,包含有处理所有设备的UBS通信的驱动程序。
1.3.2 函数驱动程序
函数驱动程序(functinodrive)r让应用程序与UBS设备,通过API函数来沟通。这些API函数属于Windwos的Win32子系统,Win32子系统同时也管理着执行应用程序、读取键盘与鼠标输入、在屏幕上显示输出等用户函数。函数驱动程序同时知道如何与较低级的总线驱动程序沟通,总线驱动程序控制着硬件。图34是应用程序与各个驱动程序,如何一起完成UBS通信的结构图。函数驱动程序通常被指为设备驱动程序,不过设备驱动程序除了函数驱动程序外,还包含总线驱动程序。函数驱动程序可以是一个类别驱动程序,或者说一个特定的设备驱动程序。
当设备或是子类别的要求超过类别驱动程序的能力时,会有辅助的过滤器驱动程序来增加类别驱动程序的能力。一个上层的过滤器驱动程序位于类别驱动程序的上方,如图34所示。从应用程序传来的要求,会先经过上层的过滤器驱动程序,然后才传给类别驱动程序。一个下层的过滤器驱动程序位于类别驱动程序与总线驱动程序之间,类别驱动程序将要求传递给下层过滤器驱动程序,然后再传给总线驱动程序。
USB的总线驱动程序包含:
(一)根集线器驱动程序(root一hubdriVer)
(2)总线类别驱动程序(bus一elassdriVer)
(3)主机控制器驱动程序(host一eontrollerdriVer)
根集线器驱动程序管理连接端口的初始化,以及与设备驱动程序和总线类别驱动程序之间的通信。总线类别驱动程序管理总线的电源、检测、UBS事务以及USB外设的设备驱动和应用程序与根集线器驱动程序和主机控制器驱动程序之间的通信。
主机控制器驱动程序启用主机控制器的硬件,与UBS系统软件之间的通信。
主机控制器驱动程序之所以与总线类别驱动程序分开,是因为WindwoS支持多个类型的主机控制器,每一个主机控制器有自己的驱动程序。
总线类别驱动程序属于WindwoS的一部分,所以设备驱动程序的编写不需要知道总线类别驱动程序的工作细节。
1.3.3 USB设备被发现的过程
一个USB设备接入计算机后,要经过如下的步骤被主机所发现。
1.USB外设所连的HUB检测到所连接的USB外设,并自动通知主机,以及它的端口变化状态,这时外设还是处于禁止状态。
2.主机通过对HUB的查询以确认外设的连接。
3.现在,主机己经知道有一台新的USB外设连接到USB系统中,然后,它激活这个HUB的端口,并向HUB发送一个复位该端口的信号。
4.HUB将复位信号保持10ms,为连接到该端口的设备提供最大不超过100mA的电流,这时外设处于Powered的状态,它所有的寄存器都被清空。
5.在外设分配到唯一地址以前,它的默认信道是主机默认的地址,然后主
机通过读取默认信道所使用的地址来读取设备的特征字,从而能够为设备找到相应的设备驱动程序。
6此时主机分配给外设一个唯一的USB地址,从此以后就用该地址与设备通信,这时设备叫Addressed状态
7.主机通过端点0来读取设备描述符,从而为设备进行配置做准备。
8.经主控器件仲裁后,对设备进行配置,这样设备就被配置成功了。
经过以上的八个步骤后,一台USB设备就进入工作状态了。
1.3.4 Windows驱动程序描述
在Windows下,与USB外设的任何通信必须通过USB设备驱动,这个驱动知道如何与系统的USB驱动和访问设备的应用程序通信。设备驱动是保证应用程序访问硬件设备的软件组件,使得应用程序不必知道物理连接、信号和与-个设备通信需要的协议等的细节,可以保证应用程序代码只通过外设名字访问外设或端口目的地gaol。应用程序不需要知道外设连接端口的物理地址,不需要精确监视和控制外设需要的交换信号。设备驱动通过在应用层和硬件专用代码之间的转化来完成它的任务。应用层代码一般使用一套操作系统支持的函数,硬件代码则处理那些访问外设电路的必要协议。设备驱动能与应用程序之间相互通信是通过Windows提供的API函数,这些函数使应用程序能够控制显示器、处理信息、访问存储器、读写磁盘和其它设备。对于一些标准设备,Windows提供通用驱动;而对于一些实时数据采集系统属于自定义的设备,对此Windows并不提供通用的驱动,所以需要为设备编写自定义的驱动,并且必须遵循微软在Windows98以上版本中为用户定义的Win32驱动模式。尽管Windows98和Windows2000提供了很多标准接口函数,但编制设备驱动程序仍是USB开发中最困难的部分。随着USB设备的大量开发和使用,目前己经出现了一些专门的USB开发套件。另外还有许多第三方软件厂商提供了各种各样的生成工具,像Compuware的driver works, BlueWaters它们能根据USB设备十分容易地生成高质量USB设备驱动程序,减少了开发的困难。Win-
Driver还包括一个功能强大的硬件探测器和调试器,在写入代码前,可通过调试器对硬件进行全面的测试。这种方式能够在写驱动程序前,校验硬件是否按照期望的那样工作。WinDriver能根据检测到的USB设备自动生成设备驱动程序代码以及INF文件,用户几乎可以不加修改就可直接编译生成USB设备驱动程序。Win-Driver还能根据用户对USB设备的具体操作生成程序代码,用户可以将此程序代码直接加入到用户应用程序中,另外,还可直接利用WinDriverAPI函数开发应用程序。
1.3.5 USB设备驱动程序设计
一个完整的驱动程序要完成以下工作:初始化;创建与删除设备;处理应用层程序的打开和关闭句柄的请求;处理应用层程序的输入/输出请求;串行化对设备的访问;访问硬件;调用其它驱动程序;取消UO请求;超时I/0请求;处理可热插拔设备的加入和删除事件;电源管理和WMI。
(1) WDM设备驱动程序结构作为WNIXP推荐的一项技术来说,USB的驱动程序是WDM类型的。WDM驱动程序在层次上主要可以分为两层:功能驱动程序和总线驱动程序。另外,为处理一些特定设备的请求,还有一些过滤驱动程序。USB总线驱动程序负责枚举和控制低速的USB总线。功能驱动程序知道如何控制设备的主要功能。它对IRP进行操作后,向下交与总线驱动程序处理。
驱动程序主要任务就是处理各种I/0(输入输出)请求。I/0请求包(IRP)是驱动程序操作的中心。它是一个内核“对象”,是一个预先定义的数据结构,带有一组对它进行操作的I/0管理器例程。I/0管理器接收一个I/0请求,然后再把它传递到合适的驱动程序栈中的最上层驱动程序之前,分配并初始化一个IRP。一个IRP有一个固定的首部和可变数目的IRP栈单元块。每个1/O请求有一个主功能代码,并可能有次功能代码。它们都有各自的例程用来进行相关处理。
USB驱动程序的入口例程为DriverEntryo,负责主功能代码调度。它接收不同的IRP,根据类型调用相应的分发例程。
(2)应用程序与WDM的通信 应用程序是用户运行的程序,包括支持自定义硬件的特殊用途的应用程序。设备驱动使得应用程序不必知道物理连接、信号和与一个设备通信需要的协议等的细节。设备驱动可以保证应用程序代码只通过外设需要的交换信号(忙、选通等)。
Windows包括应用程序接口(API)函数,使得设备驱动能与应用程序之间相互通信。这些函数是使得应用程序能够控制显示器、处理信息、访问存储器、读写磁盘和其他设备以及更多的几千个函数中的一部分。用于读写USB设备的API函数是ReadFile,WriteFile和DeviceIOControl。
在Win32系统中,每个设备都被抽象为文件,应用程序只需要简单的调用几个API函数,就可以实现对设备的控制。如:当应用程序调用API函数CreateFile来打开设备时,操作系统向驱动程序发送IRPMJCREATE。驱动程序接到后,调用相应的处理例程。打开设备的操作,需要先后调用4个API函数:
(1)用该USB设备的标识符(GUID)作为一个参数,调SetupDiGetClassDevs,传回一个设备信息群,包含指定类别内的所有设备;
(2)调用SetupDiEnumDevicelnterfaces函数,根据GUID,传回上面设备信息群内的一个设备的信息;
(3)调用SetupDiGetDevicelnterfaceDetail函数,传回这个设备的路径;
(4)按照传回的路径,调用CreateFile函数,开启设备的通信。
1.3.6 应用软件的设计
数据采集系统应用软件主要是对采集到的经络数据进行处理。在主窗口显示被测者的经络波形,以便能够直观的了解被测者生理的大概状况。而存储形式为数据形式,以便能够具体进行分析。使用此应用程序采集经络数据的主窗口如图4-7所示。
经络数据采集软件能够存储经络数据,打开经络数据贺存储波形。
除此之外,还可以放大或缩小主窗口,以便能够方便的查看经络波形。
从应用程序主窗口可以观察到被测者的经络波形,可以发现,经络压力在.周期为2HZ.符合经络的基本特征。也可以调节功能放到或缩小经络波形,以满足观测者的需要。
2.1调试步骤
要快、成功地开发一个USB设备,正确、合理的调试方法是必不可少的环节。调试基本分为硬件和软件两步进行:首先对硬件电路外部设备(单片机部分)进行调试。然后,借助PC机调试软件将设备端的USB协议(主要有描述符请求、端口配置、地址设置以及基本数据交换)调通,用调试好的USB设备接口来开发、调试PC软件,加上USB设备端的其它用户程序,对整个完整的系统进行系统调试。
2.2 硬件的调试与验证
经络数据采集系统的硬件调试主要有以下几步:
·检查电路原理图是否有错误;
·根据电路原理图检查PCB图是否有错误;
·制板,根据PCB图检查PCB板是否有错误,主要检查是否有线粘连;
·焊件,测试各个元件管脚连接是否有错误,并检查是否有虚焊脱焊的问题。
·加电测试电源部分工作是否正常,晶振部分工作是否正常;
·下载C08051F320的程序,测试电路其他各部分工作是否正常;
·测试完毕。
2.3软件的调试与验证
在调试USB设备时,可使用UsbView程序检测设备是否能被Windows枚举并配置,如果成功, 还可在该程序中查看设备描述符、配置描述符和端点描述符是否正确。之后可以使用Driver Wizard生成一个通用驱动程序,在Windows提示安装驱动程序时,选择Driver Wizard生成的驱动程序。其实Driver Wizard生成的仅是一个Windows控制台的应用程序,它会调用安装Driver Wizard时安装在系统中的通用USB驱动程序。使用该程序就可测试设备是否能够正确传输数据以及传输速度。该程序也可作为最终产品USB传输部分的框架;如果不能满足要求,也可用WDM重新编制驱动程序,用调试好的USB设备来开发、调试主机软件。
根据前人的经验,我们在单片机程序调试过程中对以下问题进行了总结,在编写单片机固件程序时,需要注意:单片机的中断是否设置为电平触发:中断后一定要读上次传输状态寄存器,以清除中断寄存器中的中断标志。这样,单片机的中断输出才能变回高电平,这一点非常重要;
在接收到Setup包后,是否调用ACKsetup命令重新使能端口。在向IN端点写 完数据后,是否调用ValidateBufer(命令FAH),指明缓冲区中的数据有效,可以发送到主机;当读完数据后,是否调用ClearBufer(命令F2H),以保证可以接收新的包;
通过调用ReadChipID(命令FDH)检查C8051F320是否工作。该命令要读两个字节数据。
2.4 抗干扰措施
电子系统中的干扰源是多方面的,给系统调试造成很多问题。经过总结,我们的数据采集系统的干扰原因主要有:系统与各元件接地策略的不尽合理、PCB的分布参数,电磁干扰等。为了尽量的减少千扰,必须采用符合本系统特点的抗干扰技术。抗干扰技术是保证系统能否正常工作的关键技术,它涉及到系统设计的很多方面。为了降低干扰,在设计中我们在硬件和软件上都采用了抗干扰技术。
2.4.1 硬件抗干扰措施
2.4.1.1 PCB大面积接地 在PCB布线时,采用了大面积接地策略,使得所有数字地、模拟地直接连到近旁相应的地线上,尽量减少连线长度以减少分布电感。PCB上的走线实现是由敷铜腐蚀而成,每条走线必然存在一定大小的等效电阻。而接地引线上如果有较大的电压降,就会给系统带来较大的干扰。所以,在布置PCB地线时,尽量加宽地线,减小地线的等效电阻,能够达到减小干扰的效果。
2.4.1.2模拟地与数字地分开 在系统中,普遍存在两种形式的地信号,即模拟地和数字地。在数字电路中,由于各器件的开关特性,使系统中存在大量的瞬态大幅度脉冲,如果这些脉冲混入要求比较精确的模拟地中,将会对系统的测量精度、稳定度等产生很大影响,所以在PCB布线时,我们把这两种地线分开走线。
2.4.1.3防静电措施 静电干扰对系统危害比较大,甚至还可能击穿器件。为了避免静电对系统的干扰。设计中采用了以下措施:
PCB布线保持环路面积最小;
使导线长度尽量短;
加强电源线和地线之间的电容藕合;
通过采取以上的措施,并且在设计实现时避免引入不必要的干扰,在实际应用中取得了较好的效果。
2.4.2软件抗干扰措施
仅仅在硬件上采取抗干扰措施是远远不够的,必须在软件上采取措施,才
能使系统的抗干扰能力更好。在软件部分,我主要采用软件陷阱,程序口令和
软件滤波等方法。
2.4.2.1 软件陷阱和程序口令 用“软件陷阱+程序口令”对付指针跑飞。当系统受到外界干扰时,指针会飞到另一段程序中,或跳到空白段去。
如果指针飞到空白段去,比较好处理。只要在空白段设立软件陷阱,将程序拦截到程序错误处理段即可。而如果指针飞到另一段程序中去了,则需要采用程序口令的方法,方法如下:
首先 ,程序必须模块化。每个模块(子程序)执行一个功能。每个模块只有一个出口;
设立一 个模块(子程序)ID寄存器;
为每个子程序配置一个唯一的ID号码;
每当子程序执行完毕,要返回(RET)之前,先将本子程序的ID号送入ID寄存器;
返回到上级程序后,先判断ID寄存器中的ID号。如果正确,则继续执行,如果不正确,则表示PC指针有可能己经跳错了,子程序没有按预计的出口返回,这时将程序拦截到程序错误处理段。
2.4.2.2软件滤波 单片机程序在ride环境下进行调试,在实验中我们发现,尽管人的体温基本保持稳定,但手腕部位皮肤表面的温度受外界温度变化的影响仍很大,而且手腕部位皮肤与传感器表面的温差也会给测量带来很大影响。考虑了这种因素的影响,根据实际情况在编程中加入滑动加权滤波处理程序,基本上避免了温度效应给经络测量带来的不良影响。
2.5本章小结
系统调试的结果关系到课题所完成的情况。本课题的调试过程耗费了几个月的时间,从开始的毫无反应,到最后能够正确的显示波形,每一步都会有意想不到的事情发生,对于我这个不是很有经验的设计者来说的确是困难重重。在这一章中仅就一些重点问题给出了论述,例如抗干扰,软硬件调试等,在实际的操作出现的问题远远超过以上的内容。但是通过认真仔细的调试,进行了详细的测试。本系统基本达到了预期的目标。系统的显示图形如图所示.
经络信号放大电路原理图
USB接口模块原理图
系统PCB电路图
如果学弟学妹们在毕设方面有任何问题,随时可以私信我咨询哦,有问必答!学长专注于单片机相关的知识,可以解决单片机设计、嵌入式系统、编程和硬件等方面的难题。
愿毕业生有力,陪迷茫着前行!