天天看點

第八節 CC254x内部溫度傳感器溫度采集

第八節  CC254x内部溫度傳感器溫度采集

    CC254x内部有一個溫度傳感器,我們這節使用這個傳感器來采集晶片的溫度,此傳感器精度不高。不适合用于實際的工程中,這裡隻為示範AD采樣。要使用内部的溫度采集我們需要使用AD采樣,是以我們需要先來了解CC254x的AD功能。在後續課程有對ADC的詳細說明。

    ADC結構圖如下所示:

第八節 CC254x内部溫度傳感器溫度采集

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

第八節 CC254x内部溫度傳感器溫度采集

我們使用手動觸發的方式進行AD采樣,是以STSEL = 11B,最低兩位始終為1,最終ADCCON1=0x33。

    ADC控制寄存器3如圖所示:

第八節 CC254x内部溫度傳感器溫度采集

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的誤差太大導緻的,這裡隻做一個簡單的實驗,如果需要工程應用,建議外接溫度傳感器。把手放在晶片上可以看到溫度在上升。溫度采集結果如下圖所示:

第八節 CC254x内部溫度傳感器溫度采集

本文章轉載自

http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/69222.aspx

請勿用于商業