CC2541之电池电量服务
来源:互联网 发布:图片修剪软件 编辑:程序博客网 时间:2024/05/16 09:38
一、简介
本篇以SimpleBLEPeripheral工程为例,介绍如何添加一个电池电量服务。
二、实验平台
协议栈版本:BLE-CC254x-1.4.0
编译软件: IAR 8.20.2
硬件平台: Smart RF开发板
手机平台: 红米1S
安卓系统: Android 4.3
APP: BLE Device Monitor
三、版权声明
博主:甜甜的大香瓜
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.net/feilusia
联系方式:897503845@qq.com
技术交流QQ群:127442605
四、CC2541的电池电量服务简介
1、电池电量服务是什么?
答:它是电池电量专用的服务,手机能通过这个服务获取到CC2541的电池电量。
2、为什么需要电池电量服务?
答:CC2541一般通过USB直接供电或纽扣电池供电。其中通过纽扣电池供电的方式,纽扣电池的电量使用情况是用户必须知道的数据。
否则手机与CC2541通信不成功,到底是CC2541死机了还是没电了,就说不清楚了。
3、通过什么方式获取电池电量?
答:
方法一、通过内部的10bit的adc通道采集电池电量(最高位是符号位,所以实际是9bit精度)。
方法二、通过最高12bit的adc通道采集电池电量(最高位是符号位,所以实际是11bit精度)。
4、采集电池电量是如何计算的?
答:
把CC2541的纽扣电池电压从2.0v~3.0v,当做电量的0%~100%。(香瓜猜测这么做是因为2~3V正好是CC2541的正常工作电压)
而CC2541的内部带符号的10bit的adc通道,量程范围为0~511,使用的参考电压为1.25v。
由于adc只有1.25v的参考电压,不能采集到2~3v的电压,因此我们把电池电压经过分压后采集,也就是采集1/3的电池电压,adc把2v/3~3v/3当做电压的0%~100%。
因此,由以上信息获得一个公式:(v/3)/ 1.25 = adc/511
其中,v是电池的实际纽扣电池的电压,adc是2541采集到的数值。
当v= 2时,adc=273。也就是CC2541采集到的adc值为273时,电压值为2v,是0%的电量。
当v= 3时,adc=409。也就是CC2541采集到的adc值为409时,电压值为3v,是100%的电量。
假设2v~3v时的变化是线性的,则可得到下图:
其中上图的Xadc和percentage是当前读到的adc值和当前电量的百分比。
利用两个相似三角形的特性,可以得到公式:
Percentage / (X – 273) = 100 / 136
变换后为:
Percentage = (X - 273) * 25 / 34
由上式四舍五入提高计算精度则有:
Percentage = [(X - 273) * 25 + 33] / 34
五、代码修改
1、保证项目中有hal_adc.c和hal_adc.h
2、在工程的PROFILES分类中添加battservice.c与battservice.h两个文件
两文件路径:C:\Texas Instruments\BLE-CC254x-1.4.0\Projects\ble\Profiles\Batt
3、IAR设置中添加俩路径
4、开启ADC的宏
5、添加电池服务的头文件(simpleBLEPeripheral.c中)
- #include "battservice.h"
6、定义一个电池默认临界值的宏(simpleBLEPeripheral.c中)
- #define DEFAULT_BATT_CRITICAL_LEVEL 6
定义为6,也就是电量低于6%时CC2541会主动notify通知主机电量过低。
7、添加初始化电池电量的代码(simpleBLEPeripheral.c的SimpleBLEPeripheral_Init()函数中)
- void SimpleBLEPeripheral_Init( uint8 task_id )
- {
- simpleBLEPeripheral_TaskID = task_id;
- //电池服务
- {
- uint8 critical = DEFAULT_BATT_CRITICAL_LEVEL;
- Batt_SetParameter( BATT_PARAM_CRITICAL_LEVEL, sizeof (uint8 ), &critical );/* 设置默认临界电量 */
- }
- Batt_AddService(); /* 添加电池服务 */
- Batt_Register(BattCB); /* 注册电池服务的应用回调函数 */
- ……
- }
8、定义电池电量服务的回调函数(simpleBLEPeripheral.c中)
- //******************************************************************************
- //name: BattCB
- //introduce: 电池电量服务的回调函数
- //parameter: event:事件
- //return: none
- //author: 甜甜的大香瓜
- //changetime: 2015.12.13
- //******************************************************************************
- static void BattCB(uint8 event)
- {
- if (event == BATT_LEVEL_NOTI_ENABLED)
- {
- if (gapProfileState == GAPROLE_CONNECTED)
- {
- }
- }
- else if (event == BATT_LEVEL_NOTI_DISABLED)
- {
- }
- }
回调函数的作用只是在开、关通知时告知应用层。
回调函数是在下面的情况被调用的:
- static void BattCB(uint8 event);
10、添加一段周期监测电量的代码(simpleBLEPeripheral.c中)
- static void performPeriodicTask( void )
- {
- if ( gapProfileState == GAPROLE_CONNECTED )
- {
- // perform battery level check
- Batt_MeasLevel( );
- }
- }
当电量小于我们设置的DEFAULT_BATT_CRITICAL_LEVEL(本篇设置为6)时,会在Batt_MeasLevel( )函数里主动notify告知主机。
六、实验结果
1、仿真查看adc采集到的电量
单步执行查看内部adc采集到的电源值为459
将adc=459,代入公式“(v/3)/ 1.25 = adc/511”中,得到v=3.36839530332681
2、万用表测试开发板的电源电压
实测VCC=3.20V
3、用手机app查看电源电量百分比
由于暂时使用USB供电,所以实测电压在3.20V,大于3V的都算100%电量。
因此读出了默认值0x64,也就是电量100%。
七、相关问题
1、实测外部电压2V时,对应为10%的电量,偏差太大怎么办?
答:
1)实测2V、3V时的ADC值(假设测出2V对应为287、3V对应为425)。
2)修改宏定义(Battservice.c中)
- // ADC voltage levels
- #define BATT_ADC_LEVEL_3V 425//409
- #define BATT_ADC_LEVEL_2V 287//273
- CC2541之电池电量服务
- CC2541之电池电量服务
- 【BLE】CC2541之电池电量服务
- 【BLE】CC2541之删除服务
- 【BLE】CC2541之发现服务与特征值
- 【BLE】CC2541之添加自定义服务
- CC2541读取电池电量并且广播出去
- CC2541 寻找ANCS服务
- 基于cc2540的电池电量服务。
- 手机服务 取得电池电量信息
- BatteryStatsService电池电量统计服务分析
- android之取得电池电量
- 【CC2541】CC2541之HAL层KEY分析
- 【BLE】CC2541之notify
- 【BLE】CC2541之按键
- 【BLE】CC2541之RSSI
- 【BLE】CC2541之OLED
- 【BLE】CC2541之indicate
- java中String和StringBuffer的异同点
- oracle错误一览表
- Jenkins服务平台搭建--概述
- JavaScript中浏览器兼容问题
- vb.net 实现无标题栏窗体拖拽功能
- CC2541之电池电量服务
- spring+springMVC+ibatis集成示例
- android+eclipse+jni遇到的一些问题
- Mysql Linux Command line Import .sql File
- mysql 使用force index优化查询
- Java中的String字符串倒序输出
- 下雨了,你会撑开伞吗?
- windows server 2008 新建用户
- Android 图片传输到服务器与取回