From cc55d951ef518643f9b66ce80b86138cda2b0ce7 Mon Sep 17 00:00:00 2001 From: Ben Pirt Date: Sat, 2 Dec 2023 10:07:56 +0000 Subject: [PATCH] WIP - Dynamically adjust the charge current to avoid over-voltage --- battery/battery_pack.py | 7 ------- bms/bms.py | 17 ++++++++++------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/battery/battery_pack.py b/battery/battery_pack.py index ec68bcc..e3985d0 100644 --- a/battery/battery_pack.py +++ b/battery/battery_pack.py @@ -122,13 +122,6 @@ def cell_voltage_difference(self) -> float: return max((module.cell_voltage_difference for module in self.modules)) return 0.0 - def should_charge(self, current_state: bool) -> bool: - if current_state is True: - return self.high_cell_voltage < self._config.cell_high_voltage_setpoint - else: - return self.high_cell_voltage < ( - self._config.cell_high_voltage_setpoint - self._config.charge_hysteresis_voltage) - def should_discharge(self, current_state: bool) -> bool: if current_state is True: return self.low_cell_voltage > self._config.cell_low_voltage_setpoint diff --git a/bms/bms.py b/bms/bms.py index 858987e..7b70b0f 100644 --- a/bms/bms.py +++ b/bms/bms.py @@ -30,6 +30,7 @@ def __init__(self, battery_pack: BatteryPack, config: Config, current_sensor: Op self.__discharging_enabled = True self.__charging_timer = get_interval() self.__charging_timer.set(self.__config.charge_hysteresis_time) + self.__charge_current = self.__config.max_charge_current self.__discharging_timer = get_interval() self.__discharging_timer.set(self.__config.charge_hysteresis_time) self.__wdt: Optional[WDT] = None @@ -73,17 +74,19 @@ def current(self) -> float: @property def charge_current_setpoint(self) -> float: - self.__charging_enabled = self.battery_pack.should_charge(self.__charging_enabled) - if self.__charging_enabled is True: - if self.__charging_timer.ready: - return self.__config.max_charge_current + voltage_difference = self.battery_pack.high_cell_voltage - \ + self.__config.cell_high_voltage_setpoint + if voltage_difference > 0: + self.__charge_current = self.current * 0.9 else: - self.__charging_timer.reset() - return 0 + self.__charge_current = min( + self.__charge_current * 1.1, self.__config.max_charge_current) + return self.__charge_current @property def discharge_current_setpoint(self) -> float: - self.__discharging_enabled = self.battery_pack.should_discharge(self.__discharging_enabled) + self.__discharging_enabled = self.battery_pack.should_discharge( + self.__discharging_enabled) if self.__discharging_enabled is True: if self.__discharging_timer.ready: return self.__config.max_discharge_current