第八节 CC254x内部温度传感器温度采集

第八节  CC254x内部温度传感器温度采集
    CC254x内部有一个温度传感器,我们这节使用这个传感器来采集芯片的温度,此传感器精度不高。不适合用于实际的工程中,这里只为演示AD采样。要使用内部的温度采集我们需要使用AD采样,所以我们需要先来了解CC254x的AD功能。在后续课程有对ADC的详细说明。
    ADC结构图如下所示:


 ADC控制寄存器1如下图所示:


我们使用手动触发的方式进行AD采样,所以STSEL = 11B,最低两位始终为1,最终ADCCON1=0x33。
    ADC控制寄存器3如图所示:


ADC参考电压使用内部电压,采用12位精度采集。采集温度通道。所以ADCCON3= 0x3E。这里注意一点,ADCCON2和ADCCON3的配置是一样的,我们这里用ADCCON3来配置。
uint16 ADC_Read (uint8 channel)
{
    int16  reading = 0;
    uint8  adcChannel = 0x01<<channel;
    int16  Result = 0;

    if (channel <= 7)   // 通道0-7需要通过P0.0-P0.7输入
    {
        ADCCFG |= adcChannel;
    }

    uint8 i=0;
    do{
        ADCCON3 = channel | 0x20;           // 12位精度,启动转换
        while (!(ADCCON1 & 0x80));          // 等待转换完成

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

    if (channel <= 7)
    {
        ADCCFG &= (adcChannel ^ 0xFF);
    }

    return (Result/10);
}

在读取温度值前,我们还需要使能温度传感器。
int main(void)
{
    float temp=0;
    char LCDBuf[21] = {0};
    SysStartXOSC();         // 启动外部晶振
    LCD12864_Init();        // LCD初始化
    // 打开温度传感器
    TR0 = 0x01;
    ATEST = 0x01;

    while(1)
    {
        temp = (ADC_Read(TEMP_ADC_CHANNEL) - 1340) /10.0;
        sprintf(LCDBuf, "   temp : %0.1f", temp); //
        LCD12864_DisStr(3, LCDBuf);
        SoftWaitUs(100000);
    }
    return 0;
}

采集的温度显示在LCD上,可以看到温度在跳动,这是由于AD的误差太大导致的,这里只做一个简单的实验,如果需要工程应用,建议外接温度传感器。把手放在芯片上可以看到温度在上升。温度采集结果如下图所示:



本文章转载自
http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/69222.aspx
请勿用于商业

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值