2024年2月6日发(作者:)

摘要

本设计以CC2530作为核心控制芯片,采用Z_Stack协议作为协议平台组成了一个小型的Zigbee网络。系统由一个协调器设备和三个终端设备组成有一个小型网络。通过协调器建立网络,终端设备加入网络,与协调器进行绑定,从而能够进行协调器和终端设备的数据传输。

重点是网络中终端设备进行检测温度,检测 和检测气体浓度的设计,在检测温度中利用了 ,在

将终端设备放置在室内的不在地方,每个终端设备中采集CC2530片内温度,数据采集和其他传感器的浓度采集等数据,经过无线传输到达协调器,通过串口线将各个终端设备的信息通过串口调试助手显示在电脑上。

第一章 序论

0引言

传统的温度监测系统是以电线和电缆作为基础传输介质组成的数据采集系统。目前常用的解决方案是在监控现场,将传感器布置在需要监测的关键位置,将各个传感器采集到的信号通过独立电缆传送到中央采集站,由中央采集站将所有连接的信号集中处理发送到上位机,进行实时数据采集。

如果需要监测的区域很大,需要很多传感器,相应的监测点分散,这种传统的有线方式就会存在线路布设复杂,接线繁琐,安装造价高,后期的电缆维护成木高等问题。由于有线温度监测系统木身的局限性,许多特殊环境下的网络覆盖和网络支持仍然是个难题。

比如在某些工业现场,一些工业环境禁止或限制使用电缆,而在其他一些工业环境要求完全把电缆屏蔽起来以高度防止来自大多数工业设施中的机器或其它无线电控制设备的干扰,更有一些高速旋转的设备根木无法通过电缆来传输数据信息。这种传统的串行集中式监测系统很大程度上影响系统的处理速度和系统的可靠性和灵活性。

鉴于上述情况,温度监测系统设计趋向于无线监测方式,用分布式的无线技术来代替传统的集中式有线技术,实现传感器和数据采集系统之间的直接通讯。无线传感器网络的出现和发展为这一问题提供了一个新的解决途径。本文在比较了几种通信协议后选择了低成本、低功耗和低速率的ZigBee协议,设计了一种基于ZigBee的无线温度监测系统。

Zigbee是Zigbee联盟在IEEE802.15.4定义的物理层( PHY )和媒介访问控制层 (MAC )基础之上制定网络层 (NWK)、 应用层 ( APL)和安全服务规范。ZigBee协议栈的每层为其上层提供一套服务功能: 数据实体提供数据传输服务, 管理实体提供其他服务。

1 CC2530芯片简介

CC2530是TI公司针对2.4GHz ISM频带推出的第二代支持ZigBee/IEEE 802.15.4协议的片上集成芯片。其内部集成了高性能射频收发器、工业标准增强型8051MCU内核、256KB

Flash ROM和8KB RAM。其主要特性:具有2个USART、8位和16位定时器、看门狗定时器、8路输入可配置的12位ADC、21个GPIO、AES128协同处理器,硬件支持CSMA-CA、数字化的RSSI/LQI和强大的DMA功能,具备电池监测和温度感测功能;支持5种工作模式,且转换时间短,可以较好地满足超低功耗系统的要求;在接收和发送模式下,电流损耗分别为24mA和29mA。由于其硬件设计简单,封装小,功耗低,在无线传感器网络中得到

了越来越广泛的应用。

U110391234DVDDAVDD5/AVDD_SOCAVDD_DREGAVDD3DGND_USBUSB_MUSB_PDVDD_USBAVDD2AVDD1AVDD4AVDD_GUARD3635341198765P2_0P2_1P2_2P1_0P1_1P1_2P1_3P1_4P1_52C?RF_P25C?CAPRF_N26CAPP2_4P2_332331pFL4L2L31pFSMA2.2pF4131220P0_0P0_1P0_2P0_3P0_4P0_5P0_6P0_7RESET_N2530XOSC32M_Q1XOSC32M_Q2DCOUPLRBLASGND2223403027pFX132M27pF41

图 CC2530RF射频板

第二章 总体设计

