基于DSP的数据采集系统的设计

基于DSP的数据采集系统的设计
基于DSP的数据采集系统的设计

第一章绪论

1.1课题研究的背景

在高度发展的当今社会中,科学技术的突飞猛进和生产过程的高度自动化已成为人所共知的必然趋势,而它们的共同要求是必须建立在有着不断发展与提高的信息工业基础上。人们只有从外界获取大量准确、可靠的信息经过一系列的科学分析、处理、加工与判断,进而认识和掌握自然界与科学技术中的各种现象与其相关的变化规律,并通过相应的系统和方法实现科学实验研究与生产过程的高度自动化。换言之,生产过程的自动化面临的第一个问题就是必须根据从各种传感器得到的数据来检测、监视现场,以保证现场设备的正常工作。所以对现场进行数据采集是重要的前期基础工作,然后再对现场数据进行传输和相应的处理工作,以满足不同的需要。

数据采集系统是一种应用极为广泛的模拟量测量设备,其基本任务是把信号送入计算机或相应的信号处理系统,根据不同的需要进行相应的计算和处理。它将模拟量采集、转换成数字量后,再经过计算机处理得出所需的数据。同时,还可以用计算机将得到的数据进行储存、显示和打印,以实现对某些物理量的监视,其中一部分数据还将被用作生产过程中的反馈控制量。

数据处理在整个科研工作中是个重要的必不可少的环节,数据处理系统工作的质量和速度如何,对整个科研工作的影响也是很大的。因此研究一种质量性能高的通用数据采集平台具有很大的意义。

从广泛的意义上来讲,数据采集与处理的主要包括以下几个方面:

(1)数据的采集:主要是解决非电量转换为电量的问题以及多路复用、数据的模拟形式和数字形式之间的转换问题。

(2)数据的记录:数据的存储是非常重要的问题。

(3)数据处理:包括预处理、数据检验和数据分析等步骤。

随着科学技术的飞速发展,对数据处理的实时性要求也愈来愈迫切。显然,不论在哪个应用领域中,数据处理越及时则经济效益就越大。例如在实时监控系统中,必然要求对测量数据实时处理。又如在新型飞机试飞中如能实现对某些关键数据的实时处理和监测,就能在这些数据发生异常变化时及时发现并采取措施,以避免机毁人亡的重大事故发生。可见,实时处理数据意义是很大的。由于电子计算机技术的蓬勃发展,为提高数据处理的实时性提供了广阔的前景。2断资源限制,可扩展性差;在一些电磁干扰性强的测试现场,无法专门对其做电磁屏蔽,导致采集的数据失真。而现代工业生产和科学研究的发展要求数据采集卡具有更好的数据采集、处理能力,传统的CPU 已经不能满足这一要求。针对以上要求。

1.2 国内外研究及开发现状

数据采集与处理一直是生产实践研究与应用领域的一个热点和难点。随着微电子制造工艺水平的飞速提高及数据分析理论的进一步完善与成熟,目前国内外对数据采集系统的高性能方面的研究上取得了很大的成就。就A/D 转换的精度、速度和通道数来说,采样通道从单通道发展到双通道、多通道,采样频率、分辨率、精度逐步提高,为分析功能的加强提供了前提条件[2]。而在数据分析的微处理器上,最初的数据采集系统以8 位单片机为核心,随着微电子技术的不断发展,新兴单片机的不断问世,十六位、三十二位单片机也为数据采集系统研制厂家所

采用,近来采用具有DSP 功能的数据采集系统也己投入市场。同时,通用PC 机的CPU 用于数据处理也较为常见。总之,伴随着高性能微处理器的采用和用户技术要求的不断提高,数据采集系统的功能也越来越完善。数据采集系统的发展主要体现在以下几个趋势:

首先,在专业测控方面,基于PC 计算机的数据采集系统越来越成熟和智能化。在过去的二十年中,开放式架构PC 机的处理能力平均每十八个月就增强一倍为了充分利用处理器速度的发展,现代开放式测量平台结合了高速总线接口,如PCI和PXI/Compact PCI,以便获得性能的进一步提升。计算机的性能提升和由此引起的基于计算机的测量技术的创新,正在持续不断地模糊着传统仪器和基于计算机的测量仪器之间的界线。

其次,在通用测控方面,采用嵌入式微处理器的方案也由早期的采用A/D 器件和标准单片机组成应用系统发展到在单芯片上实现完整的数据采集与分析,即目前极为热门的SOC (System On Chip)[3]。通常在一块芯片上会集成一个,可以采样多路模拟信号的A/D 转换子系统和一个硬CPU 核(比如增强型80_52 内核),而且其CPU 的运算处理速度和性能也较早期的标准CPU 内核提高了数倍,而且有着极低的功耗。这种单芯片解决方案降低了系统的成本和设计的复杂性。此外,为了解决SOC 方案中数据处理性能的不足,采用DSP 作为数据采集系统的CPU 的研究与应用目前也逐渐引起业内重视。但是这类产品目前仅仅处于发展的初级阶段,在精度、速度或其它性能指标上并不能很好的满足要求。因此,国内外以DSP 作为数据采集系统的采样控制和分析运算的研究与应用正在展开。

1.3 本文主要内容和章节安排

本文完成了一种基于数字信号处理器、通用串行总线接口的数据采集系统的方案的设计,实现了数据的采样与分析,重点针对DSP 硬件设计和DSP 软件设计展开研究。

全文的结构安排如下:

第1 章绪论,说明了课题的来源、研究的目的、意义以及国内外研究现状。

第2 章主要DSP数据采集系统总体设计方案,给出了适合本系统的方案。

第3 章给出了系统的硬件设计过程,重点研究DSP 硬件电路的设计。

