带全速USB接口的PIC18F4550应用设计
随着 USB(Universal Serial Bus)技术的发展,特别是高速(480 Mbps)USB2.0 协议的出现,几乎所有的 PC 外设都可以移植到 USB 上,所以 USB 的 PC 外设的发展空间是巨大的,甚至在不久的将来,USB 将完全取代异步串口和打印机并口,PC 机厂商将不会再生产机箱上带异步串口和打印机并口的 PC 机了,机箱上也不会再有那么多的连线了。USB 是一种快速的、双向同步传输的、廉价并可以进行热插拔的串行接口。
利用 USB 总线技术,开发适用于科学研究和工业牛产的各种仪器仪表设备,借以取代传统计算机测控系统中采用串行 RS232 或并行接口的仪器仪表设备,使计算机测控系统更加高效实时,方便灵活。利用 USB 总线的数据采集方案有两种,一种是采用普通单片机加上专用的 USB 通信芯片。该方案可充分利用开发人员原有的硬件资源和软件知识,开发成本较低,但系统的设计和调试较为麻烦,且电磁兼容性差,容易造成主机不能识别 USB 设备。
另一种是利用具有 USB 接口功能的单片机。使用这些专用芯片构成的数据采集系统电路设计简单,调试方便,电磁兼容性好。然而,目前大部分具有 USB 功能的单片机都是专门针对个人计算机外围设备或消费市场的需要而设计的,忽略了嵌入式工程师的需要。Microchip 公司新款 PIC18F4550 系列单片机的问世,为广泛的嵌入式应用增添了全速 USB 的优势,即使遇到恶劣的操作环境或在只能不定时地连接个人计算机的情况下,也能正常工作。
本文以光栅位移传感器检测系统的设计为背景,详细介绍了带全速 USB 接口的单片机 PIC18F4550 的应用设计方法。1 PIC18F4550 介绍 PIC18F4550 是 Microchip 公司最新生产的带全速 USB 接口的 8 位高档单片机,芯片为 40/44 脚封装。该单片机除了具有 PIC 单片机所特有的精简指令集(RISC)、数据总线和指令总线相互独立的哈佛(Harvard)结构等特点外,还配备了自编程闪存存储器以及纳瓦节能技术,工作频率达 48 MHz,数据传输速率高达 12 Mbps。
另外,还具有 Microchip 先进 PMOS 电可擦除单元(PEEC)闪存技术,耐擦写次数可高达 100 万次,而数据保存期能超过 40 年。因而该芯片有很强的控制能力和灵活的工作方式。新器件的全速 USB
2.0 接口具有 1 KB 双重存取 RAM,支持高达 32 个端点(双向 16 对)和 2 种数据传输速率(即全速模式 1 2 Mbps 和低速模式 1.5 Mbps),具有 USB 协议所规定的 4 种数据传输方式(控制传输方式、中断传输方式、批量传输方式和实时传输方式)。该接口包括一个片上收发器和一个并行流端口,能把数据直接传送到外部的设备,不仅减小了 CPU 的开销,而且大大增强了系统的抗干扰能力和工作可靠性。
PIC18F4550 的硬件资源非常丰富,包含 33 个 I/O,I/O 端口为端口 A、B、C、D、E;具有多个中断源和 1 个中断优先级选择,4 个定时器,32 KB 程序闪存,256 字节 EEP-ROM 数据存储器,2 048 字节数据随机存储器以及 8×8 硬件乘法器;集成了 13 通道的 10 位 A/D 转换器,2 个 CCP(比较/捕捉/PWM)模块,1 个增强型 CCP 模块和 1 个看门狗;具有省电功能的休眠模式;1 个 USART 不仅支持异步与同步的串行通信,而且支持 LIN 总线;2 个模拟比较器,支持 I2C 和 SPI 通信的主控同步串行端口,可编程欠压复位及低电压检测电路等。
PIC18F4550 单片机的一个关键特性在于它配备了 32 KB 自编程增强型闪存,使得设计人员可以通过 USB 端口对最终应用进行现场升级。结合新器件配备的一系列片上外设和纳瓦技术(nanoWatt)的功耗管理功能,使其非常适用于多种嵌入式应用,包括工业、医疗、汽车、电池供电和消费类产品等。2 PIC18F4550 的设计应用 2.1 光栅位移传感器的基本工作原理、特点光栅位移传感器的基本工作原理是利用一对光栅,其中一块是固定的,而另一块是运动的。
当它们发生相对运动并有光通过两者时,能够获得相当于干涉仪中得到的条纹信号,即所谓的“莫尔条纹信号”。对于一对计量光栅,彼此移动一条刻槽(现代计量光栅常采用 4~250 L/mm)就移动一条莫尔条纹。条纹宽度不受波长影响,并且条纹较宽可进行内插,由于误差平均效应,因而可以获得很高的精度。与普通位移传感器相比,它有以下几个特点:① 精度高。光栅位移传感器在大量程测量长度或直线位移方面仅仅低于激光干涉传感器;在圆分度和角位移测量方面,光栅式传感器属于精度最高的。
② 大量程测量兼有高分辨率。感应同步器和磁栅式传感器也具有大量程测量的特点,但分辨力和精度都不如光栅位移传感器。③ 可动态测量,易于实现测量及数据处理自动化。④ 具有较强的抗干扰能力,对环境条件的要求不像激光干涉传感器那么严格,但不如感应同步器和磁栅式传感器的适应性强。油污和灰尘会影响它的可靠性,主要适合于在实验室和环境较好的车间使用。
2.2 PIC18F4550 硬件设计 PIC18F4550 的 USB 接口硬件设计比较简单,而单片机控制的外围设备属于一般单片机设计,可以参照一般 PIC 单片机的设计方法。对于 USB 接口,Microchip 公司提供了一套开发套件(Demo 板)帮助使用者开发自己的产品。它提供了应用程序、驱动程序和固件,帮助使用者熟悉 USB 的工作过程;同时,可以直接利用开发套件来扩展外围设备。图 1 是一个光栅位移传感器检测系统硬件电路框图,主要实现数据的采集、处理、传输和 PWM 脉冲的产生等。
从光栅传感器输入的信号有 5 路:±sin,±cos 以及零窗信号 zero。经差分放大电路合成,分 3 路进入 PIC 单片机模拟量输入口进行 A/D 转换;同时,经差分放大电路合成后的 sin、cos 信号经过零比较器后转换成数字脉冲信号,然后经 D 触发器和“与”门电路完成光栅位移的辨向。PIC 单片机 T0 和 T1 口接收来自“与”门电路的数字脉冲,完成光栅位移的计数(计算光栅尺移动的完整光栅数);PIC 单片机 RC1 口输出 4 MHz 的 PWM 脉冲信号作为 D 触发器的 CP 信号。
计算机的 USB 接口两根数据线分别接 PIC18F4550 的 D+和 D-口,用于完成计算机和单片机之间的数据通信。计算机的 USB 电源一方面为 PIC 微处理器提供能源,另一方面通过电源模块转换成±12 V 电源,为运放电路提供正负电源。
2.3 单片机软件部分设计单片机的软件部分主要完成光栅位移传感器的数据采集、A/D 转换、计算光栅位移传感器的正向、反向莫尔条纹的个数、为数字电路提供 CP 脉冲以及完成 USB 的通信等工作。
2.4 PIC18F4550 的固件设计微芯公司提供了一系列的 USB 寄存器,使用这些寄存器可以完成 USB 通信。大多数的 USB 通信都是通过中断来完成的,在 USB 中断服务程序内,要实现输入/输出接口,允许大多数的 USB 程序在后台完成。从应用的观点来看,枚举过程和数据通信的发生好像没有联系。对于单片机控制程序,目前没有任何厂商提供自动生成固件(firmware)的工具,因此所有程序都要由自己手工编制。
由于 USB 协议的复杂性,并且考虑到广大客户的需求,因此,Microchip 公司在推出 PIC18F4550 系列芯片时,提供了面向不同客户群的 DEMO 程序,这就大大减轻了系统开发人员的负担,同时缩短了开发周期。本系统的设计就是在 Microchip 公司提供的 DEMO 程序的基础上,进行必要的修改来完成的。本设计的具体固件主要由以下 8 个文件组成。① main.c:系统的主程序,包括 InitializeSystem()和 USBTasks(void)两个子程序,主要完成系统的初始化以及其他各种子程序的调用。
② usb9.c:实现的是 USB 协议第 9 章的功能,包括枚举总线的接口和核心功能,以及 USB 的中断服务程序。它处理由 USB 用户所产生的所有的中断。在这个程序中,主要实现对描述符的枚举以及休眠、复位功能,主要包括 USBCheckStdRequest(void)、USBStdGetDscHandler(void)和 USBStdFeatureReqHandler(void)等 5 个子程序。③ usbctrltrf.c:主要实现 USB 控制传输所需的各种功能,主要由 USBCtrlTrfSetupHandler(void)、USBCtr-lEPServiceComplete(void)和 USBPrepareForNextSetup-Trf(void)等 8 个子程序组成。
④ usbdrv.c:主要实现与 USB 驱动相关的功能,包括检查总线状态、USB 模块使能、USB 模块挂起、远程唤醒等功能;主要由 USBSuspend(void)、USBModuleEnable(void)、USBSoftDetach(void)和 USBDriverService(void)等 12 个子程序组成。⑤ usbdsc.c:主要是对该系统的描述,包括厂商、产品号等的描述。⑥ usbgen.c:对 USB 设备类的配置(在这里把它配置为通用 USB 类),主要包括 USB 通用类的初始化端点和读写,由 USBGenInitEP(void)、USBGenRead(byte*buffer,byte len)和 USBGenWrite(byte*buffer,bytelen)三个子程序组成。
⑦ usbmmap.c:主要用于检查 USB 在通信过程中,端点号与 BDT(缓冲器描述符表)之间的匹配。⑧ user.c:直接面向用户的应用程序,可以帮助用户完成自己的初始化配置、处理数据的读/写、I/O 口的处理,设备的请求等。本设计中下位机的大部分功能都是由这个程序来实现的,比如 A/D 转换及其数据的读取、1MHz 的 PWM 波形产生等。它主要包括 UserInit(void)、BlinkUSBStatus(void)、ServiceRequests(void)、ProcessIO(void)、ResetTempLog(void)和 ReadPOT(void)六个子程序。
2.5 PC 机软件编程要编写 PC 机上的软件,可以利用 Microchip 公司提供的开发工具包。该工具包是一个安装程序,安装后可以在安装目录下找到 USB 通用的驱动程序、用 Borland C 编写的应用程序、一些固件代码,以及编写应用程序所需的 API 函数等。对于一般的应用,驱动程序可以直接使用,无需重编。在编程中主要用到以下 7 个 API 函数:MPUSBGetDLL Version(),返回 DLL 的版本号;MPUSB-GetDeviceCount(),返回连接没备的数目;MPUSBOpen(),返回指定 pVID_PID 和 pEP 的 USB 设备端点的句柄,返回的是一个端点句柄;MPUSBRead(),从 IN 端点读取数据并填入缓冲区;MPUSBWrite(),对一个 OUT 端点写入数据并使用 pData 缓冲区;MPUSBReadInt(),从 Inter-rupt IN 端点读取数据并填人缓冲区;MPUSBClose(),关闭一个端点的句柄。
因为 Microchip 公司提供的 MPUS-BAPI.DLL 源程序是用 Borland C 编写的,这一程序无法在 VC 环境下编译,所以也不能产生隐式调用所需的.LIB 文件,因此本设计在使用 DLL 时用的是显式链接。PC 机的软件部分主要用于实现上位机同下位机之间的 USB 通信,光栅位移传感器位移信号的细分和显示等功能。实现这一功能的方法有很多种,比如采用简单的 VB、数据处理能力很强的 Delphi,或国内外广泛采用的 Borland C 和 VC 等。
为了下一步的软件开发以及与厂家的其他软件接口,本系统上位机的软件部分采用 VC++6.0 来实现。