本设计以CC2530作为核心控制芯片,采用Z_Stack协议作为协议平台组成了一个小型无线Zigbee网络。系统由一个协调器设备和三个终端设备组成有一个小型网络。通过协调器建立无线网络,终端设备加入网络,与协调器进行绑定,进行协调器和终端设备的数据传输。将终端设备放置在室内的不同地方,每个终端设备中采集CC2530片内温度,数据采集和其他传感器的浓度采集等数据,经过无线传输到达协调器,通过串口线将各个终端设备的信息通过串口调试助手显示在电脑上。

每个终端设备的工作是接受传感器采集到的信息,通过AD采集放入CC2530的存储器中,将处理后的数据,通过无线网络传输到协调器中。

网络中的协调器的作用是建立一个无线网络,并且接受终端设备传递过来的数据,通过串口调试界面利用PC机显示。

整个终端设备中有传感器的采集模块,将传感器采集到的模拟量通过A/D转换模块得到主控芯片CC2530能识别的数字量。通过软件滤波,使采集到的信号更加稳定。主控芯片对数据进行处理,将其发送给网络中的协调器,通过协调器上和PC机相连的串口线,将数据通过串口在PC机的串口调试助手上显示,得到比较直观的数据。这样我们就可以通过无线网络监控各个终端节点的数据。

图1 ZigBee网络中终端设备的组成框图

第三章 硬件设计

3.1传感器电路

3.1.1片内温度

采集的数据中第一个是片内温度,片内温度利用的是CC2530片内集成的温度传感器,检测片内温度;通过CC2530中已经有的一路TEM_SENSOR输入端,使得片内温度传感器与AD模块相连,通过设置各个AD模块中用到的寄存器的值,得到片内温度传感器的温度,并将其作为第一个采集到的数据,通过串口助手显示到PC机上。

3.1.2 ADC数据采集

采集的数据中第二个滑动变阻器的数据采集,利用3.3V电源加载到滑动变阻器的两端,滑动变阻器中间分支的电压随着变阻器的调节而发生变化,采集此变化值作为ADC数据采集的模拟量输入到AIN7。通过滑动变阻器改变的电压值通过AD模块采集到单片机内部,参考电压为3.3V,实现从0-3.3V的电压显示,电路图为

VCC_IO10KAIN7

图2 ADC数据采集

3.1.3气体传感器

第三个是TGS2600检测气体浓度;检测气体浓度的模块是利用TGS2600模块随着检测气体浓度的变化产生而产生不同的电阻值,在下图中RS变阻器就是随着气体的浓度变化而出现电阻相应的变化,从而使得输出电压Vout的改变。在室温的时候加热器RH的电阻值为83Ω,传感器电阻的变化范围为10~90kΩ。

图3 气体传感器的基本测试电路

随着气体浓度的变化,出现RS随着变化。根据浓度和电阻变化有一个对照表,即可通过电阻变化值得到气体的浓度变化。

传感器电阻RS,可根据Vout测定,用下式计算:

RSVc*RLRL

Vout功耗(Ps)值可用以下式计算:

PsVcVout

2RS3.2 数据采集电路

CC2530中的AD采集电路图为下图。

图 4 CC2530中的ADC的框图

据上图可以有8路单独的数据采集,使用的是P0口的8位。还可以是VDD/3和TMP_SENSOR此是片内温度,本设计中的温度采集就是用了此路AD。参考电压可以是外部参考电压,AIN7这路的输入,AVDD,AIN6-AIN7的差分输入这四种形式,可以设置7 to 12bits 个有效分辨率。本设计中的数据采集时使用的AIN7口作为输入,AVDD的参考电压,在CC2530中AVDD为3.3V,可以达到12bits 的有效分辨率。气体传感器的输入口为AIN0,其他配置与数据采集相似。

3.3电源模块

电源部分,我们需要提供单片机的3.3V供电电源,和气体传感器采集时所需要的5V电源。我们采用分别供电的方式,首先通过3节5号电池通过TI公司的TPS79333模块降压实现3.3V的电源为单片机供电,用于提供射频模块的电压,IO端口的电压,和用于显示的电压。

同时用USB提供5V 电源为外围的气体传感器采集电路提供供电电源。3.3V供电电路如下图:

TPS79333OUTINBATTERY3*NO.5C10.1UBYPASSENU12.2UC20.01UC3VCC_IOVCC_RFGND+3.3V_DISPLAY

图5 3.3V电源模块