第4 章给出了系统的软件设计过程,重点研究DSP的C语言编程思想以及用组态王开发上位机的方法,以及DSP与PC机之间的通信接口。

第5 章给出了系统测试过程和测试结果。

第6 章为本课题所做的工作进行总结,并提出今后研究工作的展望。

第二章DSP数据采集系统总体设计方案随着科学技术的飞速发展,数据处理这个环节在整个科研工作中是个重要的必不可少的过程,数据处理系统工作的质量和速度如何,对整个科研工作的影响也是很大的。因此,有必要了解数据采集系统的特点、主要性能指标以及一般的结构,在此基础上进行总体方案设计。

2.1现场处理器的选择

随着信息社会的不断发展,对数据采集的实时性和精度提出了更高的要求,传统的单片机显然不能满足要求。TI公司推出的系列DSP一改传统的冯。诺依曼结构,采用先进的哈弗总线结构。将程序和数据放在不同的存储空间内,每个存储空间都可以独立访问,而且程序总线和数据总线分开,从而使数据的吞吐率提高了一倍。

作为TI公司的TM320F2812具有很高的性价比,广泛应用于工业控制,特别是应用于处理速度,处理精度方面要求较高的领域。TMS320F2812的主要性能[6]如下:

(1)TMS320F2812芯片采用了高性能的CMOS技术,其主频最高可以达到150MHz,时钟周期为6.67ns。当内核电压为1.8V时,主频为135MHz;当内核电压为1.9V时,主频为150MHz。

(2)支持JTGA在线仿真接口。

(3)高性能的32位中央处理器。采用哈佛总线结构模式,具有快速的中断响应和中断处理能力,具有同一的寄存器编程模式,并且编程可兼容C/C++语言以及汇编语言。

(4) TMS320F2812片内含有128K×16位的Flash,分为4个8K×16位和6个16K×16位的存储段;而TMS320F2812片内含有128K×16位的ROM。

(5)时钟和系统控制:内含看门狗定时器模块;具有片内振荡器;支持动态锁相环倍频。

(6)3个外部中断模块,外部中断模块PIE可以支持96个外部中断,当前仅用了45个外部中断。

(7)128位安全密匙:可以保护Flash/ROM、OTP ROM和L0、L1 SARAM;防止系统中的软件程序被修改或读取。

(8)先进的仿真模式:具有实时分析以及设置断点的功能;支持硬件仿真。

(9)低功耗模式和节能模式:支持IDEL、STANDBY、HALT模式,即支持空闲模式、等待模式以及挂起模式;可以独立禁止/使能各个外设的时钟。

(10) 双向的10位串行数模转换器,采样速率可以达到166KHz,精度达到210即1024;

(11)带有功能强大的事件管理器:3个通用定时器、3个全比较单元、3个单比较单元、PWM脉宽调制电路、事件管理器模块中断控制电路、4个捕获单元以及QEP正交编码脉冲电路;

(12) 带有串行通讯接口模块(SCI)、串行外设接口模块(SPI)、数字I/O端口模块、CAN控制器模块,便于与外部设备通讯;

2.2处理器间的通信

在现场总线的设计过程中,我们考虑过用RS一485的基于R线构建分布式控制系统。但是较之目前许多RS一485基于R线构建的分布式控制系统而言,基于

CAN总线的分布式控制系统在以下方面具有明显的优越性。首先,CAN控制器工作于多主方式,网络中的各节点都可根据总线访问优先权(取决于报文标识符)采用无损结构的逐位仲裁的方式竞争向总线发送数据,且CAN协议废除了站地址编码,而代之以对通信数据进行编码,这可使不同的节点同时接收到相同的数据,这些特点使得CAN总线构成的网络各节点之间的数据通信实时性强,并且容易构成冗余结构,提高系统的可靠性和系统的灵活性。而利用RS一485只能构成主从式结构系统,通信方式也只能以主站轮询的方式进行,系统的实时性、可靠性较差。其次,CAN总线通过CAN控制器接口芯片82C250的两个输出端CANH和CANL与物理总线相连,而CANH端的状态只能是高电平或悬浮状态,CANL端只能是低电平或悬浮状态。这就保证不会出现象在RS一485网络中,当系统有错误,出现多节点同时向总线发送数据时,导致总线呈现短路,从而损坏某些节点的现象。而且CAN节点在错误严重的情况下具有自动关闭输出功能,以使总线上其他节点的操作不受影响,从而保证不会出现象在网络中,因个别节点出现问题,使得总线处于“死锁”状态。而且,CAN具有的完善的通信协议可由CAN控制器芯片及其接口芯片来实现,从而大大降低系统开发难度,缩短了开发周期,这些是只仅仅有电气协议的RS一485所无法比拟的。另外,与其它现场总线比较而言,CAN总线是具有通信速率高、容易实现、且性价比高等诸多特点的一种已形成国际标准的现场总线。这些也是目前CAN总线应用于众多领域,具有强劲的市场竞争力的重要原因。

由于本系统只是整个现场主控制系统中的一个子系统,需要与主系统其他子系统进行通信,并且相互能够进行实时的数据传输和处理。而CAN具有独特的设计思想,良好功能特性和极高的可靠性,现场抗干扰能力强,结构简单,只有两根线与外部相连,通信方式灵活,可以点对点、点对多点及全局广播方式发送和接收数据等等优点[ll],我们选择使用DsP本身就具有的cAN总线控制器模块来完成于其它子系统的通信。

2.3上位机软件的开发

近年来兴起的组态软件是一种标准化,模块化,商品化的通用工业控制开发软件,只需要进行标准功能模块的软件组态和简单的编程,就可以设计出标准化,专业化,通用性强,可靠性高的上位机人机界面控制程序,且工作量较小,开发调试周期短,对程序设计员要求也较低,并且由于组态软件都是由专门软件开发人员按照软件工程的规范来开发的,使用前又经过了比较长时间的工程运行考验,其质量是有充分保证的。因此,控制组态软件是性能优良的软件产品,已成为开发上位机控制程序的主流开发工具。

