BLE开发笔记——读取片上温度传感器数据
已经完成了串口打印就很方便调试了,学习其他外设的使用也更方便。本文就记录了温度传感器ADC采样的使用学习。片上的温度传感器输出的是模拟信号,所以需要配置AD采样对信号进行采集,然后进行换算获得温度。
结构
可以从CC2541用户手册中找到ADC的结构图如下,TMP_SENSOR就是温度传感器,ADC是Sigma-Delta模数转换器:
寄存器
ADC的使用
进行配置只需关心ADCCON1、ADCCON2或ADCCON3(ADCCON2和ADCCON3是一样的,配置哪个都可以,我配置的是ADCCON3)
-
ADCCON1寄存器可用来查询转换状态,可以配置触发事件类型,默认采用手动触发方式启动转换(STSEL=11b),ADCCON1默认值0x33,满足我这里的需要,不需配置。
-
这里选择配置ADCCON3(也可以配置ADCCON2),ADCCON.EREF用来配置参考电压源,默认是内部参考电压,ADCCON.EDIV用来配置转换精度,这里选择最高12位精度,ADCCON3.ECH用来选择转换通道,选择温度传感器,最终ADCCON3=0x3E。
ADC转换数据
ADC转换数据[13:6]存放到ADCH寄存器中,[5:0]存放在ADCL寄存器中。
开启温度传感器
开启温度传感器通过配置TR0和ATEST两个寄存器
温度传感器数据获取
使用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);
}
}