【BLE】CC2541之电池电量服务

本篇博文最后修改时间:2017年01月06日,11:06。


一、简介

本文以SimpleBLEPeripheral工程为例,介绍如何添加一个电池电量服务。


二、实验平台

协议栈版本:BLE-CC254x-1.4.0

编译软件: IAR 8.20.2

硬件平台: Smart RF开发板(主芯片CC2541)

手机平台: 红米1S

安卓系统: Android 4.3

APP: BLE Device Monitor


版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.NET/feilusia

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

四、 实验前提
1、在进行本文步骤前,请先 阅读 以下博文:
暂无

2、在进行本文步骤前,请先 实现以下博文:
暂无


五、基础知识

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


5、实测外部电压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

五、实验步骤

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)
  {
   
  }
}

回调函数的作用只是在开、关通知时告知应用层。

回调函数是在下面的情况被调用的:



9、声明电池电量服务的回调函数(simpleBLEPeripheral.c中)

static void BattCB(uint8 event);


10、添加一段周期监测电量的代码(simpleBLEPeripheral.c中)

static void performPeriodicTask( void )
{
  if ( gapProfileState == GAPROLE_CONNECTED )
  {
    // perform battery level check
    Batt_MeasLevel( );
  }
}
协议栈默认的周期事件是5S。也就是连接状态下,每5S会执行上面的代码去更新电量。

当电量小于我们设置的DEFAULT_BATT_CRITICAL_LEVEL(本篇设置为6)时,会在Batt_MeasLevel( )函数里主动notify告知主机。


七、注意事项

手机可能缓存了之前的代码(在更新过CC2541的代码之后,都需要清除手机端的缓存!!!),因此要清除缓存,清除缓存的方法如下:

方法一:关闭app、关闭蓝牙总开关、打开蓝牙总开关、打开app。
方法二:手机重启。


八、实验结果

1、仿真查看adc采集到的电量(用app连接时才会进行采集

单步执行查看内部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%。

因此,实验成功。


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值