2.4PC机与DSP的通信接口

串行接口是指数据一位位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信,并可以利用电话线,从而大大降低了成本,特别适用于远距离通信,但传送速度较慢一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位传送,传按位顺序进行,最少只需一根传输线即可完成;成本低但传送速度慢。串行通讯的距离可以从几米到几千米;根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。

现已确定下位机选用TI公司的TMS320F2812 DSP芯片,数据经DSP采集后,

要实时将现场信息传输到PC机进行实时监控。DSP的与数据传输相关的外设有SCI、SPI、CAN。现已将CAN总线用于各个DSP间的通信,SPI为一种同步串行外设接口,使用较少。SCI接口可以工作在全双工工作模式,并且经接口芯片转换后可变成RS-232或RS-485电平标准,进而与PC机的串口相连。是一种较为实用的方案。

第三章数据采集系统硬件设计

3.1电源电路设计

TMS320F2812工作时所要求的电压分为两部分:3.3V的Flash电压和1.8V 的内核电压。TMS320F2812对电源很敏感,所以在选用电源芯片时要求电压精度比较高的芯片。传统的线性稳压器已经不能满足要求,TI公司推出了一些双路低压差电源调整器,其中TPS67D301非常适合于DSP系统中的电源设计。该芯片带有可单独供电的双路输出,一路固定输出电压为3.3V另一路输出电压可以调节,范围为1.5-5.5V;电压差大小与输出电流成正比,且在最大输出电流为1A时,最大电压差仅为350mV;具有超低的典型静态电流,期间无效状态时,静态电流仅为1uA;每路调整器各有一个开漏复位输出,复位延时时间200ms;工作温度范围-40C?-125C?。电源电路[7]如图3.1所示。

图3.1 电源产生电路

3.2复位电路及JTAG下载口电路的设计

考虑到TPS767D301芯片自身能够产生复位信号,此复位信号可以直接供DSP芯片使用,所以不用为DSP设置专门的复位电路。复位信号与DSP芯片的连接在图3.1中已经用网络标号标出。

在实际设计过程中,考虑到JA TG下载口[7-8]的抗干扰性,在与DSP相连的端口均需要采用上拉设计。JTAG主要有两大类:一类用于测试芯片的电气特性,检测芯片是否有问题;另一类用于Debug,对各类芯片以及其外围设备进行调试。JTAG下载电路如图3.2所示。

图3.2 JTAG电路

3.3 通讯接口电路设计

3.3.1 CAN总线接口电路设计

控制器局部网(CAN-Controller Area Network)属于现场总线的范畴,它是一种有效支持分布式控制或实时控制的串行通信网络,随着现代风力发电机组需要监测与控制的节点增多,CAN总线以其实时性好、可靠性高、抗干扰能力强的特点凸现了出来。

TMS320F2812具有一个eCAN模块,支持CAN2.0B协议。为了使F2812 eCAN模块的电平符合高速CAN总线的电平特性,在eCAN模块与CAN总线之间需要增加电平转换器件,如3.3V的CAN发送接收器SN65HVD232。该芯片是TI公司生产的 3.3VCAN总线收发器,具有差分收发能力,最高速率可达1Mb/s。在本设计中,SN65HVD230是用来驱动TMS320F2812和物理总线间的接口,提供对总线的差动发送和接收功能。将收发器的数据输入端D与DSP的

CANTX相连,用于本CAN节点发送的数据传送到CAN网络中;将收发器的数据输出端R与DSP的CANRX与相连,用于本节点接收数据。RS引脚为该收发器的方式选择引脚,只需将RS接逻辑低电平就可以使其工作在高速模式,此时的通信速率达到最高,没有内部输出上升斜率和下降斜率的限制,但最大速率的限制与电缆的长度有关,本设计中将RS接地。由于SN65HVD230提供3.3V电源供电,与LF2407A的供电电压相同,因此不需要做电平转换的处理。CAN总线电路[8]如图3.4所示。

图3.4 CAN电路

3.3.2 RS232接口电路设计

串口通信口(SCI)是一种采用两根信号线的异步串行通信接口,又称UART。TMS320F2812中有两组SCI通信,SCIA和SCIB。每组包括两个I/O引脚,分别是串行接收数据输入引脚(SCIRXD)和串行数据输出引脚(SCITXD)。SCI支持CPU与其他使用标准NRZ(非归零)格式的异步外设之间的数据通信,SCI收发器是双缓冲的,每个都有自己独立的使能和中断标志位,两者既可以独立工作,也可以在全双工模式下同时工作。通过对一个16位波特率选择寄存器的编程,可得到64 K种不同的波特率。对于40MHz的时钟输出,波特率最高可达到2500Kb/s 的速度。本设计中采用MAX232芯片作为控制器的异步串行通信转换接口。MAX232是符合RS232标准的串行通信驱动芯片,其低功耗关断模式可以将功耗减小到5μW以内。在设计中需要注意的是,由于RS232是单5V供电器件,所以它同DSP间的信号线必须有电平转换,此板采用的是74LS245。RS232的接口电路如图3.5所示。

图3.5 RS232串口电路

3.4 DlD/0接口模块

TM3s20F2812有多达41个通用、双向的数字刀O(GPIO)引脚,其中大

多数都是基本功能和一般刀O引脚,TMS320LF2407的大多数刀O引脚都可用来实现其他功能。数字刀0端口采用了一种灵活的方法,以控制专用FO引脚

