第八節 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
請勿用于商業