CC2530有8個ADC通道,系統框圖如下:
使用ADC有兩種情況:
第一種是連續轉換,此時需要配置ADCCON1和ADCCON2寄存器;
第二種是單次轉換,此時只需要配置寄存器ADCCON3即可。
請初學者搞清楚哈,單次轉換只需要配置寄存器ADCCON3就可以。
我今天實驗的情況:
使用ADC測量單節乾電池的電壓。
選擇的參考電壓基準爲:AVDD=3.3V,模擬通道選擇通道0.
則初始化函數爲:
static uint16 readV(uint8 channal,uint8 resolution)
{
uint16 value ;
APCFG |= 1 << channal ; //注意這裏是設置ADC輸入通道!!
ADCIF = 0 ;
ADCCON3 = (HAL_ADC_REF_AVDD | resolution | channal) ;
while ( !ADCIF ) ;
value = ADCL ;
value |= ((uint16) ADCH) << 8 ;//這裏注意一下
if(channal == HAL_ADC_DEC_064)//7位分辨率
value >>= 9 ;
else if(channal == HAL_ADC_DEC_128) //9位分辨率
value >>= 7 ;
else if(channal == HAL_ADC_DEC_256) //10位分辨率
value >>= 6 ;
else if(channal == HAL_ADC_DEC_512) //12位分辨率
value >>= 4;
return value;
}
使用如下方式調用該函數:
1 temp = readV(HAL_ADC_CHN_AIN0,HAL_ADC_DEC_256) ;//10位分辨率
2 _ltoa(temp,vdataformat.Test,16) ;
3 temp = (temp + (temp << 5) ) >> 6 ;
4 Data[0] = (uint8)temp/10 + '0' ;
5 Data[1] = '.' ;
6 Data[2] = (uint8)temp%10 + '0' ;
第1行,選擇模擬通道0,10位分辨率;
第2行,將讀取到的AD轉換值以十六進制的形式顯示出來。
第3行,這是將讀取到的值轉換爲實際的電壓值。爲了顯示方便,將其擴大了10倍。
實際電壓值= AD轉換值* 33 /1024
注意這裏是10位分辨率,同時將讀取的電壓值擴大了10倍數。
但是,經過一天半的測試我發現上述公式不行!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
後來發現AD轉換值最大是0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />,也就是說是6位,所以,果斷修改上述公式,如下:
實際電壓值= AD轉換值* 33 /64
當然,沒有人會傻到讓個小51單片機去計算乘法和除法;
一般處理技巧是:將乘法轉換爲左移運算,除法轉換爲右移運算;
所以:推導過程如下:
實際電壓值= AD轉換值* 33 /64 =(AD轉換值*32 + AD轉換值)/ 64
= ((AD轉換值<< 5 ) + AD轉換值)>> 6
呵呵,我敢說,有部分初學者肯定沒用過上述方法,算上給大家個小技巧吧。
第4—6行,將數據顯示出來,輸出到串口上。
然後,我使用穩壓電源,型號:TPR3003,輸出0---3.3V,然後輸如到AD通道0,測試結果如下:
當然,需要說明的是,我買CC2530是散新的,所以,我懷疑片子確實存在問題!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
此外,對於TI這款芯片,感覺數據手冊寫的太爛了,一個內部參考電壓,整個數據手冊都沒說過是多少,最後從網上看到貌似是1.25V,而CC2420內部的參考電壓是1.15V,貌似是,現在不確定!!!
還有就是協議棧裏的ADC驅動是完全照搬的CC2430吧,不相信的朋友可以查看一下,CC2530的ADC分辨率是7位、9位、10位和12位,但是協議棧裏面的驅動如下:
switch (resolution)
{
case HAL_ADC_RESOLUTION_8:
reading >>= 8;
break;
case HAL_ADC_RESOLUTION_10:
reading >>= 6;
break;
case HAL_ADC_RESOLUTION_12:
reading >>= 4;
break;
case HAL_ADC_RESOLUTION_14:
default:
reading >>= 2;
break;
}
這絕對是噁心人,上述分辨率是CC2430的,貌似是,真讓人寒心!!!