和复用刀O引脚的功能,所有UO和复用引脚的功能可通过9个16位控制寄存器来设置。DSP的数字量输出主要用于控制继电器,继电器又可以用来控制各种设备的开关。DSP通过光隔进行隔离,然后经过一个非门进行驱动,再和继电器的线包相连。这样只需改变DSP输出电平的高低就可以控制按键的开断。数字量输入包括各种的开关信号、传感器的脉冲信号等等,其连接方法也

是通过一个光隔后,输入到DSP的刀O口。在这里需要注意的是数字量开关的速度,如果速率要求不高(比如微秒级),就可以使用TLP521系列的光隔,速

度在纳秒级则就需要选择快速光隔125],比如6N137。具体连接方式如图3一8。

第四章数据采集系统的软件设计

4.1 时钟和系统控制

为了让F2812DSP按部就班的执行相应的代码来实现功能,就得让DSP芯片“活”起来,除了给DSP提供电源外,还需向CPU不断地提供规律的时钟脉冲,这一功能由F2812内部振荡器OSC和基于锁相环PLL的时钟模块来实现。目前DSP 集成的片上锁相环PLL模块,主要作用是通过软件实时的配置片上外设时钟,提高系统的灵活性和可靠性。此外,由于采用软件可编程锁相环,所设计的处理器外部允许较低的工作频率,而片内经过锁相环模块提供较高的系统时钟,这种设计可以有效地降低系统对外部时钟的依赖和电磁干扰,提高系统启动和运行时的可靠性,降低系统对硬件的设计要求。

void InitSysCtrl(void)

{

Uint16 i;

EALLOW;

DevEmuRegs.M0RAMDFT = 0x0300;

DevEmuRegs.M1RAMDFT = 0x0300;

DevEmuRegs.L0RAMDFT = 0x0300;

DevEmuRegs.L1RAMDFT = 0x0300;

DevEmuRegs.H0RAMDFT = 0x0300;

// 禁止看门狗模块

SysCtrlRegs.WDCR= 0x0068;

// 初始化PLL模块

SysCtrlRegs.PLLCR = 0xA; //如果外部晶振为30M,则

SYSCLKOUT=30*10/2=150MHz

// 延时,使得PLL模块能够完成初始化操作

for(i= 0; i< 5000; i++){}

// 高速时钟预定标器和低速时钟预定标器,产生高速外设时钟HSPCLK和低速外设时钟LSPCLK

SysCtrlRegs.HISPCP.all = 0x0001; // HSPCLK=150/2=75MHz

SysCtrlRegs.LOSPCP.all = 0x0002; // LSPCLK=150/4=37.5MHz

// 对工程中使用到的外设进行时钟使能

SysCtrlRegs.PCLKCR.bit.EV AENCLK=1;

SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;

SysCtrlRegs.PCLKCR.bit.SCIENCLKA=1;

SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;

SysCtrlRegs.PCLKCR.bit.ECANENCLK=1;

EDIS;

}

4.2 看门狗软件设计

在由MCU构成的微型计算机系统中,由于单片机的工作常常受到外界电磁场的干扰,造成程序跑飞而陷入死循环,程序正常的运行被打断,由单片机控制的系统就无法继续工作,会造成整个系统陷入停滞状态,发生不可预料的后果。出于对单片机运行状态进行实时监测的考虑,便产生了一种专门监测单片机程序运行状态的电路,俗称“看门狗”。

看门狗电路的应用,使单片机可以在无人监控的状态下连续工作。其工作原理是:看门狗电路和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时的往看门狗这个引脚上送人高电平(或者低电平),这一程序语句分散地放在单片机其他控制语句中间:一旦单片机由于程序跑飞陷入某一段程序,进入死循环状态时,写看门狗引脚的程序便不能被执行。这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它与单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。

F2812中的看门狗原理和上述的MCU看门狗原理类似,作用是为DSP的运行情况进行“把脉”,一旦发现程序跑飞或者状态不正常,便立即使DSP复位,提高系统的可靠性。

F2812的看门狗电路有一个8位看门狗加法器WDCNTR,无论什么时候,如果WDCNTR计数器达到最大值,看门狗模块就会产生一个输出脉冲,脉冲宽度为512个振荡器时钟宽度。为了防止WDCNTR溢出,通常采用两种方法:一种是禁止看门狗,时计数器WDCNTR无效;另一种是定期“喂狗”,通过软件向负责看门狗计数器的看门狗密钥寄存器(8位的WDKEY)周期性的写入0x55+0xAA,紧跟着0x55写入0xAA能够清除WDCNTR。当向WDKEY写入0x55的时候,WDCNTR复位到时能的位置;只有再向WDKEY写入0xAA后才能使WDCNTR真正的被清除。写任何其他的值都会使系统立即复位。只要向WDKEY写0x55和0xAA,无论写的顺序如何都不会导致系统复位;而只有先写0x55,再写0xAA才会清除WDCNTR。

void KickDog(void)

{

EALLOW;

SysCtrlRegs.WDKEY = 0x0055;

SysCtrlRegs.WDKEY = 0x00AA;

EDIS;

}

4.3 通用输入输出口的软件设计

F2812 DSP为用户提供了56个通用的数字I/O引脚,这些引脚都是多功能复用引脚,复用的意思就是这些引脚既可以作为DSP片内外设,例如EV,SCI,SPI,CAN等的功能引脚,也可以作为通用的数字I/O口。引脚是作为数字I/O口还是外设功能引脚,可以通过寄存器来设置。

F2812的通用输入输出复用器GPIO就是I/O引脚的管理机构,它将56个引脚分为6组来管理,其中GPIOA和GPIOB各管理16个引脚,GPIOD管理4个引脚,GPIOE管理3个引脚,GPIOF管理15个引脚,GPIOG管理2个引脚。

