在《DS_TLSR8267-E21_Datasheet for Telink BLE SoC TLSR8267.pdf》第11章詳細介紹了ADC相關屬性及參數。html
條目 | 說明 |
---|---|
ADC clock | 參考電壓選擇AVDD時候不能低於5Mhz;參考電壓選擇1.224V或者1.428V的時候不能低於4MHz |
input range | 1.428V,AVDD or 1.224V |
resolution | 7, 9, 10, 11, 12, 13, 14bits |
sampling time | 3, 6, 9, 12, 18, 24, 48 or 144 * ADC clock period |
input mode | ADC supports two input modes and 12 input channels |
Enable auto mode and output | 自動模式 |
在sdk/proj/mcu_spec/adc_8267.c中實現了8267 adc的封裝,對外函數比較簡單:小程序
用起來比較簡單,初始化,而後讀取!對於初始化中的枚舉參數,能夠看看定義處,就明白了。下面舉個簡單的B6通道讀取數據的例子:服務器
adc_Init(ADC_CLK_4M, B6, SINGLEEND, RV_AVDD, RES14, S_6); while(1<2){ u16 ret = adc_SampleValueGet(); }
在/sdk/vendor/826x_driver_test/app_adc.c寫了一個電池電量讀取的DEMO,裏面初始化和數據讀取和咱們第二節介紹的大同小異,其中有個讀取的ret值轉換爲實際電壓值的小程序片斷:微信
switch(ref_vol){ case RV_1P428: #if (BATT_CHECK_ENABLE) app_adc_test_Vol = 3*(1428*(average_data-128)/(16383-256)); //2^14 - 1 = 16383; #else app_adc_test_Vol = 1428*(average_data-128)/(16383-256); //2^14 - 1 = 16383; #endif break; case RV_AVDD: #if (BATT_CHECK_ENABLE) app_adc_test_Vol = 3*(3300*(average_data-128)/(16383-256)); //2^14 - 1 = 16383; #else app_adc_test_Vol = 3300*(average_data-128)/(16383-256); //2^14 - 1 = 16383; #endif break; case RV_1P224: #if (BATT_CHECK_ENABLE) app_adc_test_Vol = 3*(1224*(average_data-128)/(16383-256)); //2^14 - 1 = 16383; #else app_adc_test_Vol = 1224*(average_data-128)/(16383-256); //2^14 - 1 = 16383; #endif break; }
其中因爲分辨率爲RES14=14bits=2^14-1網絡
從第二節咱們知道初始化後直接能夠loop讀取ADC值,那若是我想要同時讀取兩個channels的ADC該怎麼辦呢?架構
經過觀察sdk/proj/mcu_spec/adc_8267.c中的adc_Init發現,有一個static inline函數能夠切換channel:app
/******************************************************** * * @brief set ADC analog input channel * * @param adcCha - enum variable adc channel. * adcInCha - enum variable of adc input channel. * * @return None */ static inline void adc_AnaChSet(enum ADCINPUTCH adcInCha){ unsigned char cnI; cnI = (unsigned char)adcInCha; BM_CLR(reg_adc_chn_m_sel,FLD_ADC_CHN_SEL); reg_adc_chn_m_sel |= MASK_VAL(FLD_ADC_CHN_SEL,cnI); }
那麼可否想要讀取B6 channel時候切換到B6讀取,想要讀取B4的時候切換到B4?因此先寫個代碼試試:框架
void my_adc_init(void){ adc_Init(ADC_CLK_4M, B6, SINGLEEND, RV_AVDD, RES14, S_6); } void adc_AnaChSet(enum ADCINPUTCH adcInCha){ unsigned char cnI; cnI = (unsigned char)adcInCha; BM_CLR(reg_adc_chn_m_sel,FLD_ADC_CHN_SEL); reg_adc_chn_m_sel |= MASK_VAL(FLD_ADC_CHN_SEL,cnI); } void my_adc_run(void){ u16 ret; u8 res; static u16 cnt = 0; if(cnt == 0 || cnt == 4000){ adc_AnaChSet(B6); cnt = 0; }else if(cnt == 2000){ adc_AnaChSet(B4); } cnt ++; ret = adc_SampleValueGet(); res = 3300*(ret-128)/(16383-256)/100;//100mV my_uart_send_data(&res,1); }
起初,我直接俄高頻切換、讀取、再切換、再讀取,會出現意想不到的結果,推測多是切換和讀取太快,頻率快於AUTO模式的數據採集了,所以用一個cnt分段切換通道讀取,發現效果很好。函數
有了下面的枚舉類型,很容易看出8267的ADC輸入資源狀況,方便選擇正確的IO口:oop
//ADC analog input channel selection enum enum ADCINPUTCH{ NOINPUT, C0,//GPIO_PC0 C1, C6, C7, B0, B1, B2, B3, B4, B5, B6, B7, PGAVOM, PGAVOP, TEMSENSORN, TEMSENSORP, AVSS, OTVDD,//1/3 voltage division detection };
: 藍牙芯片:國產芯片的技術博客比外國芯片少一些,常常查不到~
: 你們以爲不錯,能夠點推薦給更多人~
[1]. telink官網
[2]. 搭建tlsr8266編譯框架在win服務器中
@beautifulzzzz 以藍牙技術爲基礎的的末梢無線網絡系統架構及創新型應用探索! 領域:智能硬件、物聯網、自動化、前沿軟硬件 博客:https://www.cnblogs.com/zjutlitao/ 微信交流羣|微信:園友交流羣|btfzzzz