BLE开发笔记——读取片上温度传感器数据

已经完成了串口打印就很方便调试了,学习其他外设的使用也更方便。本文就记录了温度传感器ADC采样的使用学习。片上的温度传感器输出的是模拟信号,所以需要配置AD采样对信号进行采集,然后进行换算获得温度。

结构

可以从CC2541用户手册中找到ADC的结构图如下,TMP_SENSOR就是温度传感器,ADC是Sigma-Delta模数转换器:

1

寄存器

ADC的使用

进行配置只需关心ADCCON1、ADCCON2或ADCCON3(ADCCON2和ADCCON3是一样的,配置哪个都可以,我配置的是ADCCON3)

  • ADCCON1寄存器可用来查询转换状态,可以配置触发事件类型,默认采用手动触发方式启动转换(STSEL=11b),ADCCON1默认值0x33,满足我这里的需要,不需配置。

    2

  • 这里选择配置ADCCON3(也可以配置ADCCON2),ADCCON.EREF用来配置参考电压源,默认是内部参考电压,ADCCON.EDIV用来配置转换精度,这里选择最高12位精度,ADCCON3.ECH用来选择转换通道,选择温度传感器,最终ADCCON3=0x3E。

    3

ADC转换数据

ADC转换数据[13:6]存放到ADCH寄存器中,[5:0]存放在ADCL寄存器中。

4

开启温度传感器

开启温度传感器通过配置TR0和ATEST两个寄存器

5

6

温度传感器数据获取

使用ADC对温度传感器采样前需要开启温度传感器,如下:

void adcTempInit(void) {
    // 打开温度传感器
    TR0 = 0x01;
    // 使能温度传感器
    ATEST = 0x01;
}

编写手动读取温度传感器数据的函数,其中转换器获得的数据需要换算才能得到摄氏温度,代码如下:

// 获取温度传感器数据
float readTemperature(void) {
    int  reading = 0;
    int  Result = 0;
    float factor = 10.0;
    unsigned char i = 0;
    do{
        ADCCON3 = 0x0E | 0x20;           // 12位精度,启动转换
        while (!(ADCCON1 & 0x80));          // 等待转换完成

        // 读取采样结果
        reading = (int)(ADCL);
        reading |= (int)(ADCH << 8);
        reading >>= 4;                      // 丢弃低位
        Result += reading;                  // 累加
    }while(i++ < 10);   // 连续采样10次
    
    return ((Result/10)-1340) / factor;
}

在需要获取温度数据的地方调用函数即可,我在主函数获取温度数据并打印,每隔一秒PC串口助手就接收到一次温度数据,代码如下:

int main(void) {
    oscInit();              // 晶振时钟初始化
    serialInit();
    adcTempInit();
    
    while(1) {
        printFloatln(readTemperature());
        delay(1000);
    }
}

ble

839 字

2015-10-30 17:00 +0800