1. 程式人生 > >【BLE】CC2541之電池電量服務

【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

聯絡方式:[email protected]

香瓜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%。

因此,實驗成功。

相關推薦

BLECC2541電池電量服務

本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLEPeripheral工程為例,介紹如何新增一個電池電量服務。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體: IAR 8.20.2 硬體平臺: Smar

BLECC2541發現服務與特徵值

本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLECentral工程為例,解析CC2541作為主機時是如何發現從機的服務和特徵值的。二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2

BLECC2541主機端讀取特征值

roi repl void 定時 store val star content else if 本篇博文最後改動時間:2017年01月06日,11:06。

BLECC2541連線引數

轉載自: https://blog.csdn.net/feilusia/article/details/46909723 一、簡介 本文介紹CC2541的連線引數。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:S

BLECC2541通訊協議

本篇博文最後修改時間:2016年12月12日,10:51。 一、簡介 本文以SimpleBLEPeripheral工程為例,介紹如何在一個可讀、可寫、可通知、20位元組長的特徵值char6基礎上,新增一個香瓜自定義的通訊協議,並用app傳送指令實現P11口上的LE

BLECC2541新增特徵值

本篇博文最後修改時間:2017年03月21日,15:32。 一、簡介 本文以SimpleBLEPeripheral工程為例,介紹如何新增一個可讀、可寫、可通知、20位元組長的特徵值char6,並用app實現資料的收發。 二、實驗平臺 協議棧版本:BLE-CC254

BLECC254132.768kHZ外部晶振

本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文介紹外部的32.768K晶振對於CC2541的作用。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:Smart RF(主晶片CC2

BLECC2541解析協議棧的晶振初始化過程

本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLEPeripheral為例,解析協議棧的晶振初始化過程。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:Smart

BLECC2541indicate

本篇博文最後修改時間:2017年08月31日,17:00。 一、簡介 本文以SimpleBLEPeripheral為例,講述如何通過按五項按鍵的“center”鍵傳送indicate資料給btool,用PC的串列埠工具打印出“indicate”的“發資料”和“應答”的過程

BLECC2541回撥函式

本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLECentral工程中simpleBLECentralEventCB函式,來簡要說明回撥函式的定義和呼叫過程。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編

BLECC2541開啟廣播過程

本篇博文最後修改時間:2016年11月11日,09:31。 一、簡介 本文介紹在應用層如何開啟廣播,且解析協議棧在此操作後做了什麼。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:Amart RF開發板(主晶

BLECC2541主機端獲取notify資料

本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLECentral工程和SimpleBLEPeripheral工程為例,介紹CC2541作為主機時是如何獲取從機char4通道的notify資料。 二、實驗平臺 協議棧版

BLECC2541通過RSSI測距

本篇博文最後修改時間:2016年11月11日,09:21。 一、簡介 本文介紹如何在SimpleBLEPeripheral工程中,通過RSSI粗略測距。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:

APIWindows 獲取電池電量信息

api 註意 電池 time life per 信息 獲取 word typedef struct _SYSTEM_POWER_STATUS { BYTE ACLineStatus; BYTE BatteryFlag; BYTE BatteryLifePerc

BLE-CC2541低功耗測試實驗-晶片驗證篇

實驗介紹 通過檢視晶片手冊cc2541的電氣特性表,cc2541低功耗(LowPower)有三種狀態:PowerMode1(簡稱:PM1)、PowerMode2(簡稱:PM2)、PowerMode3(簡稱:PM3)。 描述: PM1:

BLECC2541實時更新廣播包advertData內容

advertData[]是廣播包資料。 實時更新廣播包的API: extern bStatus_t GAP_UpdateAdvertisingData( uint8 taskID, uint8 ad

BLECC2541獲取裝置的MAC地址實驗

安卓除錯工具掃描時直接顯示就是MAC地址。 蘋果裝置是以UUID的方式顯示。 所以我們直接用安卓裝置來測試。 我們連線時可以知道主機的地址。 變數是gapRole_ConnectedDevAddr,可以在peripherial.c裡搜尋GAP_LINK_

BLECC2541低功耗測試-系統執行篇

1.osal_pwrmgr_powerconserve 描述: osal_pwrmgr_powerconserve()函式低功耗具體的處理函式,可以發現要想支援此功能,必須首先包含POWER_SAVI

服務架構SpringCloudEureka(服務註冊和服務發現基礎篇)(二)

原文連結 上篇文章講解了SpringCloud元件和概念介紹,接下來講解一下SpringCloud元件相關元件使用、原理和每個元件的作用的,它主要提供的模組包括:服務發現(Eureka),斷路器(Hystrix),智慧路有(Zuul),客戶端負載均衡(Ribb

STM8SSTM8S電量採集

本篇博文最後修改時間:2016年08月30日,11:41。 一、簡介 本文介紹STM8S系列如何使用ADC的一個通道,對電量進行採集。 二、實驗平臺 編譯軟體:IAR for STM8 1.42.2 硬體平臺:stm8s003f3p6開發板 模擬器:ST