3.4 五相键电路和复位电路

JOY_UP100KR4JOY_RT100KR1114VCC_IORIGHTUP10KCOMMONVCC_IO5RESETJOY_PUSH2R6100KCENTER PUSHDOWNLEFTSW-PBJOYSTICK3JOY_LTR8100K5相键电路6JOY_DNR9100K复位电路

图6 五相键电路和复位电路

设置了一个五相键,有五个方位,可以满足电路中按键的需求,是一个高效率的按键,可以上下左右和中五个方向进行按键。同时

127432U4A34574326910PUSHUPDNLTRT100k200k200k330k200k330kTLV272TLV272VCC_IO220K100KJOY_LEVELVCC_IOVCC_IO743281213743211JOY_MOVEU4BU4CU4D100K100K100pF47K10K10K

图7 五相键的转换电路

经过电路转换电路,将五相按键转换成两个引脚JOY_MOVE 和JOY_LEVEL。通过74HC32的四组两输入端或门,只要有一个方向按下,则JOY_MOVE为1,并通过JOY_LEVEL判断按下的是哪个方向。

第四章 软件设计

4.1 ZigBee协议栈

Zigbee协议栈由一组子层构成。每层为上层提供一组特定的服务;一个数据实体提供数据传输服务;一个管理实体提供全部其他服务。每个服务实体通过一个服务接入点(SAP)为上层提供服务接口,并且每个SAP提供了一个系列的基本服务指令来完成相应的功能。

Zigbee协议栈的体系结构包括Zigbee应用层、Zigbee网络层、IEEE 802.15.4 MAC层和IEEE

802.15.4 PHY层。它虽然是基于标准的7层开放式系统互联(OSI)模型,但仅对那些涉及Zigbee层予以定义。IEEE 802.15.4 2003标准定义了最下面的两层:物理层(PHY)和介质

接入控制层(MAC)。Zigbee联盟提供了网络层和应用层(APL)框架的设计。其中应用层的框架包括了应用支持子层(APS)、Zigbee设备对象(ZDO)和由制造商制订的应用对象。

本设计中使用的是Z-Stack 2007协议栈,Z-Stack与ZigBee之间并不能完全划等号,Z-Stack是ZigBee的具体实现。该Z-Stack 2007协议,采用了操作系统的概念,程序中为OSAL层。在执行外界处理程序时,该OS(操作系统)保护Z-Stack软件成分。它提供如下管理:

 任务登记、初始化、启动

 任务间的信息交换

 任务同步

 中断处理

 定时器

 存储器分配

图 8 ZigBee协议的结构图

在ZigBee协议中,协议本身已经定义了大部分内容。在基于ZigBee协议的应用开发中,用户只需要实现应用程序框架即可。从上图可以看出应用程序框架中包含了最多240个应用程序对象。如果我们把一个应用程序对象看做为一个任务的话,那么应用程序框架将包含一个支持多任务的资源分配机制。于是OSAL便有了存在的必要性,它正是Z-Stack为了实现这样一个机制而存在的。

OSAL就是以实现多任务为核心的系统资源管理机制。所以OSAL与标准的操作系统还是有很大的区别的。简单而言,OSAL实现了类似操作系统的某些功能,但并不能称之为真正意义

上的操作系统。当有一个事件发生的时候,OSAL负责将此事件分配给能够处理此事件的任务,然后此任务判断事件的类型,调用相应的事件处理程序进行处理。

4.2 建立网络

4.2.1 网络形成

图9 网络组成

每个设备都有一组能被配置的参数。这个配置参数在代码中已经定义了默认值。在同一个网络中,所有设备的“网络细节”(Network-specific)配置参数参加被配置成一样的值;每个设备的“设备细节”(Device-specific)配置参数可以配置为不同的值。

但是ZCD_NV_LOGICAL_TYPE必须被设置,直至有正确的一个设备作为协调器被配置;所有的电池电源设备作为终端设备被配置。