GPIO的寄存器也分成了两大类:一类是控制寄存器,主要由功能选择寄存器GPxMUX,方向控制寄存器GPxDIR,输入限定控制寄存器GPxQUAL组成,其中x代表A、B、C、D、E、F或者是G;另一类是数据寄存器,主要由数据寄存器GPxDAT,置位寄存器GPxSET,清除寄存器GPxCLEAR和取反寄存器GPxTOGGLE组成。

void Scia(void)

{

EALLOW;

GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5=1;

GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4=1;

GpioMuxRegs.GPFDIR.bit.GPIOF4=0;

GpioMuxRegs.GPFDIR.bit.GPIOF5=0;

EDIS;

}

4.4 时钟软件设计

F2812芯片内部具有3个32位的CPU定时器——Timer0,Timer1,Timer2。其中CPU定时器1和2被系统保留,用于实时操作系统。只有CPU定时器0可以供用户使用。

F2812的CPU定时器寄存器有以下几个:32位的定时器周期寄存器PRDH:PRD,32位的计数器寄存器TIMH:TIM,16位的定时器分频寄存器TDDRH:TDDR,16位的预定标计数寄存器PSCH:PSC。

在CPU定时器工作前,先要根据实际的需求,计算好CPU定时器的值,然后给PRDH:PRD赋值。当启动定时器开始计数时,周期寄存器PRDH:PRD装载进定时器计数寄存器TIMH:TIM中,计数器寄存器里面的值每隔一个TIMCLK 就减小1,直到减小到0,完成一个周期的计数。完成一个周期的计数后,在下

一个定时器输入时钟周期开始时,周期寄存器PRDH:PRD里面的值重新装载入计数寄存器TIMH:TIM中,周而复始的循环下去。一个CPU定时器周期所经历的时间为(PRDH:PRD+1)*TIMCLK。TIMCLK的值是由定时器分频器TDDRH:TDDR和定时器预定标器PSCH:PSC来控制的。先给定时器分频器TDDRH:TDDR赋值,然后装载入预定标器PSCH:PSC中,每隔一个SYSCLKOUT脉冲,PSCH:PSC的值减一,当PSCH:PSC的值减为0的时候,就会输出一个TIMCLK,从而TIMH:TIM减1.在下一个定时器输入时钟周期开始的时候,TDDRH:TDDR中的值重新装载入PSCH:PSC中,周而复始的循环下去。因此,TIMCLK就等于(TDDRH:TDDR+1)个系统时钟时间。

#include "DSP28_Device.h"

struct CPUTIMER_VARS CpuTimer0;

struct CPUTIMER_VARS CpuTimer1;

struct CPUTIMER_VARS CpuTimer2;

void InitCpuTimers(void)

{

CpuTimer0.RegsAddr = &CpuTimer0Regs; //使得CpuTimer0.RegsAddr 指向定时器寄存器

CpuTimer0Regs.PRD.all = 0xFFFFFFFF; //初始化CpuTimer0的周期寄存器

CpuTimer0Regs.TPR.all = 0; //初始化定时器预定标计数器

CpuTimer0Regs.TPRH.all = 0;

CpuTimer0Regs.TCR.bit.TSS = 1; //停止定时器

CpuTimer0Regs.TCR.bit.TRB = 1; //将周期寄存器PRD中的值装入计数器寄存器TIM中

CpuTimer0.InterruptCount = 0; //初始化定时器中断计数器

}

void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period) {

Uint32 temp;

Timer->CPUFreqInMHz = Freq;

Timer->PeriodInUSec = Period;

temp = (long) (Freq * Period);

Timer->RegsAddr->PRD.all = temp; //给定时器周期寄存器赋值

Timer->RegsAddr->TPR.all = 0; //给定时器预定标寄存器赋值

Timer->RegsAddr->TPRH.all = 0;

// 初始化定时器控制寄存器:

Timer->RegsAddr->TCR.bit.TIF=1; //清除中断标志位

Timer->RegsAddr->TCR.bit.TSS = 1; //停止定时器

Timer->RegsAddr->TCR.bit.TRB = 1; //定时器重装,将定时器周期寄存器的值装入定时器计数器寄存器

Timer->RegsAddr->TCR.bit.SOFT = 1;

Timer->RegsAddr->TCR.bit.FREE = 1;

Timer->RegsAddr->TCR.bit.TIE = 1; //使能定时器中断

Timer->InterruptCount = 0; //初始化定时器中断计数器}

4.5 F2812 的中断系统

4.5.1 2812中断的简介

2812 的CPU 能够支持一个不可屏蔽中断NMI 和16 个可屏蔽的中断INT1-INT14、RTOSINT 和DLOGINT,2812 的CPU 为了能够及时有效的处理好各个外设的中断请求,设计了一个专门处理外设中断的扩展模块(the Peripheral Interrupt Expansion block),叫做外设中断控制器PIE,它能够对各种中断请求源(例如来自于外设或者其他外部引脚的请求)做出判断以及相应的决策。PIE 可以支持96 个不同的中断,这些中断分成了12 个组,每个组有8 个中断,而且每个组都被反馈到CPU 内核的12 条中断线中的某一条上(INT1-INT12)。PIE 目前只使用了96 个终端中的45 个,其他的等待将来的功能扩展。

PIE 内部的中断8列12行,总共有96个中断,黄色部分表示已经使用的中断,例如:查看事件管理器EVA 中定时器T1 的周期中断T1PINT-------T1PINT 在行号为INT2,列号为INTx.4 的位置,也就是说T1IPNT对应于INT2,是INT2 中的第四个中断。

4.5.2 2812 的 3 级中断机制

6

假如在程序的执行过程中,某一个外设产生了一个中断事件,那么在这个外设的某个寄存器中与该中断事件相关的中断标志位(IF=Interrupt Flag)被置为1。此时,如果该中断相应的中断使能(IE=Interrupt Flag)已经被置位为1,外设就会向PIE 控制器发出一个中断请求。相反的,如果虽然中断事件产生了,相应的中断标志位也被置1 了,但是该中断没有被使能(相应的使能位为0),那么外设就不会向PIE 发出中断请求,但是值得一提的是,相应的中断标志位会一直保持置位状态,直到用程序清除它为止。当然,在中断标志位保持在1 的时候,一旦该中断被使能了,那么外设立马会向PIE 发出中断申请。我们用具体的T1PINT 来进行进一步的说明。当定时器T1 的计数器寄存器T1CNT 计数到和T1 周期寄存器T1PINT 的值匹配时(相等时),就产生了一个T1PINT 事件,即T1 的周期中断。这时候,事件管理器EVA 的中断标志寄存器A(EVAIFRA)中的第7 位T1PINT FLAG 被置为1,这时候如果EV A 的中断屏蔽寄存器A (EVAIMRA)中的第7 位T1PINT 的使能位是1,则EVA 就会向PIE 发出中断请求,当然,如果该位的值是0,也就是该中断未被使能(被屏蔽),则EVA 不会向PIE 发出中断请求,而且EV AIFRA 中T1PINT FLAG 位将一直保持为1,除非通过程序将其清除。需要注意的是,不管在什么情况下,外设寄存器中的中断标志位都必须手工清除。

2).PIE 级

