From 879464e58724dcc6ed8b78f82212db0e48c3e611 Mon Sep 17 00:00:00 2001 From: hamza Date: Sun, 7 Jul 2024 01:57:00 +0300 Subject: [PATCH] . --- Core/Src/AMS_HighLevel.c | 2 +- Core/Src/TMP1075.c | 1 + Core/Src/state_machine.c | 62 ++++++++++++++++++++++++++-------------- 3 files changed, 43 insertions(+), 22 deletions(-) diff --git a/Core/Src/AMS_HighLevel.c b/Core/Src/AMS_HighLevel.c index 0ea74de..8e213d5 100644 --- a/Core/Src/AMS_HighLevel.c +++ b/Core/Src/AMS_HighLevel.c @@ -28,7 +28,7 @@ uint16_t amsov = 0; uint8_t amserrorcode = 0; uint8_t amswarningcode = 0; -uint8_t numberofCells = 14; +uint8_t numberofCells = 13; uint8_t numberofAux = 0; uint8_t packetChecksumFails = 0; diff --git a/Core/Src/TMP1075.c b/Core/Src/TMP1075.c index 6e2ba76..fcb1d50 100644 --- a/Core/Src/TMP1075.c +++ b/Core/Src/TMP1075.c @@ -40,6 +40,7 @@ HAL_StatusTypeDef tmp1075_measure() { err = 1; } else { tmp1075_temps[i] >>= 4; + //tmp1075_temps[i] = tmp1075_temps[i] * 100/1600; tmp1075_failed_sensors &= ~(1 << i); if (tmp1075_temps[i] >= MAX_TEMP) { temp_error = 1; diff --git a/Core/Src/state_machine.c b/Core/Src/state_machine.c index 18804ce..cce0139 100644 --- a/Core/Src/state_machine.c +++ b/Core/Src/state_machine.c @@ -23,16 +23,12 @@ uint8_t powerground_calibration_stage; static uint32_t timestamp; void sm_init(){ - state.current_state = STATE_INACTIVE; - state.target_state = STATE_INACTIVE; + state.current_state = STATE_ERROR; + state.target_state = STATE_ERROR; state.error_source = 0; precharge_timer = discharge_timer = powerground_calibration_timer = 0; } -void sm_update_BMS_state(){ - -} - #warning change amsState here void sm_update(){ sm_check_errors(); @@ -87,6 +83,8 @@ State sm_update_inactive(){ return STATE_PRECHARGE; case STATE_CHARGING_PRECHARGE: return STATE_CHARGING_PRECHARGE; + case STATE_ERROR: + return STATE_ERROR; default: return STATE_INACTIVE; } @@ -130,6 +128,8 @@ State sm_update_discharge(){ switch (state.target_state) { case STATE_INACTIVE: return STATE_INACTIVE; + case STATE_ERROR: + return STATE_ERROR; default: return STATE_DISCHARGE; } @@ -159,6 +159,8 @@ State sm_update_error(){ switch (state.target_state) { case STATE_DISCHARGE: return STATE_DISCHARGE; + case STATE_INACTIVE: + return STATE_INACTIVE; default: return STATE_ERROR; } @@ -310,12 +312,22 @@ void sm_handle_ams_in(const uint8_t *data){ case 0xF1: // EEPROM break; case 0xFF: // EMERGENCY SHUTDOWN + state.current_state = STATE_DISCHARGE; + state.target_state = STATE_ERROR; break; } } void sm_set_error(ErrorKind error_kind, bool is_errored){} +/* +bool sm_is_errored(){ + return state.error_type.current_error == 1 || state.error_type.current_sensor_missing == 1 || //state.error_type.eeprom_error == 1 || + state.error_type.state_transition_fail == 1 || state.error_type.temperature_error == 1 || state.error_type.voltage_error == 1 || + state.error_type.voltage_missing == 1 || state.error_type.bms_fault == 1 || state.error_type.bms_timeout == 1; +} +*/ + #warning TODO: add error checking for everything here void sm_check_errors(){ switch (error_data.data_kind) { @@ -330,7 +342,7 @@ void sm_check_errors(){ state.error_type.voltage_error = 1; break; case SEK_EEPROM_ERR: - state.error_type.eeprom_error = 1; + //state.error_type.eeprom_error = 1; break; case SEK_INTERNAL_BMS_TIMEOUT: state.error_type.bms_timeout = 1; @@ -341,22 +353,30 @@ void sm_check_errors(){ state.error_type.bms_fault = 1; break; } + + state.error_type.temperature_error = (error_data.data_kind == SEK_OVERTEMP || error_data.data_kind == SEK_UNDERTEMP ||error_data.data_kind == SEK_TOO_FEW_TEMPS) ? 1 : 0; + state.error_type.voltage_error = (error_data.data_kind == SEK_OVERVOLT || error_data.data_kind == SEK_UNDERVOLT ||error_data.data_kind == SEK_OPENWIRE) ? 1 : 0; + state.error_type.bms_timeout = (error_data.data_kind == SEK_INTERNAL_BMS_TIMEOUT) ? 1 : 0; + state.error_type.bms_fault = (error_data.data_kind == SEK_INTERNAL_BMS_CHECKSUM_FAIL || error_data.data_kind == SEK_INTERNAL_BMS_FAULT || error_data.data_kind == SEK_INTERNAL_BMS_OVERTEMP) ? 1 : 0; + //SEK_EEPROM_ERR: state.error_type.eeprom_error = 1; + state.error_type.current_error = (powerground_status > 10 && CURRENT_MEASUREMENT < 1000) ? 1 : 0; + state.error_type.current_sensor_missing = (!CURRENT_MEASUREMENT_ON) ? 1 : 0; + state.error_type.voltage_error = (RELAY_BAT_SIDE_VOLTAGE < 30000) ? 1 : 0; + state.error_type.voltage_missing = (RELAY_BAT_SIDE_VOLTAGE < 1000) ? 1 : 0; + - if (1){ - state.error_type.current_error = 1; - } - - if (1){ - state.error_type.current_sensor_missing = 1; - } - - if (RELAY_BAT_SIDE_VOLTAGE < 30000){ - state.error_type.voltage_error = 1; - } - - if (1){ - state.error_type.voltage_missing = 1; + if ( state.error_type.current_error == 1 || state.error_type.current_sensor_missing == 1 || //state.error_type.eeprom_error == 1 || + state.error_type.state_transition_fail == 1 || state.error_type.temperature_error == 1 || state.error_type.voltage_error == 1 || + state.error_type.voltage_missing == 1 || state.error_type.bms_fault == 1 || state.error_type.bms_timeout == 1){ + if (state.current_state != STATE_INACTIVE && state.current_state != STATE_ERROR) + state.current_state = STATE_DISCHARGE; + state.target_state = STATE_ERROR; + PWM_powerground_control(255); + } else { + if (state.current_state == STATE_ERROR) + state.target_state = STATE_INACTIVE; } + } int16_t sm_return_cell_temperature(int id){ return tmp1075_temps[id]; }