diff --git a/src/charge_control.c b/src/charge_control.c index b916fbf..f8d6268 100644 --- a/src/charge_control.c +++ b/src/charge_control.c @@ -67,6 +67,8 @@ static fxp_t external_temperature_recovery; static fxp_t sleep_solar_current; static fxp_t sleep_solar_excess_voltage; +static uint32_t overload_retry_time; + static enum ChargeState control_solar_charging( fxp_t corridor_high, @@ -305,6 +307,13 @@ static void load_fsm_update(uint64_t uptime_ms, struct MeasurementResult *meas) } } + if((overload_retry_time != FLASH_CONFIG_OVERLOAD_RETRY_TIME) && + (discharge_time_in_state > 300000)) { + // overload did not trigger for 5 minutes, so we assume it’s stable and + // reset the retry time delay. + overload_retry_time = FLASH_CONFIG_OVERLOAD_RETRY_TIME; + } + if(meas->avg_u_bat < u_bat_load_off) { discharge_state = DISCHARGE_VOLTAGE_LOW; } @@ -341,7 +350,12 @@ static void load_fsm_update(uint64_t uptime_ms, struct MeasurementResult *meas) } // Overload recovery - if(discharge_time_in_state >= FLASH_CONFIG_OVERLOAD_RETRY_TIME) { + if(discharge_time_in_state >= overload_retry_time) { + // double the overload retry time for the next turn if it is less than 7 days + if(overload_retry_time < (7*24*3600*1000)) { + overload_retry_time *= 2; + } + discharge_state = DISCHARGE_WAIT_CHARGEPUMP; } break; @@ -389,6 +403,8 @@ void charge_control_init(void) sleep_solar_current = fxp_div(FXP_FROM_INT(FLASH_CONFIG_SLEEP_SOLAR_CURRENT), FXP_FROM_INT(1000)); sleep_solar_excess_voltage = fxp_div(FXP_FROM_INT(FLASH_CONFIG_SLEEP_SOLAR_EXCESS_VOLTAGE), FXP_FROM_INT(1000)); + + overload_retry_time = FLASH_CONFIG_OVERLOAD_RETRY_TIME; } diff --git a/utils/config_b26.yaml b/utils/config_b26.yaml index 0a08f38..41fb840 100644 --- a/utils/config_b26.yaml +++ b/utils/config_b26.yaml @@ -84,8 +84,9 @@ config: FLASH_CONFIG_OVERLOAD_DELAY_TIME: 10 # Overload retry time (in ms). Load is switched on again after this time if - # overload condition has triggered. - FLASH_CONFIG_OVERLOAD_RETRY_TIME: 1800000 + # overload condition has triggered. If overload immediately triggers again, + # this time is doubled. + FLASH_CONFIG_OVERLOAD_RETRY_TIME: 10000 # Minimum voltage that the charge pump must produce above U_bat before any # power FET is switched on (in mV).