使用过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文件:
#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文件:
#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文件:
COMPONENT=Adc_TempAppC
CFLAGS += -DUSE_TIMER_HANDLER
CFLAGS += -DNOT_USE_PRINTFC_BUT_USE_PRINT
include $(MAKERULES)
Adc_TempAppC.nc文件
configuration Adc_TempAppC
{
}
implementation
{
components MainC, Adc_TempC;
components new TimerMilliC() as Timer1;
Adc_TempC -> MainC.Boot;
Adc_TempC.Timer1 -> Timer1;
}
Adc_TempC.nc文件:
/*******************************************************************
*实验附加----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文件中
#include "cc2538_temp_sensor.h"
ui16Dummy = Get_CC2538_Temp();
这些不就是直接使用了C文件了吗?nesC只是C的方言,相信即使没有nesC语言基础的朋友应该也能大概看懂代码干了什么;就是1秒采集一次片内温度然后串口打印
使用即可,不用去写成nesC;