无线温度检测课件.pptx
ZigBee网络原理与应用,李曙英 2015.2.28,无线温度检测,实例:协调器建立网络,终端节点加入网络,终端节点周期性的采集温度数据并发送给协调器,协调器将收到的温度值用串口送PC机显示与上个实例的区别?,-3-,ADC,CC2530的ADC支持多达14位的模拟数字转换,具有多达12位的有效数字位。它包括一个模拟多路转换器,具有多达8个各自可配置的通道,一个参考电压发生器。转换结果通过DMA写入存储器。,ADC特征ADC输入ADC转换,-4-,ADC特征,可选的抽取率,设置了712位的分辨率。8个独立的输入通道,可接收单端或差分信号。参考电压可选为内部单端、外部单端、外部差分或AVDD5。产生中断请求。转换结束时的DMA触发。温度传感器输入。电池测量功能。,-5-,ADC输入,ADC的输入是通过端口0来实现的。输入引脚AIN0-AIN7是连接到ADC的。ADC输入有两种配置:单端输入和差分输入,单端电压输入AIN0到AIN7以通道号码0到7表示。通道号码8到11表示差分输入,由AIN0-1、AIN2-3、AIN4-5和AIN6-7组成。通道号码12到15分别表示GND、温度传感器和AVDD5/3。以上输入方式在寄存器ADCCON2和寄存器ADCCON3中详细配置。,-6-,ADC输入,ADCCON2寄存器-定义ADC的序列转换,-7-,ADC输入,ADCCON3寄存器-定义ADC单个值转换,/单次转换,参考电压为电源电压,对P0.7进行采样 12位分辨率ADCCON3=0 xb7;,-8-,ADC输入,除了输入引脚AIN0-AIN7,片上温度传感器的输出也可以选择作为ADC的输入,用于温度测量。通过配置寄存器TR0寄存器和ATEST寄存器可以获得片上温度 TR0寄存器,-9-,ADC输入,除了输入引脚AIN0-AIN7,片上温度传感器的输出也可以选择作为ADC的输入,用于温度测量。通过配置寄存器TR0寄存器和ATEST寄存器可以获得片上温度 ATEST寄存器,-10-,ADC转换,ATEST寄存器ADC的转换分为ADC序列转换和ADC单个转换。ADC执行一系列的转换,并把转换结果通过DMA移动到存储器,不需要任何CPU的干预 ADC序列转换与APCFG寄存器的设置有关,APCFG为8位模拟输入的I/O引脚设置,如果模拟I/O使能,每一个通道正常情况下应是ADC序列的一部分。如果相应的模拟I/O被禁用,将启用差分输入,处于差分的两个引脚必须在APCFG寄存器中设置为模拟输入引脚。ADCCON2.SCH寄存器位用于定义一个ADC序列转换,它来自ADC输入。如果ADCCON2.SCH设置为一个小于8的值,转换序列来自AIN0-AIN7的每个通道上;当ADCCON2.SCH设置为一个在8和12之间的值,序列包括差分输入;当ADCCON2.SCH大于或等于12,为单个ADC转换。,-11-,ADC转换,除了序列转换,每个通道都可以进行ADC单个转换,ADC单个转换通过配置寄存器ADCCON3.SCH完成。当通过写ADCCON3触发的一个单个转换完成时,ADC将产生一个中断。ADC的数字转换结果可以通过设置寄存器ADCCON1获得。,/开启ADADCCON1=0 x40;,-12-,ADC转换,ADC的数字转换结果存放在寄存器ADCH和ADCL中,ADCL ADC数据低位,ADCH ADC数据低高位,/将转换的结果从ADC:ADCH中取出放入到temp中 temp1=ADCL;temp0=ADCH;,-13-,ADC转换,下述内容用于实现任务描述,将AVDD(3.3v)AD转换,通过串口在PC机显示结果 AD的初始化,void InitialAD(void)/清EOC标志ADCH,-14-,ADC转换,下述内容用于实现任务描述,将AVDD(3.3v)AD转换,通过串口在PC机显示结果 头文件、宏定义以及函数声明,#include ioCC2530.h#define uint unsigned int/定义控制灯的端口#define LED1 P1_0#define LED2 P1_1char temp2;uint adc;float num;char adcdata=0.0V;/函数声明void Delay(uint);void initUARTtest(void);void InitialAD(void);void UartTX_Send_String(char*Data,int len);,-15-,ADC转换,下述内容用于实现任务描述4.D.7,将AVDD(3.3v)AD转换,通过串口在PC机显示结果 主函数部分,void main(void)/P1控制LED P1DIR=0 x03;/关LED LED1=1;LED2=1;/初始化串口 initUARTtest();/初始化ADC InitialAD();while(1)/等待ADC转换完成 if(ADCCON1,/开始下一转换 ADCCON1|=0 x40;/adc赋值 adc|=(uint)temp1;adc|=(uint)temp0)=2;if(adc,Zstack中ADC应用,协调器建立网络,终端节点加入网络,终端节点周期性的采集温度数据并发送给协调器,协调器将收到的温度值用串口送PC机显示协调器功能:建网,接收数据,向串口发数据终端节点功能:,无线测温-协调器编程,1 建网2 用户任务:事件1:接收数据-什么事件?SYS_EVENT_MSG下的 AF_INCOMING_MSG_CMD 事件2:向串口发数据-什么时候?接收到数据后-事件2包含 在事件1内,无线测温-协调器编程,涉及:串口设置、初始化;-同上例 温度数据存储区,无线测温-协调器编程,特殊之处:数据传递一般会用数据包。特点:命令头+数据+命令尾 用结构体构建数据包本例中的温度数据:struct RFRXBUF unsigned char Head;unsigned char value2;unsigned char Tail;BUF;,typedef union h uint8 TEMP4;struct RFRXBUF unsigned char Head;unsigned char value2;unsigned char Tail;BUF;TEMPERATURE;,TEMPERATURE temperature;/定义温度数据包存储区温度数据包在终端、协调器之间传递,TEMPERATURE 类要告知协调器、终端-怎么做?加入Coordinator.h、Enddevice.h中,无线测温-协调器编程,事件1触发:CoordApp_ProcessEvent任务中 case AF_INCOMING_MSG_CMD:GenericApp_MessageMSGCB(MSGpkt);break;,无线测温-协调器编程,void GenericApp_MessageMSGCB(afIncomingMSGPacket_t*pkt)TEMPERATURE temperature;switch(pkt-clusterId)case GENERICAPP_CLUSTERID:osal_memcpy(,无线测温-终端编程,1、加入网络-同以前例2、周期性的将温度传感器上的电压转换成数字量温度值,再用无线发送给协调器,无线测温-终端编程,1 片内温度传感器/使能片内温度传感器 ATEST=0 x01;/连上温度传感器 TR0|=0 x01;,无线测温-终端编程,2、ADC ADCIF=0;/清除ADC中断 ADCCON3=(HAL_ADC_REF_115v|HAL_ADC_DEC_256|HAL_ADC_CHN_TEMP);while(!ADCIF);/等待AD转换完成 ADCIF=0;value=ADCL;/读取AD 值 value|=(uint16)ADCH)=4;,数据发送,void GenericApp_SendTheMessage(void)uint8 tvalue;TEMPERATURE temperature;temperature.BUF.Head=,afAddrType_t my_DstAddr;my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;my_DstAddr.endPoint=GENERICAPP_ENDPOINT;my_DstAddr.addr.shortAddr=0 x0000;AF_DataRequest(,周期性触发发送事件,#define SEND_DATA_EVENT 0X01/定义事件/启动事件case ZDO_STATE_CHANGE:GenericApp_NwkState=(devStates_t)(MSGpkt-hdr.status);if(GenericApp_NwkState=DEV_END_DEVICE)osal_set_event(GenericApp_TaskID,SEND_DATA_EVENT);,/周期性工作if(events,无线测温-终端编程,程序结构传感器的操作为一个文件-Sensor.c,涉及到的名称常量定义-Sensor.h,无线测温-终端编程,Sensor.h#ifndef SENSOR_H#define SENSOR_H#include extern int8 readTemp(void);#endif,无线测温-终端编程-Sensor.c,#include Sensor.h#include#define HAL_ADC_REF_115v 0X00/设置参考电压为内部参考电压:00(7-6 位)#define HAL_ADC_DEC_256 0X20/设置抽取率256:10(5-4 位)#define HAL_ADC_CHN_TEMP 0X0e/序列通道选择,1110:温度传感器(3-0 位),无线测温-终端编程-Sensor.c,int8 readTemp(void)static uint16 reference_voltage;static uint8 bCalibrate=TRUE;uint16 value;int8 temp;ATEST=0 x01;TR0|=0 x01;ADCIF=0;/清除ADC中断 ADCCON3=(HAL_ADC_REF_115v|HAL_ADC_DEC_256|HAL_ADC_CHN_TEMP);,while(!ADCIF);/等待AD转换完成ADCIF=0;value=ADCL;/读取AD 值 value|=(uint16)ADCH)=4;,if(bCalibrate)/记录第一次读取的温度值,为后面校正用 reference_voltage=value;bCalibrate=FALSE;temp=22+(value-reference_voltage)/4);return temp;,