[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
};
- : 蓝牙芯片:国产芯片的技术博客比外国芯片少一些,经常查不到~
- 大家觉得不错,可以点推荐给更多人~
LINKS
[1]. telink官网
[2]. 搭建tlsr8266编译框架在win服务器中
@beautifulzzzz
以蓝牙技术为基础的的末梢无线网络系统架构及创新型应用探索!
领域:智能硬件、物联网、自动化、前沿软硬件
博客:https://www.cnblogs.com/zjutlitao/
微信交流群|微信:园友交流群|btfzzzz
[TLSR8267] 泰凌微 telink tlsr8267 ble ADC 用法浅谈的更多相关文章
- 微服务浅谈&服务治理的演变过程
这两天对互联网的架构演变进行了简单了解,并对微服务的出现很感兴趣,所以对相关知识进行了简单的整理与总结. 本篇文章先简单介绍了互联网架构的演变,进而介绍了服务化,最后介绍了微服务及最新的服务网格(Se ...
- [nRF51822] 14、浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(科普类干货)
蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到耳机.游戏手柄.音响.电视, 再到手环.电子秤.智能医疗器械(血糖仪.数字血压计.血气计.数字脉搏/心率监视器.数字体 ...
- 浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(转载)
转载来至beautifulzzzz,网址http://www.cnblogs.com/zjutlitao/,推荐学习 蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到 ...
- 浅谈微服务架构与服务治理的Eureka和Dubbo
前言 本来计划周五+周末三天自驾游,谁知人算不如天算,周六恰逢台风来袭,湖州附近的景点全部关停,不得已只能周五玩完之后,于周六踩着台风的边缘逃回上海.周末过得如此艰难,这次就聊点务虚的话题,一是浅谈微 ...
- 浅谈服务治理、微服务与Service Mesh(三) Service Mesh与Serverless
作为本系列文章的第三篇(前两篇<浅谈服务治理.微服务与Service Mesh(一)Dubbo的前世今生>,<浅谈服务治理.微服务与Service Mesh(二) Spring Cl ...
- 浅谈IT技术女转战微电商初体验
今天闲来无事,突然想翻看下之前写的技术博客,很是意外,居然那么多阅读量,于是想想做微商也有一段时间了,决定写写初入微商的初体验. 先自我介绍一下,本人是一名理工女,做IT行业的,这个行业也许有人了解, ...
- 浅谈现公司的Spring Cloud微服务框架
目录 说在前面 服务注册与发现 服务网关及熔断 配置中心 消息中心.服务链路追踪 小言 说在前面 本文偏小白,大佬慎入,若有错误或者质疑,欢迎留言提问,谢谢,祝大家新年快乐. spring cloud ...
- 浅谈微服务架构、容器技术与K8S
关注嘉为科技,获取运维新知 企业应用系统:从单体应用走向微服务架构:从裸金属走向容器. 如果在诸多热门云计算技术诸如容器.微服务.DevOps.OpenStack等之中,找出一个最火的方向,那么可能非 ...
- 浅谈SpringCloud (一) 什么是微服务和不使用SpringCloud怎么访问服务提供者
微服务和SpringCloud介绍 1.什么是微服务? 看过一遍介绍的很清楚的博客:https://blog.csdn.net/wuxiaobingandbob/article/details/786 ...
随机推荐
- 洛谷 P4206 [NOI2005]聪聪与可可 题解
题面 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每 ...
- 对git使用的初步总结
使用git也才一周多,就已经深深爱上这款软件了. 之前公司一直用的是clearcase,一款老到除了公司内部的人和曾经开发这款软件的人,估计再也不会有人知道了吧! (当然也许还会有其他公司也会使用,因 ...
- tomcat,nginx日志定时清理
1. Crontab定时任务 Crontab 基本语法 t1 t2 t3 t4 t5 program 其中 t1 是表示分钟,t2 表示小时,t3 表示一个月份中的第几日,t4 表示月份,t5 表示一 ...
- Linux开机启动过程(个人理解)
简述Linux启动过程 1)BIOS开机自检 2)MBR引导 3)启动引导程序菜单(GRUB) 4)加载内核 5)加载虚拟文件系统加载函数模块 6)启动系统进程 /sbin/init --->/ ...
- FreeSql (六)批量插入数据
var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initia ...
- 本地代码上传github失败常见错误
1.上传失败 解决办法如下: 可以通过如下命令进行github与本地代码合并: git pull --rebase origin master 重新执行上传命令: git push -u origin ...
- Python中使用pip安装库时提示:远程主机强迫关闭了一个现有的连接
场景 在cmd中使用pip install moviepy时,需要安装一些依赖库,很长时间后提示: 远程主机中断了一个现有的连接. 原因是默认镜像源下载过慢,将其修改为国内或者设置安装时的源. 这里以 ...
- spring data jpa介绍
首先了解JPA是什么? JPA(JavaPersistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.他的出现主 ...
- 大数据平台搭建 - cdh5.11.1 - hue安装及集成其他组件
一.简介 hue是一个开源的apache hadoop ui系统,由cloudear desktop演化而来,最后cloudera公司将其贡献给了apache基金会的hadoop社区,它基于pytho ...
- 6.Sentinel源码分析—Sentinel是如何动态加载配置限流的?
Sentinel源码解析系列: 1.Sentinel源码分析-FlowRuleManager加载规则做了什么? 2. Sentinel源码分析-Sentinel是如何进行流量统计的? 3. Senti ...