一旦这些工作都完成,协调器设备将建立网络,其他设备将发现和加入这个网络。协调器将扫描所有被ZCD_NV_CHANLIST参数所指定的通道建立网络。协调器选择用ZCD_NV_PANID参数指定的网络ID。如果ZDAPP_CONFIG_PAN_ID设定为0xFFFF,那么协调器建立的网络将根据自身的IEEE地址建立一个随机的PAN ID;如果ZDAPP_CONFIG_PAN_ID未被设定为0xFFFF,那么协调器建立网络的PAN ID 将由ZDAPP_CONFIG_PAN_ID指定。所有的参数配置好后,调用ZDO_StartDevice()函数来启动一个设备。

4.2.2路由器和终端设备加入网络

路由器和终端设备启动之后,将扫描DEFAULT_CHANLIST指定的频道。如果ZDAPP_CONFIG_PAN_ID没有被定义为0xFFFF,那么路由器将强行加入ZDAPP_CONFIG_PAN_ID定义的网络。此时的ZDAPP_CONFIG_PAN_ID必须为一个正确的值——小于或等于0x3FFF。若发现/加入网络,调用ZDO_StartDevice()启动该设备。

4.2.3 绑定

绑定是控制信息从一个应用层到另一个应用层流动的一种机制。

有以下两种可用的机制配置设备绑定:

(1)如果目的设备的扩展地址是已知的,则zb_BindDevice ( )函数就能创建一个绑定条目。

(2)如果扩展地址是未知的,则一个“按钮”可以利用。这样的话,这个目的设备首先要处于一种状态,它将被zb_AllowBindResponse( )发出一个匹配响应,然后在源设备处zb_BindDeviceRequest( )函数带着空的地址发出。

 已知扩展地址的绑定

这里可以调用函数zb_BindDevice ( )发起绑定请求:

zb_BindDevice ( uint8 create, uint16 commandId, uint8 *pDestination );

程序清单4.1

if ( pDestination )//已知扩展地址的绑定

{

de = Addr64Bit;

osal_cpyExtAddr( r, pDestination );

ret = APSME_BindRequest( sapi_nt, commandId,

&destination, sapi_nt ); //调用APS绑定请求函数

if ( ret == ZSuccess )

{

//绑定成功,调用函数ZDP_NwkAddrReq,得到被绑定设备的短地址

ZDP_NwkAddrReq(pDestination, ZDP_ADDR_REQTYPE_SINGLE, 0, 0 );

osal_start_timerEx( ZDAppTaskID, ZDO_NWK_UPDATE_NV, 250 );

}

}

 未知绑定地址的绑定

在该绑定方式下,发送绑定请求之前,先要让被绑定的目的设备处于允许绑定模式。可以调用函数zb_AllowBind()进入该模式,调用该函数使设备在给定时间内进入允许绑定模式。

在zb_AllowBind()该函数中调用函数afSetMatch,使之允许响应ZDO的匹配描述符请求。

在目的设备处于允许绑定模式的时间内,源设备可以调用函数zb_BindDevice发送绑定请求,此时执行过程清单4.2所示的代码。

程序清单4.2

{

ret = ZB_INVALID_PARAMETER;

de = Addr16Bit;

ddr = NWK_BROADCAST_SHORTADDR;

if(ZDO_AnyClusterMatches(1,&commandId,sapi_Desc->AppNumOutClusters,

sapi_Desc->pAppOutClusterList ) )

{

// 匹配一个在允许绑定模式下的设备

ret = ZDP_MatchDescReq( &destination, NWK_BROADCAST_SHORTADDR,

sapi_Desc->AppProfId, 1, &commandId, 0, (cId_t *)NULL, 0 );

}

else if( ZDO_AnyClusterMatches(1&commandId,sapi_Desc->AppNumInClusters,

sapi_Desc->pAppInClusterList ) )

{

ret = ZDP_MatchDescReq( &destination, NWK_BROADCAST_SHORTADDR,

sapi_Desc->AppProfId, 0, (cId_t *)NULL, 1, &commandId, 0 );

}

if ( ret == ZB_SUCCESS )

{

//设置一个时间,确保绑定完成

osal_start_timerEx(sapi_TaskID, ZB_BIND_TIMER, AIB_MaxBindingTime);

sapi_bindInProgress = commandId;//允许基于命令的绑定过程

return;

}

}

在之中调用了函数ZDP_MatchDescReq,将建立和发送一个匹配描述符(Match Description)请求。用这个函数搜索在一个应用中的输入/输出串列表中匹配某条件的设备/应用。该绑定响应处理在SAPI_ProcessEvent事件处理函数中。