当外设产生中断事件,相关中断标志位置位,中断使能位使能之后,外设就会把中断请求提交给我们的PIE 模块。PIE 模块将96 个外设和外部引脚的中断进行了分组,每8 个中断为 1 组,一共是12 组,分别是PIE1-PIE12。每个组的中断被多路汇集进入 1 个CPU中断,例如DPINDA,PDPINDB,XINT1,XINT2,ADCINT,TINT0,W AKEINT 这7 个中断都在PIE1 组内,这些中断都汇集到CPU 中断的INT1。和外设级类似的,PIE 控制器中的每个组都会有一个中断标志寄存器PIEIFRx 和和中断使能寄存器PIEIERx,当然x=1.....12。每个寄存器的低8 位对应于8 个外设中断,高8 位保留。例如T1PINT 对应于PIEIFR2 的第4 位和PIEIER2 的第4位。PIE 除了每组具有刚才的PIEIERx,PIEIFRx 寄存器之外,还有一个PIEACK 寄存器,它的低12 位分别对应着12 个组,即INT1-INT12,高位保留。假如T1 的周期中断被响应了,则PIEACK 寄存器的第2位(对应于INT2)就会被置位,并且一直保持直到手动清除这个标志位。当CPU 在响应T1PNT 的时候,PI EACK 的第2 位一直是1,这时候如果PIE2 组内发生其他的外设中断,则暂时不会被PIE 响应送给CPU,必须等到PIEACK 的第 2 位被复位之后,如果该中断请求还存在,那么立马由PIE 控制块将中断请求送至CPU。所以,每个外设中断被响应之后,一定要对PIEACK 的相关位进行手动服务,否则同组内的其他中断都不会被响应。

(3)CPU 级

CPU 也有标志寄存器IFR 和使能寄存器IER。当某一个外设中断请求通过PIE 发送到CPU 时,CPU 级中与INTx 相关的中断标志位就会被置位。例如,T1 的周期中断T1PINT 的请求到达CPU 这边时,与其相关的INT2 的标志位就会被置位。这时候,该标志位就会被所存在IFR 中,这时候,CPU 不会马上去执行相应的中断,而是等待CPU 使能IER 寄存器的相关位,并且对CPU 寄存器ST1 中的全局中断屏蔽位做适当的使能。如果IER 中的相关位被置位了,并且INTM 的值为0,则中断就会被CPU 响应。在T1PINT 里,当IER 的

第2 位即INT2 被置位,INTM 为0,则CPU 就会响应定时器T1 的周期中断。CPU 接到了中断的请求,就得暂停正在执行的程序,转而去响应中断程序,但是此时,它必须得做一些准备工作,以便于执行完中断程序之后回过头来还能找到原来的地方和原来的状态。CPU 会将相应的IER 和IFR 位进行清除,EALLOW 也被清除,INTM 被置位,就是不能响应其他中断了,CPU 向其他中断发出了通知,正在忙,没空来处理你们的请求了,得等到处理完手上的中断之后才能再来处理你们的请求。然后,CPU 会存储返回地址并自动保存相关的信息,例如将正在处理的数据放入堆栈等等,做好这些准备工作之后,CPU 会从PIE 块中取出对应的中断向量ISR,从而转去执行中断子程序。

4.6 SCI

SCI(Serial Communication Interface),即串行通信接口,是一个双线的异步串口,即具有接收和发送两根信号线的异步串口,一般可以看作是UART (通用异步接收/ 发送装置)。

2812的SCI 模块支持CPU 与采用NRZ (non-return-to-zero 不归零)标准格式的异步外围设备之间进行数字通信。如果设计时我们的SCI 使用的是RS232 串行接口,那么,2812就能和其他使用RS232 接口的设备进行通信。例如2812内部的两个SCI 之间,或者2812的SCI 和其他DSP 的SCI 之间均能实现通信。

2812内部具有两个相同的SCI 模块,SCIA和SCIB,每一个SCI 模块都各有一个接收器和发送器。SCI 的接收器和发送器各具有一个16级深度的FIFO(First in fist out 先入先出)队列,它们还都有自己独立的使能位和中断位,可以在半双工通信中进行独立的操作,或者在全双工通信中同时进行操作SCI 模块具有两个引脚,SCITXDA 和SCIRXDA,分别实现发送数据和接收数据的功能,这两个引脚对应于GPIOF 模块的第4 和第5 位,在编程初始化的时候,需要将GPIOFMUX寄存器的第4 和第5 位置为1,才能使得这两个引脚具有发送和接收的功能。SCIA可以产生两个中断,SCIRXINTA 和SCITXINTA,即发送中断和接收中断。

