From 79fe1113de83427c67962800ceb51c70be515891 Mon Sep 17 00:00:00 2001 From: Thomas Kolb Date: Thu, 1 Jul 2021 21:10:13 +0200 Subject: [PATCH] charge_control: implement voltage transition --- src/charge_control.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/charge_control.c b/src/charge_control.c index 5f1d6a0..df13794 100644 --- a/src/charge_control.c +++ b/src/charge_control.c @@ -136,19 +136,28 @@ static void solar_fsm_update(uint64_t uptime_ms, struct MeasurementResult *meas) case CHARGE_TRANSITION: // FIXME: dynamically adjust thresholds - charge_state = control_solar_charging( - u_bat_float_full, - u_bat_float_low, - uptime_ms, - meas, - charge_state, - charge_time_in_state); + if(charge_time_in_state < INITIAL_TO_FLOAT_TRANSITION_TIME) { + fxp_t u_bat_full = + fxp_add(u_bat_initial_full, + fxp_mult( + fxp_sub(u_bat_float_full, u_bat_initial_full), + fxp_div(charge_time_in_state, INITIAL_TO_FLOAT_TRANSITION_TIME))); - // time limit for transition to float charging - if(charge_time_in_state > INITIAL_TO_FLOAT_TRANSITION_TIME) { + fxp_t u_bat_low = fxp_sub(u_bat_full, u_bat_regulation_corridor); + + charge_state = control_solar_charging( + u_bat_full, + u_bat_low, + uptime_ms, + meas, + charge_state, + charge_time_in_state); + } else { + // time limit for transition to float charging reached charge_state = CHARGE_FLOAT; break; } + break; case CHARGE_FLOAT: