Telink BLE 低电压检测
电池电量检测(battery power detect/check),在Telink BLE SDK 和相关⽂档中也可能出现其他的名字,包括:电池电量检测(battery power detect/check)、低电池检测(low battery detect/check)、低电量检测(low power detect/check)、电池检查(battery detect/check)等。⽐如SDK 中相关⽂件和函数出现battery_check、battery_detect、battery_power_check 等命名。
本⽂档统⼀以“低电检测(low battery detect)”这个名称进⾏说明。
低电检测的重要性
使⽤电池供电的产品,由于电池电量会逐渐下降,当电压低到⼀定的值后会引起很多问题:
- 8x5x ⼯作电压的范围为1.8V~3.6V。当电压低于1.8V 时,8x5x 已经⽆法保证稳定的⼯作。
- 当电池电压较低时,由于电源的不稳定,Flash 的“write”和“erase”操作可能有出错的⻛险,造成program firmware 和⽤⼾数据被异常修改,最终导致产品失效。根据以往的量产经验,我们将这个可能出⻛险的低压阀值设定为2.0V。
根据上⾯的描述,使⽤电池供电的产品,必须设定⼀个安全电压值(secure voltage),只有当电压⾼于这个安全电压的时候才允许MCU 继续⼯作;⼀旦电压低于安全电压,MCU 停⽌运⾏,需要⽴刻被shutdown(SDK 上使⽤进⼊deepsleep mode 来实现)。
安全电压也称为报警电压,这个电压值的选取,⽬前SDK 默认使⽤2.0V。
注意:
- 低压保护阈值数值2.0V 只是⽰例、参考值。客⼾要根据实际情况评估修改这些阈值,如果user 在硬件电路中出现了不合理的设计,导致电源⽹络稳定性降低,都要酌情提⾼安全阈值。
对于Telink BLE SDK 开发实现的产品,只要使⽤了电池供电,低电检测都必须是该产品整个⽣命周期实时运⾏的任务,以保证产品的稳定性。
低电检测的实现
必须确保app_config.h ⽂件中宏“BATT_CHECK_ENABLE”是被打开的,这个宏默认是关闭的,user 使⽤低电检测功能时需要注意。
#define BATT_CHECK_ENABLE 1
低电检测是⼀个基本的ADC 采样任务,在实现ADC 采样电源电压时,有⼀些需要注意的问题,说明如下:
低电检测初始化
void adc_vbat_detect_init(void)
{/******power off sar adc********/adc_power_on_sar_adc(0);//add ADC configuration/******power on sar adc********///note: this setting must be set after all other settingsadc_power_on_sar_adc(1);
}
低电检测处理
在main_loop 中,调⽤app_battery_power_check 函数实现低电检测的处理
_attribute_data_retention_ u8 lowBattDet_enable = 1;
u8 adc_hw_initialized = 0;
void battery_set_detect_enable (int en)
{lowBattDet_enable = en;if(!en){adc_hw_initialized = 0; //need initialized again}
}
int battery_get_detect_enable (void)
{return lowBattDet_enable;
}//while(1)中的实现if(battery_get_detect_enable() && clock_time_exceed(lowBattDet_tick, 500000) ){lowBattDet_tick = clock_time();app_battery_power_check(VBAT_ALRAM_THRES_MV);}
低压报警
app_battery_power_check 的参数alram_vol_mv 指定低电检测的报警电压,单位为mV。根据前⽂介绍,SDK中默认设置为2000mV。在main_loop 的低压检测中,当电源电压低于2000mV 时,进⼊低压范围。低压报警的处理demo code 如下所⽰。低压后必须shutdown MCU,不能再进⾏其他⼯作。“b85m_ble_remote”使⽤进⼊deepsleep 的⽅式来实现shutdown MCU,并且设置了按键可以唤醒遥控器。低压报警的处理,除了必须shutdown 外,user 可以修改其他的报警⾏为。
下⾯code 中,使⽤LED 灯做了3 次快闪,告知产品使⽤者需要充电或更换电池。
if(batt_vol_mv < alram_vol_mv){#if (1 && BLT_APP_LED_ENABLE) //led indicategpio_set_output_en(GPIO_LED, 1); //output enablefor(int k=0;k<3;k++){gpio_write(GPIO_LED, LED_ON_LEVAL);sleep_us(200000);gpio_write(GPIO_LED, !LED_ON_LEVAL);sleep_us(200000);}#endifanalog_write(DEEP_ANA_REG2, LOW_BATT_FLG); //markcpu_sleep_wakeup(DEEPSLEEP_MODE, PM_WAKEUP_PAD, 0);
}
初始化中增加了低电压检测
if(analog_read(DEEP_ANA_REG2) == LOW_BATT_FLG){app_battery_power_check(VBAT_ALRAM_THRES_MV + 200); //2.2 V
}