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通道读取数据的例子:

  1. adc_Init(ADC_CLK_4M, B6, SINGLEEND, RV_AVDD, RES14, S_6);
  2. while(1<2){
  3. u16 ret = adc_SampleValueGet();
  4. }

3、计算实际数值

在/sdk/vendor/826x_driver_test/app_adc.c写了一个电池电量读取的DEMO,里面初始化和数据读取和我们第二节介绍的大同小异,其中有个读取的ret值转换为实际电压值的小程序片段:

  1. switch(ref_vol){
  2. case RV_1P428:
  3. #if (BATT_CHECK_ENABLE)
  4. app_adc_test_Vol = 3*(1428*(average_data-128)/(16383-256)); //2^14 - 1 = 16383;
  5. #else
  6. app_adc_test_Vol = 1428*(average_data-128)/(16383-256); //2^14 - 1 = 16383;
  7. #endif
  8. break;
  9. case RV_AVDD:
  10. #if (BATT_CHECK_ENABLE)
  11. app_adc_test_Vol = 3*(3300*(average_data-128)/(16383-256)); //2^14 - 1 = 16383;
  12. #else
  13. app_adc_test_Vol = 3300*(average_data-128)/(16383-256); //2^14 - 1 = 16383;
  14. #endif
  15. break;
  16. case RV_1P224:
  17. #if (BATT_CHECK_ENABLE)
  18. app_adc_test_Vol = 3*(1224*(average_data-128)/(16383-256)); //2^14 - 1 = 16383;
  19. #else
  20. app_adc_test_Vol = 1224*(average_data-128)/(16383-256); //2^14 - 1 = 16383;
  21. #endif
  22. break;
  23. }

其中由于分辨率为RES14=14bits=2^14-1


4、设计读取两个channels的值

从第二节我们知道初始化后直接可以loop读取ADC值,那如果我想要同时读取两个channels的ADC该怎么办呢?

通过观察sdk/proj/mcu_spec/adc_8267.c中的adc_Init发现,有一个static inline函数可以切换channel:

  1. /********************************************************
  2. *
  3. * @brief set ADC analog input channel
  4. *
  5. * @param adcCha - enum variable adc channel.
  6. * adcInCha - enum variable of adc input channel.
  7. *
  8. * @return None
  9. */
  10. static inline void adc_AnaChSet(enum ADCINPUTCH adcInCha){
  11. unsigned char cnI;
  12. cnI = (unsigned char)adcInCha;
  13. BM_CLR(reg_adc_chn_m_sel,FLD_ADC_CHN_SEL);
  14. reg_adc_chn_m_sel |= MASK_VAL(FLD_ADC_CHN_SEL,cnI);
  15. }

那么能否想要读取B6 channel时候切换到B6读取,想要读取B4的时候切换到B4?所以先写个代码试试:

  1. void my_adc_init(void){
  2. adc_Init(ADC_CLK_4M, B6, SINGLEEND, RV_AVDD, RES14, S_6);
  3. }
  4. void adc_AnaChSet(enum ADCINPUTCH adcInCha){
  5. unsigned char cnI;
  6. cnI = (unsigned char)adcInCha;
  7. BM_CLR(reg_adc_chn_m_sel,FLD_ADC_CHN_SEL);
  8. reg_adc_chn_m_sel |= MASK_VAL(FLD_ADC_CHN_SEL,cnI);
  9. }
  10. void my_adc_run(void){
  11. u16 ret;
  12. u8 res;
  13. static u16 cnt = 0;
  14. if(cnt == 0 || cnt == 4000){
  15. adc_AnaChSet(B6);
  16. cnt = 0;
  17. }else if(cnt == 2000){
  18. adc_AnaChSet(B4);
  19. }
  20. cnt ++;
  21. ret = adc_SampleValueGet();
  22. res = 3300*(ret-128)/(16383-256)/100;//100mV
  23. my_uart_send_data(&res,1);
  24. }

起初,我直接俄高频切换、读取、再切换、再读取,会出现意想不到的结果,推测可能是切换和读取太快,频率快于AUTO模式的数据采集了,因此用一个cnt分段切换通道读取,发现效果很好。


5、重要常用输入资源表

有了下面的枚举类型,很容易看出8267的ADC输入资源情况,方便选择正确的IO口:

  1. //ADC analog input channel selection enum
  2. enum ADCINPUTCH{
  3. NOINPUT,
  4. C0,//GPIO_PC0
  5. C1,
  6. C6,
  7. C7,
  8. B0,
  9. B1,
  10. B2,
  11. B3,
  12. B4,
  13. B5,
  14. B6,
  15. B7,
  16. PGAVOM,
  17. PGAVOP,
  18. TEMSENSORN,
  19. TEMSENSORP,
  20. AVSS,
  21. OTVDD,//1/3 voltage division detection
  22. };

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

LINKS

[1]. telink官网

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


  1. @beautifulzzzz
  2. 以蓝牙技术为基础的的末梢无线网络系统架构及创新型应用探索!
  3. 领域:智能硬件、物联网、自动化、前沿软硬件
  4. 博客:https://www.cnblogs.com/zjutlitao/
  5. 微信交流群|微信:园友交流群|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. 洛谷 P4206 [NOI2005]聪聪与可可 题解

    题面 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每 ...

  2. 对git使用的初步总结

    使用git也才一周多,就已经深深爱上这款软件了. 之前公司一直用的是clearcase,一款老到除了公司内部的人和曾经开发这款软件的人,估计再也不会有人知道了吧! (当然也许还会有其他公司也会使用,因 ...

  3. tomcat,nginx日志定时清理

    1. Crontab定时任务 Crontab 基本语法 t1 t2 t3 t4 t5 program 其中 t1 是表示分钟,t2 表示小时,t3 表示一个月份中的第几日,t4 表示月份,t5 表示一 ...

  4. Linux开机启动过程(个人理解)

    简述Linux启动过程 1)BIOS开机自检 2)MBR引导 3)启动引导程序菜单(GRUB) 4)加载内核 5)加载虚拟文件系统加载函数模块 6)启动系统进程 /sbin/init --->/ ...

  5. FreeSql (六)批量插入数据

    var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initia ...

  6. 本地代码上传github失败常见错误

    1.上传失败 解决办法如下: 可以通过如下命令进行github与本地代码合并: git pull --rebase origin master 重新执行上传命令: git push -u origin ...

  7. Python中使用pip安装库时提示:远程主机强迫关闭了一个现有的连接

    场景 在cmd中使用pip install moviepy时,需要安装一些依赖库,很长时间后提示: 远程主机中断了一个现有的连接. 原因是默认镜像源下载过慢,将其修改为国内或者设置安装时的源. 这里以 ...

  8. spring data jpa介绍

    首先了解JPA是什么? JPA(JavaPersistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.他的出现主 ...

  9. 大数据平台搭建 - cdh5.11.1 - hue安装及集成其他组件

    一.简介 hue是一个开源的apache hadoop ui系统,由cloudear desktop演化而来,最后cloudera公司将其贡献给了apache基金会的hadoop社区,它基于pytho ...

  10. 6.Sentinel源码分析—Sentinel是如何动态加载配置限流的?

    Sentinel源码解析系列: 1.Sentinel源码分析-FlowRuleManager加载规则做了什么? 2. Sentinel源码分析-Sentinel是如何进行流量统计的? 3. Senti ...