4.6.1 SCI 模块的特点

1 -- 具有4 个错误检测标志:极性(parity)、溢出(overrun)、帧(framing)、中断(break)检测。

2 -- 多处理器模式下具有两种唤醒方式:空闲线方式和地址位方式。通常使用

的时候很少遇到多处理器模式,我们采用的是空闲线方式。

3 -- 通信工作于半双工或者全双工模式。

4 -- 具有双缓冲接收和发送功能,接收缓冲寄存器为SCIRXBUF,发送缓冲寄存器为SCITXBUF。

5 -- 发送和接收可以通过中断方式来实现,也可以通过查询方式来实现。

6 -- 具有独立的发送中断使能位和接收中断使能位。

7 -- SCIA 模块具有13 个控制寄存器,值得注意的是,这些寄存器都是8 位的寄存器,当某个寄存器被访问时,数据位于低8 位,高8 位为0,因此,把数据写入高8 位将是无效的。

4.6.2SCI 模块发送和接收数据的工作原理

SCI 有独立的数据发送器和数据接收器,这样能够保证SCI 既能够同时进行,也能够独立进行发送和接收的操作。

SCI 发送数据的过程如下:如图右半部分所示,在FIFO 功能使能的情况下,首先,发送数据缓冲寄存器SCITXBUF 从TX FIFO 中获取由CPU 加载的需要发送的数据,然后SCITXBUF 将数据传输给发送移位寄存器TXSHF,如果SCI 的发送功能使能,TXSHF 则将接收到的数据逐位逐位的移到SCITXD 引脚上。SCI 接收数据的过程如下:如图的左半部分所示,首先,接收移位寄存器RXSHF逐位逐位的接收来自于SCIRXD 引脚的数据,如果SCI 的接收功能使能,RXSHF将这些数据传输给接收缓冲寄存器SCIRXBUF,CPU 就能从SCIRXBUF 读取外部发送来的数据。当然,如果FIFO 功能使能的话,SCIRXBUF 会将数据加载到RX FIFO的队列中,CPU 再从FIFO 的队列读取数据

4.6.3 SCI 数据格式

在进行通信的时候,一般都会涉及到协议,所谓协议就是通信双方预先约定好的数据格式,以及数据的具体含义。这种事先约定好的规则,我们就把它叫做通信协议。

在SCI 中,通信协议体现在SCI 的数据格式上。通常将SCI 的数据格式称之为可编程的数据格式,原因就是可以通过SCI的通信控制寄存器SCICCR来进行设置,规定通信过程中所使用的数据格式。SCI 使用的是NRZ 的数据格式。NRZ 数据格式

1 -- 1 个起始位

2 -- 1—8 个数据位

3 -- 1 个奇/偶/非极性位

4 -- 1—2 个结束位

5 -- 在地址位模式下,有1 个用于区别数据或者地址的特殊位(仅用于多处理器通信)

真正的数据内容是1—8 位,1 个字符的长度。我们通常将带有格式信息的每一个数据字符叫做一帧,在通信中常常是以帧为单位的。SCI 有空闲线模式和地址位模式,而在平常使用的时候,我们一般都是两个处理器之间的通信,例如2812 和PC 机或者2812 和2812 之间通信,这时候,更适合使用空闲线模式,而

地址位模式一般用于多处理器之间的通信。在空闲线模式下,SCI 发送或者接收一帧的数据格式如图示,其中LSB 是数据的最低位,MSB 是数据的最高位。

4.6.4 SCI 发送和接收数据的机制

通常使用的有两种方式:一种是查询方式,另一种是中断方式。

查询方式:就是程序不断去查询状态标志位,看看SCI 是不是已经做好了数据发送或者接收的准备。当数据发送时,需要查询的是位于SCI 控制寄存器2(SCICTL2)的第7 为TXREADY,发送器缓冲寄存器就绪标志。当这个位为1 的时候,表明发送数据缓冲寄存器SCITXBUF 已经准备好开始接收并发送下一个数据了。当数据写入SCITXBUF,TXREADY 自动会清零,如果TXENA 使能了,发送移位寄存器TXSHF就会把SCITXBUF 里面的数据发送出去。当数据接收时,需要查询的是SCI 接收状态寄存器(SCIRXST)中的RXRDY,接收器就绪标志。当从SCIRXBUF 寄存器中已经准备好一个字符的数据,等待CPU 去读时,RXRDY 位就会置1。当数据被CPU从SCIRXBUF 读出后,或者系统复位,都可以使RXRDY 清0。

中断方式:如果需要使用中断,必须使能外设自己的中断、PIE 中断和CPU 中断。SCIA 的发送和接收中断分别位于PIE 模块第9 组的第1 和第 2 位,同时对应于CPU 中断的INT9。当前面所述的TXRDY 也是个中断标志位,当该位置 1 时,就会产生发送中断事件,如果各级中断都已经使能,则会响应SCI 的发送中断函数。当接收中断标志位RXRDY置1时,就会产生接收中断标志。如果各级中断已经使能,则会响应SCI 的接收中断。

void InitSci(void)

