From: SnickerSun Date: Sat, 30 Mar 2024 01:26:07 +0000 (+0800) Subject: 添加充电逻辑优化,异常情况判定,充电时温度过高会停止充电,快充满时采用小电流充电,低电量报警。 X-Git-Tag: release_V1.2.70_20241020_135402~1241^2~10 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=25f2af0420decb1bd5072810d0eeb022c5cd28a5;p=mirrors%2FFD230.git 添加充电逻辑优化,异常情况判定,充电时温度过高会停止充电,快充满时采用小电流充电,低电量报警。 --- diff --git a/code/sdk/application/battery/service/battery_driver.cpp b/code/sdk/application/battery/service/battery_driver.cpp index 5fc6329e7..16b0ca3ed 100644 --- a/code/sdk/application/battery/service/battery_driver.cpp +++ b/code/sdk/application/battery/service/battery_driver.cpp @@ -528,6 +528,34 @@ void disable_02c(void) } +uint8_t batteryservice_get_voltage(float *voltage) +{ + uint8_t percent = 0; + battery_info_t *current_battery_info = get_current_battery_info(); + *voltage = current_battery_info->battery_voltage; + if (*voltage <= batteryservice_VOLTAGE_MIN) + return 0; + if (*voltage >= batteryservice_VOLTAGE_MAX) + return 100; + percent = (*voltage - batteryservice_VOLTAGE_MIN)*100/(batteryservice_VOLTAGE_MAX - batteryservice_VOLTAGE_MIN) ; + return percent; +} + + +uint8_t batteryservice_get_battery_temp(float *temp) +{ + battery_info_t *current_battery_info = get_current_battery_info(); + *temp = current_battery_info->battery_ntc_temp; + + return 0; +} +uint8_t batteryservice_get_pcb_temp(float *temp) +{ + battery_info_t *current_battery_info = get_current_battery_info(); + *temp = current_battery_info->pcb_ntc_temp; + return 0; +} + #ifdef __cplusplus #if __cplusplus } diff --git a/code/sdk/application/battery/service/battery_service.cpp b/code/sdk/application/battery/service/battery_service.cpp index 42c3ffc50..3a9cbc6b9 100644 --- a/code/sdk/application/battery/service/battery_service.cpp +++ b/code/sdk/application/battery/service/battery_service.cpp @@ -43,39 +43,12 @@ extern "C" { #include "custom_utils.h" -#define batteryservice_VOLTAGE_MAX (4.2f) -#define batteryservice_VOLTAGE_MIN (3.2f) - bool batteryservice_get_voltage_by_channel(float *voltage, uint8_t channel); battery_info_t *get_current_battery_info(void); static bool g_batter_service_initialled = false; errcode_t uapi_battery_init(void); #include "tcxo.h" -uint8_t batteryservice_get_voltage(float *voltage) -{ - uint8_t percent = 0; - battery_info_t *current_battery_info = get_current_battery_info(); - *voltage = current_battery_info->battery_voltage; - if (*voltage <= batteryservice_VOLTAGE_MIN) - return 0; - if (*voltage >= batteryservice_VOLTAGE_MAX) - return 100; - percent = (*voltage - batteryservice_VOLTAGE_MIN)*100/(batteryservice_VOLTAGE_MAX - batteryservice_VOLTAGE_MIN) ; - return percent; -} -uint8_t batteryservice_get_battery_temp(float *temp) -{ - battery_info_t *current_battery_info = get_current_battery_info(); - *temp = current_battery_info->battery_ntc_temp; - - return 0; -} -uint8_t batteryservice_get_pcb_temp(float *temp) -{ - battery_info_t *current_battery_info = get_current_battery_info(); - *temp = current_battery_info->pcb_ntc_temp; - return 0; -} + /**************************Battery Check Timer***********************/ /** * 电池电压读取逻辑: @@ -97,9 +70,15 @@ osTimerId_t g_battery_timer = NULL; bool last_battery_charge_enable_status=true; // true上次刚设置在充电状态,false 上次设置不在充电状态。注意这个是充电IC的充电开关设置,并非真正处于充电状态的标识。 static unsigned long g_app_queue; #define BATTERY_CMD_CHECK_VOLTAGE 0x11 -#define BATTERY_CMD_DISABLE_CHARGE 0x12 #define BATTERY_CMD_CHARGE_PLUG 0x13 #define BATTERY_CMD_CHARGE_UNPLUG 0x14 + +#define BATTERY_LOWPOWER_ALARM_POWERLEVEL 15 +#define BATTERY_LOWPOWER_ALARM_SHUTDOWNLEVEL 5 +#define BATTERY_DISABLE_CHARGE_HI_TEMP_VALUE 50 //停止充电温度 + +#define BATTERY_VOLTAGE_DEBOUNCE 2 + static uint8_t g_check_count = 0; static void battery_check_timer_callback(void* data); @@ -112,7 +91,7 @@ static void battery_timer_start_check_released(uint32_t rtc_ms) osTimerStart(g_battery_timer, rtc_ms); } void send_battery_svr_cmd_msg(uint8_t cmd); -static void battery_check_and_enable_charge(void); +static void battery_check_voltage(void); static void battery_check_timer_callback(void * data) @@ -155,7 +134,9 @@ uint8_t get_charge_stat(void) else return 0; } -static void battery_check_and_enable_charge(void) + + +static void battery_check_voltage(void) { battery_info_t *current_battery_info = get_current_battery_info(); batteryservice_get_voltage_by_channel(¤t_battery_info->battery_voltage,ADC_CHANNEL_BAT_VOLTAGE); @@ -163,8 +144,62 @@ static void battery_check_and_enable_charge(void) batteryservice_get_voltage_by_channel(¤t_battery_info->battery_ntc_temp,ADC_CHANNEL_BAT_TEMP); uapi_tcxo_delay_ms(20); batteryservice_get_voltage_by_channel(¤t_battery_info->pcb_ntc_temp,ADC_CHANNEL_PCB_TEMP); - uapi_tcxo_delay_ms(20); - enable_charge(); + uapi_tcxo_delay_ms(20); +} +/** + * 充电中则使能充电IC,并根据电量确认充电电流. + * 未插入充电线,则停止充电IC + * 兼顾低电量报警检测 +*/ +static void battery_check_chargement(void) +{ + float voltage; + float bat_temp; + uint8_t percent = batteryservice_get_voltage(&voltage); + batteryservice_get_battery_temp(&bat_temp); + + if(uapi_get_charger_plug_status()){ + + /** + * 如果充电过程中,电池温度>=BATTERY_DISABLE_CHARGE_HI_TEMP_VALUE,则停止充电 + * 否则按正常流程充电 + */ + if(bat_temp >= BATTERY_DISABLE_CHARGE_HI_TEMP_VALUE) + { + disable_charge(); + }else{ + enable_charge(); + /** + * check and control charge current event + * larger than 90%, use low charge current + * other stat , use high charge current + * pay attention to : debounce + */ + if(percent >=90) enable_02c(); + else disable_02c(); + PRINT("%d\r\n",BATTERY_VOLTAGE_DEBOUNCE); + } + + }else{ + //冗余操作,理论上不必在此关闭充电IC + disable_charge(); + + /** + * if no in_charge then : + * check and report low power event + * report alarm lowpower event at 15% + * report alarm shutdown event at 5% + * pay attention to : debounce + */ + if (percent >0 && percent <= BATTERY_LOWPOWER_ALARM_POWERLEVEL) + { + low_power_play_toUI(0); + }else if (percent <= BATTERY_LOWPOWER_ALARM_SHUTDOWNLEVEL) + { + low_power_play_toUI(1); + } + } + } static void battery_check_task(void *arg) { @@ -173,15 +208,18 @@ static void battery_check_task(void *arg) common_notify_mail_t mail; uint32_t msgsize = (uint32_t)sizeof(common_notify_mail_t); + + /**开机初始化电量及充电状态 Start*/ if(uapi_get_charger_plug_status()) { //如果充电线插入状态,为了获取准确电池数据,需要先停止充电一秒,再继续获取电量。 disable_charge(); uapi_tcxo_delay_ms(1000); - battery_check_and_enable_charge(); + battery_check_voltage(); }else{ - battery_check_and_enable_charge(); + battery_check_voltage(); } - + battery_check_chargement(); + /**开机初始化电量及充电状态 End*/ while (1) { ret = osal_msg_queue_read_copy(g_app_queue, (void *)&mail, &msgsize, OSAL_MSGQ_WAIT_FOREVER); @@ -194,10 +232,10 @@ static void battery_check_task(void *arg) if (is_xts_test_done() == 0) continue; #endif - // get_charge_stat(); if (mail.comm.event == BATTERY_CMD_CHECK_VOLTAGE) { + g_check_count++; // PRINT("BATTERY_CMD_CHECK_VOLTAGE g_check_count %d\r\n",g_check_count); if(last_battery_charge_enable_status == true){ @@ -216,24 +254,27 @@ static void battery_check_task(void *arg) }else if (last_battery_charge_enable_status == false) { if (g_check_count*CHARGE_CHECK_TIMER_CYCLE_MS >= DISABLE_CHARGE_CHECK_MS) { - // PRINT("BATTERY_CMD_CHECK_VOLTAGE battery_check_and_enable_charge \r\n"); - + // PRINT("BATTERY_CMD_CHECK_VOLTAGE battery_check_voltage \r\n"); g_check_count = 0 ; //超时交换状态 - battery_check_and_enable_charge(); + battery_check_voltage(); last_battery_charge_enable_status = true; // charger_plug_event_ui_sendmsg_toUI(1); + //运行在battery_check_voltage之后,不然开始充电时电压检测值的误差会比较大 + battery_check_chargement(); } } }else if (mail.comm.event == BATTERY_CMD_CHARGE_PLUG) { // PRINT("[battery][service] charger_plug_event_ui_sendmsg_toUI plugged \n"); + battery_check_chargement(); charger_plug_event_ui_sendmsg_toUI(1); }else if (mail.comm.event == BATTERY_CMD_CHARGE_UNPLUG) { // PRINT("[battery][service] charger_plug_event_ui_sendmsg_toUI unplugged \n"); + disable_charge(); charger_plug_event_ui_sendmsg_toUI(0); } - } + }// while (1) @@ -305,20 +346,21 @@ errcode_t charger_plug_event_notify(uint8_t plugged) return 0; } -errcode_t Play_shutdown_animation_notify(uint8_t plugged) +errcode_t Play_shutdown_animation_notify(uint8_t alarm_level) { - ChargerEventPublish(TOPIC_EVENT_LOWPOWER_ALARM,3); - // return 0; + ChargerEventPublish(TOPIC_EVENT_LOWPOWER_ALARM,alarm_level); return 0; } - -errcode_t low_power_play_toUI(uint8_t plugged) +/** + * alarm_level = 0, 提醒充电, 1,倒计时关机 +*/ +errcode_t low_power_play_toUI(uint8_t alarm_level) { /**通过UI事件发送Notify*/ - GraphicService::GetInstance()->PostGraphicEvent(std::bind(Play_shutdown_animation_notify, plugged)); + GraphicService::GetInstance()->PostGraphicEvent(std::bind(Play_shutdown_animation_notify, alarm_level)); return ERRCODE_SUCC; } @@ -338,17 +380,23 @@ errcode_t battery_charger_plug_event_callback(uint8_t plugged) PRINT("[battery][service] battery_charger_plug_event_callback plugged=%u \n",plugged); + battery_info_t *batinfo = get_current_battery_info(); + if(plugged == 1){ // PRINT("[battery][service] battery_charger_plug plugged \n"); send_battery_svr_cmd_msg(BATTERY_CMD_CHARGE_PLUG); + batinfo->usb_plugged = true; }else{ // PRINT("[battery][service] battery_charger_plug unplugged \n"); send_battery_svr_cmd_msg(BATTERY_CMD_CHARGE_UNPLUG); + batinfo->usb_plugged = false; } return ERRCODE_SUCC; } + + void uapi_battery_create_queue(void) { if (osal_msg_queue_create("battery_queue", APP_BOARD_MSG_COUNT, &g_app_queue, diff --git a/code/sdk/application/battery/service/battery_service.h b/code/sdk/application/battery/service/battery_service.h index 4d1f7d7cc..21a52e938 100644 --- a/code/sdk/application/battery/service/battery_service.h +++ b/code/sdk/application/battery/service/battery_service.h @@ -26,7 +26,7 @@ errcode_t uapi_battery_init(void); void uapi_battery_deinit(void); void battery_service_resume(void); void battery_service_suspend(void); -errcode_t low_power_play_toUI(uint8_t); +errcode_t low_power_play_toUI(uint8_t alarm_level); void enable_02c(void); void disable_02c(void); void enable_charge(void); diff --git a/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp b/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp index 5d569f2f5..e753139bd 100755 --- a/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp +++ b/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp @@ -263,16 +263,19 @@ void MsgCenterNotifyLowPowerAlarmProc(const Topic topic, Request* req) uint8 *x= (uint8 *)(req->data); if(*x==3) { + //倒计时结束后,直接执行关机动画 low_power_paly(); } else if(*x==0) { + //提醒低电充电 set_lowpower_falg(false); NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO); NotificationManager::GetInstance()->ShowNotify(showlowpowerNotify, (uint16_t)topic, true); } else { + //电量过低,直接提醒关机 set_lowpower_falg(true); NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO); NotificationManager::GetInstance()->ShowNotify(showlowpowerNotify, (uint16_t)topic, true); diff --git a/code/sdk/application/wearable/service/msg_center/src/notify/charge_notification.cpp b/code/sdk/application/wearable/service/msg_center/src/notify/charge_notification.cpp index 7120ce16f..70707dfcf 100644 --- a/code/sdk/application/wearable/service/msg_center/src/notify/charge_notification.cpp +++ b/code/sdk/application/wearable/service/msg_center/src/notify/charge_notification.cpp @@ -159,7 +159,7 @@ namespace OHOS void low_power_TimerCallBack(int data) { //uapi_poweroff_device(); // 关机 - low_power_play_toUI(0); + low_power_play_toUI(3); } void low_power_paly(void) { diff --git a/code/sdk/drivers/peripheral/utils/custom_utils.c b/code/sdk/drivers/peripheral/utils/custom_utils.c index f1c3f8dd8..1e41c7a59 100644 --- a/code/sdk/drivers/peripheral/utils/custom_utils.c +++ b/code/sdk/drivers/peripheral/utils/custom_utils.c @@ -726,41 +726,6 @@ void mmc5603_getid(void) } -#include "battery_hal.h" -void charge_getstate(void) -{ - if(get_charge_stat()) - PRINT("charging\r\n"); - else - PRINT("uncharged\r\n"); -} - -#include "battery_service.h" -#define batteryservice_VOLTAGE_MAX (4.2f) -#define batteryservice_VOLTAGE_MIN (3.2f) - -void battery_getpower(void) -{ - float vol = 0; - uint8_t per; - battery_info_t *current_battery_info = get_current_battery_info(); - vol = current_battery_info->battery_voltage; - per = (vol - batteryservice_VOLTAGE_MIN)*100/(batteryservice_VOLTAGE_MAX - batteryservice_VOLTAGE_MIN) ; - if(per <= 0) - per = 0; - else if(per >= 100) - per = 100; - PRINT("power : %d \r\n",per); -} - -void battery_getvoltage(void) -{ - battery_info_t *current_battery_info = get_current_battery_info(); - batteryservice_get_voltage_by_channel(¤t_battery_info->battery_voltage,ADC_CHANNEL_BAT_VOLTAGE); - PRINT("voltage : %f \r\n",current_battery_info->battery_voltage); -} - - #include "flash.h" void flash_erase(void) diff --git a/code/sdk/drivers/peripheral/utils/custom_utils.h b/code/sdk/drivers/peripheral/utils/custom_utils.h index 2a3592d12..7f085e526 100644 --- a/code/sdk/drivers/peripheral/utils/custom_utils.h +++ b/code/sdk/drivers/peripheral/utils/custom_utils.h @@ -80,7 +80,6 @@ void mmc5603_getid(void); void charge_getstate(void); //获取电压 -void battery_getvoltage(void); void battery_getvolpower(void); //flash整片擦除 diff --git a/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c b/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c index 3e78e3661..01a0db40d 100644 --- a/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c +++ b/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c @@ -209,13 +209,16 @@ static uint32_t custom_mmc5603_getid(uint8_t *para, uint32_t paraLen, char *strC return ERRCODE_SUCC; } - +#include "battery_hal.h" static uint32_t custom_charge_getstate(uint8_t *para, uint32_t paraLen, char *strCommonCmd) { UNUSED(strCommonCmd); - charge_getstate(); + if(get_charge_stat()) + PRINT("charging\r\n"); + else + PRINT("uncharged\r\n"); return ERRCODE_SUCC; } @@ -225,17 +228,22 @@ static uint32_t custom_battery_getpower(uint8_t *para, uint32_t paraLen, char *s UNUSED(strCommonCmd); - battery_getpower(); + float vol = 0; + uint8_t percent = battery_get_voltage(&vol); + PRINT("voltage : %f , percent %02D\%\r\n",vol,percent); return ERRCODE_SUCC; } -static uint32_t custom_battery_getvoltage(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +static uint32_t custom_battery_gettemp(uint8_t *para, uint32_t paraLen, char *strCommonCmd) { UNUSED(strCommonCmd); - - battery_getvoltage(); + float temp=0.0f; + int ret = battery_get_battery_temp(&temp); + PRINT("battery temp %.4f , ret %d\r\n",temp,ret); + ret = battery_get_pcb_temp(&temp); + PRINT("pcb temp %.4f , ret %d\r\n",temp,ret); return ERRCODE_SUCC; } @@ -284,7 +292,7 @@ static const at_cmd_table_t g_custom_utils_cmd[] = { { (char *)"AT^GETPOWER", custom_battery_getpower, (char *)" " }, - { (char *)"AT^GETVOLTAGE", custom_battery_getvoltage, (char *)" " }, + { (char *)"AT^GETTEMP", custom_battery_gettemp, (char *)" " }, { (char *)"AT^FLASHERASE", custom_flash_erase, (char *)" " },