ZigBee 实验十一对于温度传感器,主要原理就是将温度转化成为模拟量,再通过ADC 将模拟信号转换成数字信号。
对于CC2530芯片内部已经集成了ADC ,该ADC 支持多达14 位的模拟数字转换,具有多达12 位的ENOB (有效数字位)。
它包括一个模拟多路转换器,具有多达8 个各自可配置的通道;以及一个参考电压发生器。
转换结果通过DMA 写入存储器。
还具有若干运行模式。
同时CC2530内部也集成了一温度传感器,可以通过配置寄存器,将温度传感器作为ADC 的输入,这样CC2530就可以方便的使用温度传感器。
在基础实验中,也用过了温度传感器,本实验主要是居于TI 的协议栈进行的无线采集无线采集温度实验简介11.1讯方通信 ZigBee实验12.2.1通过本实验了解Z-STACK协议栈中的ADC采集的使用及相关寄存器的配置。
11.3.1 硬件:(1) ZIGBEE 调试底板2个:图11-1 ZIGBEE 调试底板(2) UART 转接板与转接线各1个:图11-2 UART 转接板与转接线11.3实验设备转接串口输出,连接到电脑串口转接串口输入,连接到ZIGBEE 调试底板电源开关电源 传感器接口1传感器接口2传感器接口3J-LINK 接口ZigBee_DEBUG复位节点按键拨码开关ZigBee 按键红外发射指示灯ZigBee 复位可调电阻UART 转接线讯方通信 ZigBee实验(3)ZIGBEE仿真器1个;USB接口电源(上)和状态指示灯10PIN下载接口图11-3 ZIGBEE仿真器(4)ZIGBEE模块2个;图11-4 ZIGBEE模块(5)电源2个图11-5 电源(6)串口延长线1根图11-6 串口延长线讯方通信 ZigBee实验(7)硬件连接图图11-7 硬件连接11.3.2软件(1)IAR Embedded Workbench for MCS-51 7.51A集成开发环境;(2)TI Z-STACK;(3)仿真器驱动;(4)串口调试助手。
连接电脑USBZIGBEE DeBug连接口ZigBee调试底板与串口转接板连接连接电脑串口电源11.4 实验知识11.4.1ADC输入除了输入引脚AIN0-AIN7,片上温度传感器的输出也可以选择作为ADC 的输入,用于温度测量。
可通过配置寄存器TR0.ADCTM 和ATEST.ATESTCTRL去实现。
11.4.2片内温度传感器的温度计算方法在CC2530的用户手册中没找到相关的温度计算方法,而在CC2430用户手册用,可以得到以下一个表格:在TI提供的官方例程中“SimpleSensorEB-Pro”中,得到这样的一段话:value ranges from 0 to 0x8000 indicating 0V and 1.25VVOLTAGE_AT_TEMP_ZERO = 0.743 V = 19477TEMP_COEFFICIENT = 0.0024 V/C = 62.9 /CThese parameters are typical values and need to be calibratedSee the datasheet for the appropriate chip for more detailsalso, the math below may not be very accurate可以知道以上的确实为CC2530的内部温度传感器的电压与温度的关系,从而可以得到计算温度的方法。
讯方通信 ZigBee实验11.5 实验步骤11.5.1在开始本实验的仿真前,参看配套源资料中“关于节点板串口使用的统一说明”,先按照本说明去配置好串口,波特率38400,以便往下实验能正常使用串口。
图11-8 节点板串口使用的统一说明11.5.2启动IAR Embedded Workbench,打开对应配套实验源码中“路由器”的SampleApp.eww工程:图11-9 工程文件图11-10 打开工程界面11.5.3编译链接程序代码Make,这一步可以省略,因为进行DeBug前,IAR软件会先编译再下载代码到目标板上去仿真,但对于编译检查错误,这一步也很有必要。
如果正确编译后文件右侧的红星会消失。
在Make之前,最好Clean一下,如下图所示:图11-11 编译链接代码文件讯方通信 ZigBee 实验红色星星编译后变没有了编译后生成图11-12 编译前后对比如果正确建立工程并正确配置了工程,则此时编译是无错误的,编译无错误如图图11-13 编译链接无错误图11-14 编译连接有错误11.5.4按照前面“实验设备”小节中的“硬件连接图”连接好硬件并打开电源,点击DEBUG按钮或者”Project->Debug”或者快捷键“Ctrl + D”进行程序下载并Debug。
如有出错,请检查硬件连接或拔掉仿真器USB再重接图11-15 Debug 调试图11-16 程序正在下载到目标板11.5.5正确进入DeBug界面,如下图:图11-17 仿真调试界面11.5.6通过以上步骤已将路由器程序下载到节点,此时的节点叫“路由器”。
卸下仿真器与“路由器”的连接线,使得“路由器”为一个单独的个体。
再将仿真器与另外一个节点按照“硬件连接图”去进行连接。
按“实验步骤”从头开始,将“协调器”程序下载到到节点,以得到一个节点为“协调器”,一个节点为“路由器”。
图11-18 协调器与路由器11.5.7此时“协调器”节点与“路由器”节点已经准备好。
“协调器”则通过串口连接电脑,打印出收到的数据包。
先让“协调器”在DEBUG状态下全速运行,再给“路由器”上电运行(注意:协调器要先于路由器运行,不然两个节点可能建立不了连接。
如果“路由器”连接不到“协调器”,那么LED一直闪烁,闪烁周期大概1S)。
11.5.8在配套资料“提高实验”文件夹下找到“超级单片机工具软件.exe”,如果是WIN7系统,右键“以管理员身份运行”,选择电脑对应的端口,设置和程序对应的波特率“38400”,数据位“8”,停止位“1”,校验位“NONE”,然后点击“打开串口”图11-19 超级单片机工具软件图11-20 超级单片机工具软件界面11.5.9按下“全速运行”按钮进行试验验证,与下文“实验验证”小节内容进行验证本实验结果图11-21 调试功能按钮11.5.10实验完毕。
全速运行按钮单步运行复位步入函数步出函数11.6 实验验证11.6.1路由器是否每个1秒LED闪烁一下;11.6.2查看协调器串口(串口调试助手)是否有温度数据上传显示。
图11-22 实验结果验证11.7.1路由器设计uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ){afIncomingMSGPacket_t *MSGpkt;if(events&SYS_EVENT_MSG){MSGpkt=(afIncomingMSGPacket_t *)osal_msg_receive(SampleApp_TaskID);while(MSGpkt){switch(MSGpkt->hdr.event){case AF_INCOMING_MSG_CMD:break;case ZDO_STATE_CHANGE:GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);if(GenericApp_NwkState==DEV_ROUTER){osal_set_event(SampleApp_TaskID,SEND_DATA_EVENT);}break;default:break;}osal_msg_deallocate((uint8 *) MSGpkt);MSGpkt=(afIncomingMSGPacket_t *)osal_msg_receive(SampleApp_TaskID);}return (events ^SYS_EVENT_MSG);}if(events&SEND_DATA_EVENT){GenericApp_SendTheMessage();osal_start_timerEx(SampleApp_TaskID,SEND_DATA_EVENT,1000);return (events^SEND_DATA_EVENT);}return 0;}参考注解:当路由器检测到网络并加入网络后即会发生ZDO_STATE_CHANGE事件,当系统检测到该事件时,启动SEND_DATA_EVENT事件,在SEND_DATA_EVENT事件中每个1000MS进行一次GenericApp_SendTheMessage()函数的调用。
void GenericApp_SendTheMessage(void){int8 tvalue;uint8 datatemp[5];tvalue=readTemp();datatemp[0]=tvalue/10+'0';datatemp[1]=tvalue%10+'0';datatemp[2]='C';AF_DataRequest( &SampleApp_Flash_DstAddr, &SampleApp_epDesc,SAMPLEAPP_FLASH_CLUSTERID,3,datatemp,&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS );HalLedBlink(HAL_LED_1,0,50,500);}参考注解:本函数的目的主要是调用readTemp()温度读取函数,将数据进行字符串转换后通过无线电发送出去。
int8 readTemp(void){static uint16 reference_voltage;static uint8 bCalibrate=TRUE;uint16 value;int8 temp;ATEST=0x01;TR0|=0x01;ADCIF=0;ADCCON3=(HAL_ADC_REF_115V|HAL_ADC_DEC_256|HAL_ADC_CHN_TEMP);while(!ADCIF);ADCIF=0;value = ADCL >> 2; //ADCL寄存器低2位无效value |= (((UINT16)ADCH) << 6);if(bCalibrate){reference_voltage=value;bCalibrate=FALSE;}temp=22+((value-reference_voltage)/4);return temp;}参考注解:这个函数只要是开启AD采集,并将温度数值进行函数返回。