[TLSR8267] 泰凌微 telink tlsr8267 ble ADC 用法淺談



1、讀 datasheet

在《DS_TLSR8267-E21_Datasheet for Telink BLE SoC TLSR8267.pdf》第11章詳細介紹了ADC相關屬性及參數。

條目 說明
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 自動模式

2、看封裝好驅動

在sdk/proj/mcu_spec/adc_8267.c中實現了8267 adc的封裝,對外函數比較簡單:

  • (普通12個channels初始化) void adc_Init(enum ADCCLOCK adc_clk,enum ADCINPUTCH chn,enum ADCINPUTMODE mode,enum ADCRFV ref_vol, enum ADCRESOLUTION resolution,enum ADCST sample_cycle)
  • (電池檢測初始化)void adc_BatteryCheckInit(enum ADCCLOCK adc_clk,unsigned char div_en,enum ONETHIRD_INPUTCHN oneThirdChn,enum ADCINPUTCH notOneThirdChn, enum ADCINPUTMODE mode,enum ADCRFV ref_vol,enum ADCRESOLUTION resolution,enum ADCST sample_cycle)
  • (溫度檢測初始化)void adc_TemSensorInit(enum ADCCLOCK adc_clk,enum ADCINPUTCH chn,enum ADCINPUTMODE mode,enum ADCRFV ref_vol, enum ADCRESOLUTION resolution,enum ADCST sample_cycle)
  • (讀取ADC數據)unsigned short adc_SampleValueGet(void)
  • (讀取電池電量數據)unsigned short adc_BatteryValueGet(void)

用起來比較簡單,初始化,然后讀取!對於初始化中的枚舉參數,可以看看定義處,就明白了。下面舉個簡單的B6通道讀取數據的例子:

adc_Init(ADC_CLK_4M, B6, SINGLEEND, RV_AVDD, RES14, S_6);

while(1<2){
	u16 ret = adc_SampleValueGet();
}

3、計算實際數值

在/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


4、設計讀取兩個channels的值

從第二節我們知道初始化后直接可以loop讀取ADC值,那如果我想要同時讀取兩個channels的ADC該怎么辦呢?

通過觀察sdk/proj/mcu_spec/adc_8267.c中的adc_Init發現,有一個static inline函數可以切換channel:

/********************************************************
*
*	@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分段切換通道讀取,發現效果很好。


5、重要常用輸入資源表

有了下面的枚舉類型,很容易看出8267的ADC輸入資源情況,方便選擇正確的IO口:

//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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM