From 7c14b8a0c0de01bdaebf9eaf2d771ddf89d9738c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Sat, 11 Jan 2025 21:07:40 +0200 Subject: [PATCH] Add CRITICAL cell voltage safeties --- Software/src/devboard/safety/safety.cpp | 16 ++++++++++++++-- Software/src/devboard/utils/events.cpp | 16 +++++++++++----- Software/src/devboard/utils/events.h | 4 +++- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/Software/src/devboard/safety/safety.cpp b/Software/src/devboard/safety/safety.cpp index ca69e5fb..cc510832 100644 --- a/Software/src/devboard/safety/safety.cpp +++ b/Software/src/devboard/safety/safety.cpp @@ -8,6 +8,7 @@ static bool battery_full_event_fired = false; static bool battery_empty_event_fired = false; #define MAX_SOH_DEVIATION_PPTT 2500 +#define CELL_CRITICAL_MV 100 // If cells go this much outside design voltage, shut battery down! //battery pause status begin bool emulator_pause_request_ON = false; @@ -54,13 +55,24 @@ void update_machineryprotection() { clear_event(EVENT_BATTERY_UNDERVOLTAGE); } - // Cell overvoltage, critical latching error without automatic reset. Requires user action. + // Cell overvoltage, further charging not possible. Battery might be imbalanced. if (datalayer.battery.status.cell_max_voltage_mV >= datalayer.battery.info.max_cell_voltage_mV) { set_event(EVENT_CELL_OVER_VOLTAGE, 0); + datalayer.battery.status.max_charge_power_W = 0; } - // Cell undervoltage, critical latching error without automatic reset. Requires user action. + // Cell CRITICAL overvoltage, critical latching error without automatic reset. Requires user action to inspect battery. + if (datalayer.battery.status.cell_max_voltage_mV >= (datalayer.battery.info.max_cell_voltage_mV + CELL_CRITICAL_MV)) { + set_event(EVENT_CELL_CRITICAL_OVER_VOLTAGE, 0); + } + + // Cell undervoltage. Further discharge not possible. Battery might be imbalanced. if (datalayer.battery.status.cell_min_voltage_mV <= datalayer.battery.info.min_cell_voltage_mV) { set_event(EVENT_CELL_UNDER_VOLTAGE, 0); + datalayer.battery.status.max_discharge_power_W = 0; + } + //Cell CRITICAL undervoltage. critical latching error without automatic reset. Requires user action to inspect battery. + if (datalayer.battery.status.cell_min_voltage_mV <= (datalayer.battery.info.min_cell_voltage_mV - CELL_CRITICAL_MV)) { + set_event(EVENT_CELL_CRITICAL_UNDER_VOLTAGE, 0); } // Battery is fully charged. Dont allow any more power into it diff --git a/Software/src/devboard/utils/events.cpp b/Software/src/devboard/utils/events.cpp index 9c9d1d81..51367c79 100644 --- a/Software/src/devboard/utils/events.cpp +++ b/Software/src/devboard/utils/events.cpp @@ -173,8 +173,10 @@ void init_events(void) { events.entries[EVENT_INTERFACE_MISSING].level = EVENT_LEVEL_INFO; events.entries[EVENT_MODBUS_INVERTER_MISSING].level = EVENT_LEVEL_INFO; events.entries[EVENT_ERROR_OPEN_CONTACTOR].level = EVENT_LEVEL_INFO; - events.entries[EVENT_CELL_UNDER_VOLTAGE].level = EVENT_LEVEL_ERROR; - events.entries[EVENT_CELL_OVER_VOLTAGE].level = EVENT_LEVEL_ERROR; + events.entries[EVENT_CELL_CRITICAL_UNDER_VOLTAGE].level = EVENT_LEVEL_ERROR; + events.entries[EVENT_CELL_CRITICAL_OVER_VOLTAGE].level = EVENT_LEVEL_ERROR; + events.entries[EVENT_CELL_UNDER_VOLTAGE].level = EVENT_LEVEL_WARNING; + events.entries[EVENT_CELL_OVER_VOLTAGE].level = EVENT_LEVEL_WARNING; events.entries[EVENT_CELL_DEVIATION_HIGH].level = EVENT_LEVEL_WARNING; events.entries[EVENT_UNKNOWN_EVENT_SET].level = EVENT_LEVEL_ERROR; events.entries[EVENT_OTA_UPDATE].level = EVENT_LEVEL_UPDATE; @@ -349,12 +351,16 @@ const char* get_event_message_string(EVENTS_ENUM_TYPE event) { "Check other error code for reason!"; case EVENT_MODBUS_INVERTER_MISSING: return "Modbus inverter has not sent any data. Inspect communication wiring!"; + case EVENT_CELL_CRITICAL_UNDER_VOLTAGE: + return "CELL VOLTAGE CRITICALLY LOW! Not possible to continue. Inspect battery!"; case EVENT_CELL_UNDER_VOLTAGE: - return "CELL UNDERVOLTAGE!!! Stopping battery charging and discharging. Inspect battery!"; + return "Cell undervoltage. Further discharge not possible. Check balancing of cells"; case EVENT_CELL_OVER_VOLTAGE: - return "CELL OVERVOLTAGE!!! Stopping battery charging and discharging. Inspect battery!"; + return "Cell overvoltage. Further charging not possible. Check balancing of cells"; + case EVENT_CELL_CRITICAL_OVER_VOLTAGE: + return "CELL VOLTAGE CRITICALLY HIGH! Not possible to continue. Inspect battery!"; case EVENT_CELL_DEVIATION_HIGH: - return "HIGH CELL DEVIATION!!! Inspect battery!"; + return "Large cell voltage deviation! Check balancing of cells"; case EVENT_UNKNOWN_EVENT_SET: return "An unknown event was set! Review your code!"; case EVENT_DUMMY_INFO: diff --git a/Software/src/devboard/utils/events.h b/Software/src/devboard/utils/events.h index c0c27b68..2e116581 100644 --- a/Software/src/devboard/utils/events.h +++ b/Software/src/devboard/utils/events.h @@ -6,7 +6,7 @@ // #define INCLUDE_EVENTS_TEST // Enable to run an event test loop, see events_test_on_target.cpp -#define EE_MAGIC_HEADER_VALUE 0x0019 // 0x0000 to 0xFFFF +#define EE_MAGIC_HEADER_VALUE 0x0020 // 0x0000 to 0xFFFF #define GENERATE_ENUM(ENUM) ENUM, #define GENERATE_STRING(STRING) #STRING, @@ -71,6 +71,8 @@ XX(EVENT_INTERFACE_MISSING) \ XX(EVENT_MODBUS_INVERTER_MISSING) \ XX(EVENT_ERROR_OPEN_CONTACTOR) \ + XX(EVENT_CELL_CRITICAL_UNDER_VOLTAGE) \ + XX(EVENT_CELL_CRITICAL_OVER_VOLTAGE) \ XX(EVENT_CELL_UNDER_VOLTAGE) \ XX(EVENT_CELL_OVER_VOLTAGE) \ XX(EVENT_CELL_DEVIATION_HIGH) \