注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
dan158185的个人空间 https://home.eeworld.com.cn/space-uid-349284.html [收藏] [复制] [分享] [RSS]
日志

CC2538片内温度读取实验 TinyOS如何直接使用C文件

已有 692 次阅读2015-12-30 10:36

使用过CC2530的朋友肯定对TI的片内温度不陌生;下面带来2538的片内温度读取;先看实验结果:


代码部分:选择使用TinyOS来实现此处的实验是向大家展示如何TinyOS如何直接使用C(h)文件,打消大家认为TiinyOS编程只能用nesC的误区
1,温度读取函数 tinyos-main-release_tinyos_2_1_2\tos\chips\cc2538\adc 下的cc2538_temp_sensor.c和cc2538_temp_sensor.h

cc2538_temp_sensor.h文件:


[cpp] view plaincopyprint?


  • #ifndef CC2538_TEMP_SENSOR_H_  
  • #define CC2538_TEMP_SENSOR_H_  
  •   
  • #define CONST 0.58134 //(VREF / 2047) = (1190 / 2047), VREF from Datasheet  
  • #define OFFSET_DATASHEET_25C 827 // 1422*CONST, from Datasheet   
  • #define TEMP_COEFF (CONST * 4.2) // From Datasheet  
  • #define OFFSET_0C (OFFSET_DATASHEET_25C - (25 * TEMP_COEFF))  
  • uint16_t  Get_CC2538_Temp(void);  
  • #endif   


cc2538_temp_sensor.c文件:


[cpp] view plaincopyprint?


  • #include <stdbool.h>  
  • #include <stdint.h>  
  • #include <stdio.h>  
  • #include "hw_memmap.h"  
  • #include "gpio.h"  
  • #include "hw_ioc.h"  
  • #include "ioc.h"  
  • #include "interrupt.h"  
  • #include "adc.h"  
  • #include "sys_ctrl.h"  
  • #include "hw_sys_ctrl.h"  
  • #include "systick.h"  
  • #include "hw_rfcore_xreg.h"  
  • #include "hw_cctest.h"  
  • #include "cc2538_temp_sensor.h"  
  •   
  • uint16_t  Get_CC2538_Temp(void)  
  • {  
  •     uint16_t ui16Dummy;  
  •   
  •     //  
  •     // Enable RF Core (needed to enable temp sensor)  
  •     //  
  •     SysCtrlPeripheralEnable(SYS_CTRL_PERIPH_RFC);  
  •     //  
  •     // Connect temp sensor to ADC  
  •     //  
  •     HWREG(CCTEST_TR0) |= CCTEST_TR0_ADCTM;  
  •   
  •     //  
  •     // Enable the temperature sensor   
  •     //  
  •     HWREG(RFCORE_XREG_ATEST) = 0x01;  
  •       
  •     //  
  •     // Configure ADC, Internal reference, 512 decimation rate (12bit)  
  •     //  
  •     SOCADCSingleConfigure(SOCADC_12_BIT, SOCADC_REF_INTERNAL);  
  •       
  •    
  •     //  
  •     // Trigger single conversion on internal temp sensor  
  •     //  
  •     SOCADCSingleStart(SOCADC_TEMP_SENS);  
  •          
  •     //  
  •     // Wait until conversion is completed  
  •     //  
  •     while(!SOCADCEndOfCOnversionGet()){  
  •     }  
  •   
  •     //  
  •     // Get data and shift down based on decimation rate  
  •     //  
  •     ui16Dummy = SOCADCDataGet() >> SOCADC_12_BIT_RSHIFT;      
  •     return ui16Dummy;  
  •                  
  •   
  • }  

2,编写TinyOS例程:Adc_TempAppC.nc,Adc_TempC.nc,makefile文件:


makefile文件:


[plain] view plaincopyprint?


  • COMPONENT=Adc_TempAppC  
  • CFLAGS += -DUSE_TIMER_HANDLER  
  • CFLAGS += -DNOT_USE_PRINTFC_BUT_USE_PRINT  
  • include $(MAKERULES)  


Adc_TempAppC.nc文件

[plain] view plaincopyprint?


  • configuration Adc_TempAppC  
  • {  
  • }  
  • implementation  
  • {  
  •   components MainC, Adc_TempC;   
  •   components new TimerMilliC() as Timer1;  
  •    
  •   Adc_TempC -> MainC.Boot;  
  •   Adc_TempC.Timer1 -> Timer1;  
  • }  


Adc_TempC.nc文件:
[plain] view plaincopyprint?


  • /*******************************************************************  
  • *实验附加----CC2538片内温度读取  
  • *节点需求数1  
  • *编译命令make cc2538cb  
  • ********************************************************************/  
  •   
  • #include "Timer.h"  
  • #include "printf.h"  
  • #include "cc2538_temp_sensor.h"  
  •   
  • module Adc_TempC  
  • {  
  •    uses interface Timer<TMilli> as Timer1;  
  •    uses interface Boot;  
  • }  
  • implementation  
  • {  
  •   task void time1_Task();  
  •   uint16_t ui16Dummy=0;  
  •    
  •   /***************************************************  
  •   *启动事件  
  •   ****************************************************/  
  •   event void Boot.booted()  
  •   {  
  •     /**开启一秒的周期性定时器(单位毫秒)  Timer1**/  
  •     call Timer1.startPeriodic( 1000 );   
  •   
  •   }  
  •   
  •   /***************************************************  
  •   *任务time1_Task  
  •   ****************************************************/  
  •   task void time1_Task()  
  •   {     
  •       double dOutputVoltage;  
  •   
  •         
  •       ui16Dummy = Get_CC2538_Temp();  
  •       printf("ADC raw readout: %d\n", ui16Dummy);  
  •         
  •       //温度计算  
  •       dOutputVoltage = ui16Dummy * CONST;         
  •       dOutputVoltage = ((dOutputVoltage - OFFSET_0C) / TEMP_COEFF);  
  •       ui16Dummy = dOutputVoltage * 10;  
  •         
  •       printf("Temperature: %d", ui16Dummy/10);  
  •       printf(".%d", ui16Dummy%10);  
  •       printf(" C\n");  
  •   }  
  •    
  •   /***************************************************  
  •   *Timer1定时时间到事件  
  •   ****************************************************/  
  •   event void Timer1.fired()  
  •   {  
  •     /****提交time1_Task任务***/  
  •     post time1_Task();  
  •   }  
  •    
  • }  



大家可以看到Adc_TempC.nc文件中


[cpp] view plaincopyprint?


  • #include "cc2538_temp_sensor.h"  
  • ui16Dummy = Get_CC2538_Temp();  


这些不就是直接使用了C文件了吗?nesC只是C的方言,相信即使没有nesC语言基础的朋友应该也能大概看懂代码干了什么;就是1秒采集一次片内温度然后串口打印


至此可以引申如果是需要给TinyOS引入其他的传感器呢,呵呵,其实就是拿来厂家提供的C源码直接

使用即可,不用去写成nesC;


本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章