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. CodeForces 821D Okabe and City

    Okabe and City 题解: 将行和列也视为一个点. 然后从普通的点走到行/列的点的话,就代表这行/列已经被点亮了. 然后将费用为0的点建上边. 注意讨论(n,m)非亮的情况下. 代码: #i ...

  2. CF1025B Weakened Common Divisor 数学

    Weakened Common Divisor time limit per test 1.5 seconds memory limit per test 256 megabytes input st ...

  3. CodeForces 758 D Ability To Convert

    Ability To Convert 题意:给你一个n进制的60位的数,但是由于Alexander只会写0->9,所以他就会用10来表示十而不是A(假设进制>10); 题解:模拟就好了,先 ...

  4. poj 3259 Wormholes(bellman-ford判断负环)

    题目链接:http://poj.org/problem?id=3259 题目就是问你能否回到原点而且时间还倒回去了.题目中有些路中有单向的虫洞能让时间回到过去 所以只要将虫洞这条边的权值赋为负然后再判 ...

  5. Docker下使用disconf:极速体验

    Docker下的disconf实战全文链接 <Docker搭建disconf环境,三部曲之一:极速搭建disconf>: <Docker搭建disconf环境,三部曲之二:本地快速构 ...

  6. js获取一个月的天数

    在使用其他语言获取每月天数的时候,一般都是存储到一个数组中进行获取,但是如果是二月份的话就需要首先判断是否闰年,再确定是28还是29了. js可以通过Date对象很方便的获取到每月的天数,在初始化Da ...

  7. EditPlus5.0破解激活

    永久激活用户名激活码: 用户名:Vovan注册码:3AG46-JJ48E-CEACC-8E6EW-ECUAW 然后重启软件即可

  8. FreeSql (二十二)Dto 映射查询

    适合喜欢使用 dto 的朋友,很多时候 entity 与 dto 属性名相同,属性数据又不完全一致. 有的人先查回所有字段数据,再使用 AutoMapper 映射. 我们的功能是先映射,再只查询映射好 ...

  9. 你以为反射真的无所不能?至少JDK8以后很强大

    目录 反射操作方法 Spring的方法的优点 反射如何实现Spring的方法 Java字节码 高级反射注意点 javac的彩蛋 续点 每日一笑 上期答案 # 加入战队 微信公众号 之前我们已经介绍了J ...

  10. apache ignite系列(三):数据处理(数据加载,数据并置,数据查询)

    ​ 使用ignite的一个常见思路就是将现有的关系型数据库中的数据导入到ignite中,然后直接使用ignite中的数据,相当于将ignite作为一个缓存服务,当然ignite的功能远不止于此,下面以 ...