{

SciaRegs.SCICCR.bit.STOPBITS=0; //1位停止位

SciaRegs.SCICCR.bit.PARITYENA=0; //禁止极性功能

SciaRegs.SCICCR.bit.LOOPBKENA=0; //禁止回送测试模式功能

SciaRegs.SCICCR.bit.ADDRIDLE_MODE=0; //空闲线模式

SciaRegs.SCICCR.bit.SCICHAR=7; //8位数据位

SciaRegs.SCICTL1.bit.TXENA=1; //SCIA模块的发送使能

SciaRegs.SCICTL1.bit.RXENA=1; //SCIA模块的接收使能

SciaRegs.SCIHBAUD=0;

SciaRegs.SCILBAUD=0xF3; //波特率为19200

SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1; //重新使能发送FIFO的操作

SciaRegs.SCIFFTX.bit.SCIFFENA=1; //使能SCI FIFO的功能

SciaRegs.SCIFFTX.bit.TXFFST=12; //发送FIFO队列为空

SciaRegs.SCIFFTX.bit.TXFFINT=0; //没有产生发送FIFO中断

SciaRegs.SCIFFTX.bit.TXINTCLR=0; //没有清除TXFFINT的标志位

SciaRegs.SCIFFTX.bit.TXFFIENA=0; //bushiyong发送FIFO中断

SciaRegs.SCIFFTX.bit.TXFFILIL=0; //发送中断级别为12

SciaRegs.SCIFFRX.bit.RXFFOVF=0; //接收FIFO没有溢出

SciaRegs.SCIFFRX.bit.RXOVF_CLR=1; //对RXFFOVF标志位没有影响SciaRegs.SCIFFRX.bit.RXFIFORESET=1; //重新使能接收FIFO的操作

SciaRegs.SCIFFRX.bit.RXFIFST=0; //接收FIFO队列为空

SciaRegs.SCIFFRX.bit.RXFFINT=0; //没有产生接收中断

SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; //清除接收中断标志位

SciaRegs.SCIFFRX.bit.RXFFIENA=1; //使能FIFO接收中断

SciaRegs.SCIFFRX.bit.RXFFIL=14; //FIFO接收中断级别为14

SciaRegs.SCICTL1.bit.SWRESET=1; //重启SCI

}

4.7 组态王与单片机协议

4.7.1 通讯口设置:

通讯方式:RS-232,RS-485,RS-422均可。

波特率:由单片机决定(2400,4800,9600and19200bps)。

字节数据格式:由单片机决定。

注意:在组态王中设置的通讯参数如波特率,数据位,停止位,奇偶校验必须与单片机编程中的通讯参数一致

4.7.2 在组态王中定义设备地址的格式

格式:##.#

前面的两个字符是设备地址,范围为0-255,此地址为单片机的地址,由单片机中的程序决定;

后面的一个字符是用户设定是否打包,“0”为不打包、“1”为打包,用户一旦在定义设备时确定了打包,组态王将处理读下位机变量时数据打包的工作。

4.7.3 组态王与单片机通讯的命令格式:

读写格式(除字头、字尾外所有字节均为ASCII码)

字头:1字节1个ASCII码,40H

设备地址:1字节2个ASCII码,0—255(即0---0x0ffH)

标志:1字节2个ASCII码,bit0~bit7,

bit0= 0:读,bit0= 1:写。

bit1= 0:不打包。

bit3bit2 = 00,数据类型为字节。

bit3bit2 = 01,数据类型为字。

bit3bit2 = 1x,数据类型为浮点数。

数据地址:2字节4个ASCII码,0x0000~0xffff

数据字节数:1字节2个ASCII码,1—100,实际读写的数据的字节数。

数据…:为实际的数据转换为ASCII码,个数为字节数乘2。

异或:异或从设备地址到异或字节前,异或值转换成2个ASCII码

CR:0x0d。

通讯尝试恢复命令(COMERROR),请求地址为0的一个BYTE数据

//两个ASCII码转换为16进制

unsigned char ath_2(unsigned char a,unsigned char b)

{

if(a<0x40)

a-=0x30;

else if(a<0x47)

a-=0x37;

else if(a<0x67)

a-=0x57;

if(b<0x40)

b-=0x30;

else if(a<0x47)

b-=0x37;

else if(a<0x67)

b-=0x57;

return ((a<<4)+b);

}

//四个ASCII码转换为16进制

unsigned char ath_4(unsigned char a,unsigned char b,unsigned char c,unsigned char d)

{

if(a<0x40)

a-=0x30;

else if(a<0x47)

a-=0x37;

else if(a<0x67)

a-=0x57;

if(b<0x40)

b-=0x30;

else if(a<0x47)

b-=0x37;

else if(a<0x67)

b-=0x57;

if(c<0x40)

c-=0x30;

else if(c<0x47)

c-=0x37;

else if(c<0x67)

c-=0x57;

if(d<0x40)

d-=0x30;

else if(d<0x47)

d-=0x37;

else if(d<0x67)

d-=0x57;

return ((a<<12)+(b<<8)+(c<<4)+d);

}

interrupt void SCIRXINTA_ISR(void) // SCI-A接收中断函数

{

unsigned int i,a,b,x;

for(i=0;i<14;i++)

{

Rxbuffer[i] = SciaRegs.SCIRXBUF.all; //接收数据

}

b=0;

for(a=1;a<=10;a++)

{

b^=Rxbuffer[a];

}

if(b==ath_2(Rxbuffer[11],Rxbuffer[12])) //数据正确

{

DZ=ath_4(Rxbuffer[5],Rxbuffer[6],Rxbuffer[7],Rxbuffer[8]);//数据地址

s=(int)(AD[DZ/2]*1000);

x=s;

Txbuffer[8]=ASCII[x%16];

x=x/16;

Txbuffer[7]=ASCII[x%16];

x=x/16;

Txbuffer[6]=ASCII[x%16];

x=x/16;

Txbuffer[5]=ASCII[x%16];

b=0;

for(a=1;a<9;a++)

{

b^=Txbuffer[a];

}

Txbuffer[10]=ASCII[b%16];

b=b/16;

Txbuffer[9]=ASCII[b%16];

for(i=0;i<12;i++)

{

SciaRegs.SCITXBUF=Txbuffer[i];

相关主题
相关文档
最新文档