diff --git a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Driver.h b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Driver.h index 07a8585..c527efc 100644 --- a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Driver.h +++ b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Driver.h @@ -85,8 +85,8 @@ typedef struct { uint16_t sumOfCellMeasurements; uint16_t refVoltage; - uint32_t overVoltage; - uint32_t underVoltage; + uint32_t overVoltage; // Bitfield of overvoltage flags + uint32_t underVoltage; // " undervoltage " } Cell_Module; diff --git a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_Abstraction.c b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_Abstraction.c index 33142a8..944642d 100644 --- a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_Abstraction.c +++ b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_Abstraction.c @@ -79,7 +79,7 @@ HAL_StatusTypeDef amsReset() { CHECK_RETURN(writeCMD(ADCV | ADCV_CONT | ADCV_RD, flagsbuffer, 0)); //start continuous cell voltage measurement with redundancy CHECK_RETURN(writeCMD(ADAX | ADAX_CONV_ALL, flagsbuffer, 0)); //start aux measurement - return 0; + return HAL_OK; } HAL_StatusTypeDef initAMS(SPI_HandleTypeDef* hspi) { diff --git a/AMS_Master_Code/Core/Src/battery.c b/AMS_Master_Code/Core/Src/battery.c index 52be721..51692cc 100644 --- a/AMS_Master_Code/Core/Src/battery.c +++ b/AMS_Master_Code/Core/Src/battery.c @@ -68,6 +68,28 @@ HAL_StatusTypeDef battery_update() { if (ret.bms_id != -1) { debug_log_cont(LOG_LEVEL_ERROR, " (on BMS ID: %hd)", ret.bms_id); } + + if (ret.status == ADBMS_OVERVOLT || ret.status == ADBMS_UNDERVOLT) { + if (ret.bms_id != -1 && ret.bms_id < N_BMS) { + const char* error_type = (ret.status == ADBMS_OVERVOLT) ? "overvoltage" : "undervoltage"; + uint32_t voltage_flags = (ret.status == ADBMS_OVERVOLT) ? + modules[ret.bms_id].overVoltage : + modules[ret.bms_id].underVoltage; + + debug_log(LOG_LEVEL_ERROR, "Cell %s detected on module %d, affected cells: ", + error_type, ret.bms_id); + + for (size_t cell = 0; cell < N_CELLS; cell++) { + if (voltage_flags & (1UL << cell)) { + debug_log_cont(LOG_LEVEL_ERROR, "%zu (%d mV) ", cell, modules[ret.bms_id].cellVoltages[cell]); + } + } + + if (!voltage_flags) { + debug_log_cont(LOG_LEVEL_ERROR, "none (something went wrong?)"); + } + } + } update_error_window(true, ret.bms_id); return HAL_ERROR; @@ -137,7 +159,7 @@ HAL_StatusTypeDef battery_update() { } if (cellTemps[i][j] > (MAX_TEMP * (uint16_t)(TEMP_CONV))) { - debug_log(LOG_LEVEL_ERROR, "Cell %zu on BMS %zu overtemp: %d C", j, i, cellTemps[i][j]); + debug_log(LOG_LEVEL_ERROR, "Cell %zu on BMS %zu overtemp: %d0 mC", j, i, cellTemps[i][j]); can_send_error(TS_ERRORKIND_CELL_OVERTEMP, i); ts_sm_set_error_source(TS_ERROR_SOURCE_SLAVES, TS_ERRORKIND_CELL_OVERTEMP, true); } else { diff --git a/AMS_Master_Code/Core/Src/can.c b/AMS_Master_Code/Core/Src/can.c index 63561dd..849fef5 100644 --- a/AMS_Master_Code/Core/Src/can.c +++ b/AMS_Master_Code/Core/Src/can.c @@ -15,7 +15,7 @@ void can_init(FDCAN_HandleTypeDef *handle) { ftcan_init(handle); ftcan_add_filter(CAN_ID_SHUNT_BASE, 0xFF0); - // ftcan_add_filter(CAN_ID_AMS_IN, 0xFFF); + ftcan_add_filter(CAN_ID_AMS_IN, 0xFFF); // ftcan_add_filter(CAN_ID_SLAVE_PANIC, 0xFFF); // ftcan_add_filter(CAN_ID_SLAVE_STATUS_BASE, 0xFF0); // ftcan_add_filter(CAN_ID_SLAVE_LOG, 0xFFF); diff --git a/AMS_Master_Code/Core/Src/shunt_monitoring.c b/AMS_Master_Code/Core/Src/shunt_monitoring.c index 3655fa0..a938c45 100644 --- a/AMS_Master_Code/Core/Src/shunt_monitoring.c +++ b/AMS_Master_Code/Core/Src/shunt_monitoring.c @@ -9,16 +9,7 @@ ShuntData shunt_data; void shunt_init() { - shunt_data.current = 0; - shunt_data.voltage_veh = 0; - shunt_data.voltage_bat = 0; - shunt_data.voltage3 = 0; - shunt_data.busbartemp = 0; - shunt_data.power = 0; - shunt_data.energy = 0; - shunt_data.current_counter = 0; - shunt_data.last_message = 0; - shunt_data.last_current_message = 0; + shunt_data = (ShuntData){}; } void shunt_check() {