From 3ffad99284c63622945e0082cff0c8b69551fdf8 Mon Sep 17 00:00:00 2001 From: kbracher Date: Sun, 23 Mar 2025 15:51:25 +0100 Subject: [PATCH] fix: clear OV/UV flags after trigger --- .../Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Abstraction.h | 1 + .../Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_Abstraction.c | 5 +++++ .../Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_HighLevel.c | 2 ++ AMS_Master_Code/Core/Src/main.c | 3 ++- 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Abstraction.h b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Abstraction.h index 8eb37b9..406e92c 100644 --- a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Abstraction.h +++ b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Inc/ADBMS_Abstraction.h @@ -42,6 +42,7 @@ HAL_StatusTypeDef amsCheckUnderOverVoltage(Cell_Module (*module)[N_BMS]); HAL_StatusTypeDef amsClearFlag(); HAL_StatusTypeDef amsClearAux(); +HAL_StatusTypeDef amsClearOVUV(); HAL_StatusTypeDef amsReadCellVoltages(Cell_Module (*module)[N_BMS]); 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 412eb60..34ef50b 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 @@ -294,6 +294,11 @@ HAL_StatusTypeDef amsClearFlag() { HAL_StatusTypeDef amsClearAux() { return writeCMD(CLRAUX, CMD_EMPTY_BUFFER, 0); } +HAL_StatusTypeDef amsClearOVUV() { + uint8_t buffer[CMD_BUFFER_SIZE(6)] = {[0 ... CMD_BUFFER_SIZE(6) - 1] = 0xFF}; + return writeCMD(CLOVUV, buffer, 6); +} + HAL_StatusTypeDef amsReadCellVoltages(Cell_Module (*module)[N_BMS]) { uint8_t rxbuffer[CMD_BUFFER_SIZE(CV_GROUP_A_SIZE)] = {}; diff --git a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_HighLevel.c b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_HighLevel.c index efbe485..663af63 100644 --- a/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_HighLevel.c +++ b/AMS_Master_Code/Core/Lib/ADBMS6830B_Driver/Core/Src/ADBMS_HighLevel.c @@ -99,10 +99,12 @@ ADBMS_DetailedStatus AMS_Idle_Loop() { } if ((match = any(module.overVoltage))) { + amsClearOVUV(); return (ADBMS_DetailedStatus){ADBMS_OVERVOLT, match - 1}; } if ((match = any(module.underVoltage))) { + amsClearOVUV(); return (ADBMS_DetailedStatus){ADBMS_UNDERVOLT, match - 1}; } diff --git a/AMS_Master_Code/Core/Src/main.c b/AMS_Master_Code/Core/Src/main.c index b27a5fa..aece096 100644 --- a/AMS_Master_Code/Core/Src/main.c +++ b/AMS_Master_Code/Core/Src/main.c @@ -117,7 +117,7 @@ int main(void) int error_count = 0; while (1) { - if (error_count > 10) { + if (error_count > 25) { debug_log(LOG_LEVEL_ERROR, "Too many errors, restarting BMS..."); status = AMS_Init(&hspi1); if (status.status != ADBMS_NO_ERROR) { @@ -125,6 +125,7 @@ int main(void) HAL_Delay(2000); continue; } + error_count = 0; } status = AMS_Idle_Loop(); if (status.status != ADBMS_NO_ERROR) {