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
};

: 蓝牙芯片:国产芯片的技术博客比外国芯片少一些,经常查不到~
大家觉得不错,可以点推荐给更多人~

LINKS

[1]. telink官网

[2]. 搭建tlsr8266编译框架在win服务器中


@beautifulzzzz
以蓝牙技术为基础的的末梢无线网络系统架构及创新型应用探索!
领域:智能硬件、物联网、自动化、前沿软硬件
博客:https://www.cnblogs.com/zjutlitao/
微信交流群|微信:园友交流群|btfzzzz

[TLSR8267] 泰凌微 telink tlsr8267 ble ADC 用法浅谈的更多相关文章

  1. 微服务浅谈&服务治理的演变过程

    这两天对互联网的架构演变进行了简单了解,并对微服务的出现很感兴趣,所以对相关知识进行了简单的整理与总结. 本篇文章先简单介绍了互联网架构的演变,进而介绍了服务化,最后介绍了微服务及最新的服务网格(Se ...

  2. [nRF51822] 14、浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(科普类干货)

    蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到耳机.游戏手柄.音响.电视, 再到手环.电子秤.智能医疗器械(血糖仪.数字血压计.血气计.数字脉搏/心率监视器.数字体 ...

  3. 浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(转载)

    转载来至beautifulzzzz,网址http://www.cnblogs.com/zjutlitao/,推荐学习 蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到 ...

  4. 浅谈微服务架构与服务治理的Eureka和Dubbo

    前言 本来计划周五+周末三天自驾游,谁知人算不如天算,周六恰逢台风来袭,湖州附近的景点全部关停,不得已只能周五玩完之后,于周六踩着台风的边缘逃回上海.周末过得如此艰难,这次就聊点务虚的话题,一是浅谈微 ...

  5. 浅谈服务治理、微服务与Service Mesh(三) Service Mesh与Serverless

    作为本系列文章的第三篇(前两篇<浅谈服务治理.微服务与Service Mesh(一)Dubbo的前世今生>,<浅谈服务治理.微服务与Service Mesh(二) Spring Cl ...

  6. 浅谈IT技术女转战微电商初体验

    今天闲来无事,突然想翻看下之前写的技术博客,很是意外,居然那么多阅读量,于是想想做微商也有一段时间了,决定写写初入微商的初体验. 先自我介绍一下,本人是一名理工女,做IT行业的,这个行业也许有人了解, ...

  7. 浅谈现公司的Spring Cloud微服务框架

    目录 说在前面 服务注册与发现 服务网关及熔断 配置中心 消息中心.服务链路追踪 小言 说在前面 本文偏小白,大佬慎入,若有错误或者质疑,欢迎留言提问,谢谢,祝大家新年快乐. spring cloud ...

  8. 浅谈微服务架构、容器技术与K8S

    关注嘉为科技,获取运维新知 企业应用系统:从单体应用走向微服务架构:从裸金属走向容器. 如果在诸多热门云计算技术诸如容器.微服务.DevOps.OpenStack等之中,找出一个最火的方向,那么可能非 ...

  9. 浅谈SpringCloud (一) 什么是微服务和不使用SpringCloud怎么访问服务提供者

    微服务和SpringCloud介绍 1.什么是微服务? 看过一遍介绍的很清楚的博客:https://blog.csdn.net/wuxiaobingandbob/article/details/786 ...

随机推荐

  1. POJ1833 排列 调用全排列函数 用copy函数节省时间 即使用了ios同步代码scanf还是比较快

    排列 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21268   Accepted: 8049 Description 题 ...

  2. c语言实现配置文件的读写

    配置文件的格式如下: key1 = value1 key2 = value2 . . . 名值对以一个=链接,一条记录以换行符分割 头文件: #include<stdio.h> #incl ...

  3. RedisTemplate.opsForValue 常用方法

    RedisTemplate.opsForValue 常用方法 1.set(K key, V value) 新增一个字符串类型的值,key是键,value是值. redisTemplate.opsFor ...

  4. android View的测量和绘制

    本篇内容来源于android 群英传(徐易生著) 我写到这里,是觉得徐易生讲的确实很好, 另外加入了一些自己的理解,便于自己基础的提高. 另外参考:http://www.gcssloop.com/cu ...

  5. Docker入门到实践——简单操作

    1.对比传统虚拟机总结 特性 容器 虚拟机 启动 秒级 分钟级 硬盘使用 一般为MB 一般为GB 性能 接近原生 弱于 系统支持量 单机支持上千个容器 一般几十个 2.基本概念 Docker包括三个基 ...

  6. Unity3D_10_文件夹目录架构

    一:几个特殊文件夹介绍 1.Editor Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以.比如目录:/xxx/xxx/Editor 和 /Editor 是一样的,无论 ...

  7. SqlServer 2014 还原数据库时提示:操作系统返回了错误5,,拒绝访问

    场景 在进行数据库还原时提示: System.Data.SqlError:在对”“尝试”“时,操作系统返回了错误5(拒绝访问) 实现 第一种方案是修改要还原的数据库备份文件的权限. 找到备份文件右击属 ...

  8. 通过js获取tinymce4.x的值

    问题的引出: 在使用过程中,用传统的js的方法判断tinymce所选textarea(下面直接称textarea)的值是会出现这样的问题的: 在已有输入内容时,首次提交的时候,依然会弹出js写的警告提 ...

  9. charles SSL代理设置

    本文参考:charles SSL代理设置 charles SSL代理设置 SSL Proxying Srtting 这里最常用的设置就是第一个ssl proxying,这里记录了需要捕获哪些ssl的信 ...

  10. prometheus-operator告警模块alertmanager注意事项(QQ邮箱发送告警)--大大坑

    在/stable/prometheus-operator/values.yaml配置告警邮件 config: global: resolve_timeout: 5m smtp_smarthost: ' ...