fix(battery): harden charge-complete inference

This commit is contained in:
chenjintao
2026-08-25 10:03:36 +08:00
parent f33ad70c16
commit 61f034b288
3 changed files with 34 additions and 6 deletions
@@ -22,9 +22,9 @@
#define BATTERY_STOP_POLL_MS 10 #define BATTERY_STOP_POLL_MS 10
#define BATTERY_CHARGE_DEBOUNCE_MS 30 #define BATTERY_CHARGE_DEBOUNCE_MS 30
#define BATTERY_FULL_CONFIRM_RETRY_MS 1000 #define BATTERY_FULL_CONFIRM_RETRY_MS 1000
#define BATTERY_FULL_CONFIRM_TIME_MS 5000 #define BATTERY_FULL_CONFIRM_TIME_MS \
((uint32_t)CONFIG_TQ_BATTERY_FULL_CONFIRM_SEC * 1000U)
#define BATTERY_FULL_CONFIRM_SAMPLES 3U #define BATTERY_FULL_CONFIRM_SAMPLES 3U
#define BATTERY_FULL_MIN_VOLTAGE_MV 4050
#define BATTERY_SHUTDOWN_CONFIRM_SAMPLES 3U #define BATTERY_SHUTDOWN_CONFIRM_SAMPLES 3U
#define BATTERY_EMERGENCY_CONFIRM_SAMPLES 2U #define BATTERY_EMERGENCY_CONFIRM_SAMPLES 2U
#define BATTERY_SHUTDOWN_RETRY_MS 1000 #define BATTERY_SHUTDOWN_RETRY_MS 1000
@@ -339,8 +339,9 @@ static void control_plane_battery_full_hint_hook(
} }
ESP_LOGI(TAG, ESP_LOGI(TAG,
"Inferred charge-complete prompt start voltage=%dmV file=%s", "Inferred charge-complete prompt start voltage=%dmV level=%u%% file=%s",
status->voltage_mv, status->voltage_mv,
(unsigned)status->percentage,
BATTERY_FULL_PROMPT_FILE); BATTERY_FULL_PROMPT_FILE);
esp_err_t prompt_err = domain_runtime_behavior_play_prompt_file( esp_err_t prompt_err = domain_runtime_behavior_play_prompt_file(
BATTERY_FULL_PROMPT_FILE); BATTERY_FULL_PROMPT_FILE);
@@ -453,11 +454,13 @@ static void battery_worker(void *arg)
if (full_hint_candidate && status.valid && if (full_hint_candidate && status.valid &&
!status.measurement_suppressed) { !status.measurement_suppressed) {
if (status.charge_state != DOMAIN_BATTERY_CHARGE_NOT_CHARGING || if (status.charge_state != DOMAIN_BATTERY_CHARGE_NOT_CHARGING ||
status.voltage_mv < BATTERY_FULL_MIN_VOLTAGE_MV) { status.voltage_mv < CONFIG_TQ_BATTERY_FULL_MIN_VOLTAGE_MV ||
status.percentage < CONFIG_TQ_BATTERY_FULL_MIN_PERCENT) {
ESP_LOGI(TAG, ESP_LOGI(TAG,
"Charge-complete inference cancelled charge=%s voltage=%dmV", "Charge-complete inference cancelled charge=%s voltage=%dmV level=%u%%",
charge_state_name(status.charge_state), charge_state_name(status.charge_state),
status.voltage_mv); status.voltage_mv,
(unsigned)status.percentage);
full_hint_candidate = false; full_hint_candidate = false;
full_hint_confirmations = 0U; full_hint_confirmations = 0U;
} else { } else {
+22
View File
@@ -979,6 +979,28 @@ menu "Example Configuration"
range 0 1 range 0 1
depends on TQ_BATTERY_ENABLE depends on TQ_BATTERY_ENABLE
config TQ_BATTERY_FULL_MIN_VOLTAGE_MV
int "Minimum voltage for charge-complete prompt (mV)"
default 4150
range 4000 4200
depends on TQ_BATTERY_ENABLE
help
The TP4057 status pin cannot distinguish charge termination
from charger removal. Require at least this filtered battery
voltage before inferring that charging has completed.
config TQ_BATTERY_FULL_MIN_PERCENT
int "Minimum level for charge-complete prompt (percent)"
default 95
range 90 100
depends on TQ_BATTERY_ENABLE
config TQ_BATTERY_FULL_CONFIRM_SEC
int "Charge-complete stable confirmation time (seconds)"
default 30
range 5 300
depends on TQ_BATTERY_ENABLE
config TQ_BATTERY_DIVIDER_HIGH_OHM config TQ_BATTERY_DIVIDER_HIGH_OHM
int "Battery divider resistance from VBAT to ADC (ohm)" int "Battery divider resistance from VBAT to ADC (ohm)"
default 100000 default 100000
+3
View File
@@ -332,6 +332,9 @@ CONFIG_TQ_BATTERY_ENABLE=y
CONFIG_TQ_BATTERY_ADC_GPIO=9 CONFIG_TQ_BATTERY_ADC_GPIO=9
CONFIG_TQ_BATTERY_CHARGE_GPIO=10 CONFIG_TQ_BATTERY_CHARGE_GPIO=10
CONFIG_TQ_BATTERY_CHARGE_ACTIVE_LEVEL=0 CONFIG_TQ_BATTERY_CHARGE_ACTIVE_LEVEL=0
CONFIG_TQ_BATTERY_FULL_MIN_VOLTAGE_MV=4150
CONFIG_TQ_BATTERY_FULL_MIN_PERCENT=95
CONFIG_TQ_BATTERY_FULL_CONFIRM_SEC=30
CONFIG_TQ_BATTERY_DIVIDER_HIGH_OHM=100000 CONFIG_TQ_BATTERY_DIVIDER_HIGH_OHM=100000
CONFIG_TQ_BATTERY_DIVIDER_LOW_OHM=100000 CONFIG_TQ_BATTERY_DIVIDER_LOW_OHM=100000
CONFIG_TQ_BATTERY_CALIBRATION_GAIN_PPM=1000000 CONFIG_TQ_BATTERY_CALIBRATION_GAIN_PPM=1000000