版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21352095/article/details/83046830
TI CC2530 学习笔记-目录
功能:使用CC2530的ADC对内部温度传感器进行采样,并计算采样结果所对应的真实值,温度值通过串口发送,同时翻转LED灯,CC2530的温度传感器并不精准,请勿在精度要求在5度以内的场合使用。外界温度变化不会立刻体现的采样结果上,如果使用打开的电烙铁靠近CC2530,采样结果会快速发生变化,请尽量不要用手直接接触CC2530来验证内部温度传感器。静电可能会导致芯片损坏。每1000毫秒对温度进行一次更新。
- 配置温度传感器等
halMcuWaitUs(10000); //等待时间稳定,约10ms
CLKCONCMD &= ~0x47; //选择外部32MHZ时钟, 不分频
//TICKSPD不改变,保持为0x01,即定时器标记频率为16MHz
while( (CLKCONSTA & 0x47) != 0x00 ); //切换时钟源后再次等待稳定
P0DIR |= 0x40; //配置IO为输出
/* 初始化串口 */
P0SEL |= 0x0C; //将P02,P03设为外设功能
PERCFG &= ~0x01; //串口0占用P02 P03
U0CSR = 0X80; //USART模式设为UART模式
U0UCR = 0x00; //禁用流控,禁用奇偶检验,1位停止位
U0CSR |= 0x40; //允许接收
U0GCR |= 8; //9600
U0BAUD = 59;
IEN0 |= 0x04; //开串口0接收中断
/* 初始化定时器3 */
T3CTL = 0xE2; //128分频(0.125Mhz),模模式
T3CCTL0 = 0x04; //比较模式
T3CC0 = 125; //溢出值
T3CTL |= 0x08; //打开溢出中断
T3CCTL0 |= 0x40;//开T3通道0中断
T3IE = 1; //定时器3中断使能
T3CTL |= 0x10; //启动定时器
IEN0 |= 0X80; //开总中断
/* 温度传感器初始化 */
TR0 |= 0x01;//连接温度传感器到SOC_ADC
ATEST |= 0x01; //使能温度传感器
LED_R_IO = LED_R_ACTIVE;
/* 取校准用的值*/
adc = ADCL;
adc = ADCH; //清除ADCCON1.EOC标志
ADCCON3 = 0x3E; //内部参考电压,12位有效精度,对温度传感器进行采样
while (!(ADCCON1 & 0x80));//等待转换完成
gVoltageAtTemp25 = ADCL;//保存第一次采集的数据,用于后面的校正
gVoltageAtTemp25 |= (uint16)ADCH << 8;
gVoltageAtTemp25 >>= 4;//去除低4位
- 在while循环里检测温度
while(1)
{
/* 检查是否需要打印 */
if (gSample == 1)
{
gSample = 0;
adc = ADCL;
adc = ADCH; //清除ADCCON1.EOC标志
ADCCON3 = 0x3E; //内部参考电压,12位有效精度,对温度传感器进行采样
while (!(ADCCON1 & 0x80));//等待转换完成
adcResult = ADCL;
adcResult |= (uint16)ADCH << 8;
adcResult >>= 4;//去除低4位
tResult = 25 + ((float)adcResult - gVoltageAtTemp25) / 4.5;//温度校正
tString[0] = (uint16)tResult / 10 + '0';
tString[1] = (uint16)tResult % 10 + '0';
tString[2] = 'C';
tString[3] = '\n';
halUart0SendString(tString,4);
LED_R_TOG();
}
}