【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)
{
}
}
回撥函式的作用只是在開、關通知時告知應用層。
回撥函式是在下面的情況被呼叫的:
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%。
因此,實驗成功。
相關推薦
【BLE】CC2541之電池電量服務
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLEPeripheral工程為例,介紹如何新增一個電池電量服務。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體: IAR 8.20.2 硬體平臺: Smar
【BLE】CC2541之發現服務與特徵值
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLECentral工程為例,解析CC2541作為主機時是如何發現從機的服務和特徵值的。二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2
【BLE】CC2541之主機端讀取特征值
roi repl void 定時 store val star content else if 本篇博文最後改動時間:2017年01月06日,11:06。
【BLE】CC2541之連線引數
轉載自: https://blog.csdn.net/feilusia/article/details/46909723 一、簡介 本文介紹CC2541的連線引數。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:S
【BLE】CC2541之通訊協議
本篇博文最後修改時間:2016年12月12日,10:51。 一、簡介 本文以SimpleBLEPeripheral工程為例,介紹如何在一個可讀、可寫、可通知、20位元組長的特徵值char6基礎上,新增一個香瓜自定義的通訊協議,並用app傳送指令實現P11口上的LE
【BLE】CC2541之新增特徵值
本篇博文最後修改時間:2017年03月21日,15:32。 一、簡介 本文以SimpleBLEPeripheral工程為例,介紹如何新增一個可讀、可寫、可通知、20位元組長的特徵值char6,並用app實現資料的收發。 二、實驗平臺 協議棧版本:BLE-CC254
【BLE】CC2541之32.768kHZ外部晶振
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文介紹外部的32.768K晶振對於CC2541的作用。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:Smart RF(主晶片CC2
【BLE】CC2541之解析協議棧的晶振初始化過程
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLEPeripheral為例,解析協議棧的晶振初始化過程。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:Smart
【BLE】CC2541之indicate
本篇博文最後修改時間:2017年08月31日,17:00。 一、簡介 本文以SimpleBLEPeripheral為例,講述如何通過按五項按鍵的“center”鍵傳送indicate資料給btool,用PC的串列埠工具打印出“indicate”的“發資料”和“應答”的過程
【BLE】CC2541之回撥函式
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLECentral工程中simpleBLECentralEventCB函式,來簡要說明回撥函式的定義和呼叫過程。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編
【BLE】CC2541之開啟廣播過程
本篇博文最後修改時間:2016年11月11日,09:31。 一、簡介 本文介紹在應用層如何開啟廣播,且解析協議棧在此操作後做了什麼。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:Amart RF開發板(主晶
【BLE】CC2541之主機端獲取notify資料
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLECentral工程和SimpleBLEPeripheral工程為例,介紹CC2541作為主機時是如何獲取從機char4通道的notify資料。 二、實驗平臺 協議棧版
【BLE】CC2541之通過RSSI測距
本篇博文最後修改時間:2016年11月11日,09:21。 一、簡介 本文介紹如何在SimpleBLEPeripheral工程中,通過RSSI粗略測距。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:
【API】Windows 獲取電池電量信息
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:
【BLE】CC2541實時更新廣播包advertData內容
advertData[]是廣播包資料。 實時更新廣播包的API: extern bStatus_t GAP_UpdateAdvertisingData( uint8 taskID, uint8 ad
【BLE】CC2541獲取裝置的MAC地址實驗
安卓除錯工具掃描時直接顯示就是MAC地址。 蘋果裝置是以UUID的方式顯示。 所以我們直接用安卓裝置來測試。 我們連線時可以知道主機的地址。 變數是gapRole_ConnectedDevAddr,可以在peripherial.c裡搜尋GAP_LINK_
【BLE】CC2541低功耗測試-系統執行篇
1.osal_pwrmgr_powerconserve 描述: osal_pwrmgr_powerconserve()函式低功耗具體的處理函式,可以發現要想支援此功能,必須首先包含POWER_SAVI
【微服務架構】SpringCloud之Eureka(服務註冊和服務發現基礎篇)(二)
原文連結 上篇文章講解了SpringCloud元件和概念介紹,接下來講解一下SpringCloud元件相關元件使用、原理和每個元件的作用的,它主要提供的模組包括:服務發現(Eureka),斷路器(Hystrix),智慧路有(Zuul),客戶端負載均衡(Ribb
【STM8S】STM8S之電量採集
本篇博文最後修改時間:2016年08月30日,11:41。 一、簡介 本文介紹STM8S系列如何使用ADC的一個通道,對電量進行採集。 二、實驗平臺 編譯軟體:IAR for STM8 1.42.2 硬體平臺:stm8s003f3p6開發板 模擬器:ST