建立绑定之后,才可以终端和终端进行数据互传,这种互传是逻辑上的相互,实际上通过各个终端的父节点相互互传,例如终端1要与终端2进行互传,他们的父节点都是路由器1,则终端1将数据发给路由器1,路由器在绑定表中找到终端1绑定的终端2 ,将数据传递给终端2 ,这里我们会认为是终端1和终端2的直接通讯,实则是通过父节点完成的。

4.3 数据采集

加入网络的终端设备的作用就是采集数据,传递到网络中,通过协调器与PC机相连。在PC机上得到各个节点的片内温度,数据采集和气体传感器浓度的采集。在本实验中利用的是CC2530的片内温度作为温度来源,滑动变阻器上的阻值变化而产生的电压变化作为可变的数据采集,通过软件滤波得到的电压值作为AD模块采集的模拟量,通过P0.7引脚进入CC2530的AD采集端口。气体浓度的采集是通过TGS2600随浓度的变化而产生的电阻值得变化而产生的电压变化作为模拟量输入P0.0进入CC2530的AD数据采集端口。

4.4 终端设备发送数据

通过按键触发发送数据事件MY_REPORT_EVT

zb_HandleKeys 函数中有

if ( keys & HAL_KEY_SW_3 )

{

// Start reporting

osal_set_event( sapi_TaskID, MY_REPORT_EVT );

reportState = TRUE;

}

按五相键的DOWN键时启动MY_REPORT_EVT事件。在collector.c文件中定义了

#define MY_REPORT_EVT 0x0002

表明MY_REPORT_EVT事件的任务ID号为0x0002。

启动事件之后在轮询机制zb_HandleOsalEvent函数里面进行对相应事件处理函数的调用,

if ( event & MY_REPORT_EVT )

{

if ( appState == APP_REPORT )

{

sendReport();

osal_start_timerEx( sapi_TaskID, MY_REPORT_EVT, myReportPeriod );

}

}

调用了sendReport来进行事件处理

void zb_SendDataConfirm( uint8 handle, uint8 status )

{

if(status != ZB_SUCCESS)

{

if ( ++reportFailureNr >= REPORT_FAILURE_LIMIT )

{

osal_stop_timerEx( sapi_TaskID, MY_REPORT_EVT );//停止发送事件

// After failure reporting start automatically when the device

// is binded to a new gateway

reportState=TRUE;

// Try binding to a new gateway

osal_set_event( sapi_TaskID, MY_FIND_COLLECTOR_EVT );

reportFailureNr=0;

}

}

// status == SUCCESS

else

{

// Reset failure counter

reportFailureNr=0;

}

}

在轮询机制zb_HandleOsalEvent函数里面

if ( event & MY_REPORT_EVT )

{

if ( appState == APP_REPORT )

{

sendReport();

osal_start_timerEx( sapi_TaskID, MY_REPORT_EVT, myReportPeriod );

}

}

如果事件是MY_REPORT_EVT就执行sendReport函数,在此函数中将采集到的温度,可变电阻器的电压值和气体传感器采集到的数据打包放入pdata数组,调用zb_SendDataRequest函数发送到与本设备相绑定的目的设备中。

4.5 协调器接收数据

此事件的响应函数为SAPI_ProcessEvent对应的AF_INCOMING_ MSG_CMD,协调器调用了SAPI_ReceiveDataIndication函数对发送数据事件进行处理,其又调用了zb_ReceiveDataIndication函数执行具体的事件。

4.6协调器将数据传给串口

4.6 软件流程图

图10 总流程图

第五章 开发环境和在Z_STACK协议栈

本设计中,利用的是与CC2530开发板相配套的IAR Embedded Workbench for MCS-51

V7.51A作为开发环境。Z_STACK协议栈的版本为ZStack-CC2530-2.3.0-1.4.0。

第六章 调试部分

酒精浓度与AD采集对照表

第七章 结论

致谢语

参考文献

[1] 李文仲,段朝玉等.Zigbee2007/PRO协议栈实验与实践[M].北京:北京航空航天大学出版社,2009.3.

[2] 高守玮,吴灿阳等.ZigBee 技术实践教程[M]. 北京航空航天大学出版社,2009.6

.

附录