CC2530 AD轉換那點事

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的,貌似是,真讓人寒心!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章