diff --git a/Core/Inc/CAN_Communication.h b/Core/Inc/CAN_Communication.h index be41a1d..1030b8d 100644 --- a/Core/Inc/CAN_Communication.h +++ b/Core/Inc/CAN_Communication.h @@ -34,6 +34,7 @@ #define AMS_LOGGING_ID 0x500 #define AMS_LOGGING_NUM_FRAMES 6 +#define AMS_LOGGING_FRAMES_PER_LOOP 1 // Charger->Master IDs #define CHARGER_START_CHARGING 0x446 diff --git a/Core/Inc/SPI_Communication.h b/Core/Inc/SPI_Communication.h index e9e1235..51339d4 100644 --- a/Core/Inc/SPI_Communication.h +++ b/Core/Inc/SPI_Communication.h @@ -26,7 +26,7 @@ #define GET_MEASUREMENTS 0x05 #define TOGGLE_STATUS_LED 0x06 -#define NUMBEROFSLAVES 6 +#define NUMBEROFSLAVES 7 #define N_CELLS_SERIES 10 #define N_CELLS_PARALLEL 9 #define NUMBEROFTEMPS 32 diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 41a8597..e161bd2 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -42,7 +42,10 @@ extern "C" { /* Exported constants --------------------------------------------------------*/ /* USER CODE BEGIN EC */ - +#define THRESH_UV 32768 /* 2.5V */ +#define THRESH_OV 55050 /* 4.2V */ +#define THRESH_UT 0 /* 0C */ +#define THRESH_OT 880 /* 55C */ /* USER CODE END EC */ /* Exported macro ------------------------------------------------------------*/ diff --git a/Core/Src/CAN_Communication.c b/Core/Src/CAN_Communication.c index eb510aa..9d359a7 100644 --- a/Core/Src/CAN_Communication.c +++ b/Core/Src/CAN_Communication.c @@ -208,122 +208,124 @@ void CAN_SendLoggingFrame(FDCAN_HandleTypeDef* hcan) { uint8_t buffer[8]; - buffer[0] = ((slavelognum << 4) | framelognum); + for (int i = 0; i < AMS_LOGGING_FRAMES_PER_LOOP; i++) { + buffer[0] = ((slavelognum << 4) | framelognum); - switch (framelognum) { - case 0: - buffer[1] = CAN_convert_logval(slaves[slavelognum].cellVoltages[0], - BATTERY_VOLTAGE_TYPE); - buffer[2] = CAN_convert_logval(slaves[slavelognum].cellVoltages[1], - BATTERY_VOLTAGE_TYPE); - buffer[3] = CAN_convert_logval(slaves[slavelognum].cellVoltages[2], - BATTERY_VOLTAGE_TYPE); - buffer[4] = CAN_convert_logval(slaves[slavelognum].cellVoltages[3], - BATTERY_VOLTAGE_TYPE); - buffer[5] = CAN_convert_logval(slaves[slavelognum].cellVoltages[4], - BATTERY_VOLTAGE_TYPE); - buffer[6] = CAN_convert_logval(slaves[slavelognum].cellVoltages[5], - BATTERY_VOLTAGE_TYPE); - buffer[7] = CAN_convert_logval(slaves[slavelognum].cellVoltages[6], - BATTERY_VOLTAGE_TYPE); - break; + switch (framelognum) { + case 0: + buffer[1] = CAN_convert_logval(slaves[slavelognum].cellVoltages[0], + BATTERY_VOLTAGE_TYPE); + buffer[2] = CAN_convert_logval(slaves[slavelognum].cellVoltages[1], + BATTERY_VOLTAGE_TYPE); + buffer[3] = CAN_convert_logval(slaves[slavelognum].cellVoltages[2], + BATTERY_VOLTAGE_TYPE); + buffer[4] = CAN_convert_logval(slaves[slavelognum].cellVoltages[3], + BATTERY_VOLTAGE_TYPE); + buffer[5] = CAN_convert_logval(slaves[slavelognum].cellVoltages[4], + BATTERY_VOLTAGE_TYPE); + buffer[6] = CAN_convert_logval(slaves[slavelognum].cellVoltages[5], + BATTERY_VOLTAGE_TYPE); + buffer[7] = CAN_convert_logval(slaves[slavelognum].cellVoltages[6], + BATTERY_VOLTAGE_TYPE); + break; - case 1: - buffer[1] = CAN_convert_logval(slaves[slavelognum].cellVoltages[7], - BATTERY_VOLTAGE_TYPE); - buffer[2] = CAN_convert_logval(slaves[slavelognum].cellVoltages[8], - BATTERY_VOLTAGE_TYPE); - buffer[3] = CAN_convert_logval(slaves[slavelognum].cellVoltages[9], - BATTERY_VOLTAGE_TYPE); - buffer[4] = - CAN_convert_logval(slaves[slavelognum].cellTemps[0], BATTERY_TEMP_TYPE); - buffer[5] = - CAN_convert_logval(slaves[slavelognum].cellTemps[1], BATTERY_TEMP_TYPE); - buffer[6] = - CAN_convert_logval(slaves[slavelognum].cellTemps[2], BATTERY_TEMP_TYPE); - buffer[7] = - CAN_convert_logval(slaves[slavelognum].cellTemps[3], BATTERY_TEMP_TYPE); - break; + case 1: + buffer[1] = CAN_convert_logval(slaves[slavelognum].cellVoltages[7], + BATTERY_VOLTAGE_TYPE); + buffer[2] = CAN_convert_logval(slaves[slavelognum].cellVoltages[8], + BATTERY_VOLTAGE_TYPE); + buffer[3] = CAN_convert_logval(slaves[slavelognum].cellVoltages[9], + BATTERY_VOLTAGE_TYPE); + buffer[4] = CAN_convert_logval(slaves[slavelognum].cellTemps[0], + BATTERY_TEMP_TYPE); + buffer[5] = CAN_convert_logval(slaves[slavelognum].cellTemps[1], + BATTERY_TEMP_TYPE); + buffer[6] = CAN_convert_logval(slaves[slavelognum].cellTemps[2], + BATTERY_TEMP_TYPE); + buffer[7] = CAN_convert_logval(slaves[slavelognum].cellTemps[3], + BATTERY_TEMP_TYPE); + break; - case 2: - buffer[1] = - CAN_convert_logval(slaves[slavelognum].cellTemps[4], BATTERY_TEMP_TYPE); - buffer[2] = - CAN_convert_logval(slaves[slavelognum].cellTemps[5], BATTERY_TEMP_TYPE); - buffer[3] = - CAN_convert_logval(slaves[slavelognum].cellTemps[6], BATTERY_TEMP_TYPE); - buffer[4] = - CAN_convert_logval(slaves[slavelognum].cellTemps[7], BATTERY_TEMP_TYPE); - buffer[5] = - CAN_convert_logval(slaves[slavelognum].cellTemps[8], BATTERY_TEMP_TYPE); - buffer[6] = - CAN_convert_logval(slaves[slavelognum].cellTemps[9], BATTERY_TEMP_TYPE); - buffer[7] = CAN_convert_logval(slaves[slavelognum].cellTemps[10], - BATTERY_TEMP_TYPE); - break; + case 2: + buffer[1] = CAN_convert_logval(slaves[slavelognum].cellTemps[4], + BATTERY_TEMP_TYPE); + buffer[2] = CAN_convert_logval(slaves[slavelognum].cellTemps[5], + BATTERY_TEMP_TYPE); + buffer[3] = CAN_convert_logval(slaves[slavelognum].cellTemps[6], + BATTERY_TEMP_TYPE); + buffer[4] = CAN_convert_logval(slaves[slavelognum].cellTemps[7], + BATTERY_TEMP_TYPE); + buffer[5] = CAN_convert_logval(slaves[slavelognum].cellTemps[8], + BATTERY_TEMP_TYPE); + buffer[6] = CAN_convert_logval(slaves[slavelognum].cellTemps[9], + BATTERY_TEMP_TYPE); + buffer[7] = CAN_convert_logval(slaves[slavelognum].cellTemps[10], + BATTERY_TEMP_TYPE); + break; - case 3: - buffer[1] = CAN_convert_logval(slaves[slavelognum].cellTemps[11], - BATTERY_TEMP_TYPE); - buffer[2] = CAN_convert_logval(slaves[slavelognum].cellTemps[12], - BATTERY_TEMP_TYPE); - buffer[3] = CAN_convert_logval(slaves[slavelognum].cellTemps[13], - BATTERY_TEMP_TYPE); - buffer[4] = CAN_convert_logval(slaves[slavelognum].cellTemps[14], - BATTERY_TEMP_TYPE); - buffer[5] = CAN_convert_logval(slaves[slavelognum].cellTemps[15], - BATTERY_TEMP_TYPE); - buffer[6] = CAN_convert_logval(slaves[slavelognum].cellTemps[16], - BATTERY_TEMP_TYPE); - buffer[7] = CAN_convert_logval(slaves[slavelognum].cellTemps[17], - BATTERY_TEMP_TYPE); - break; + case 3: + buffer[1] = CAN_convert_logval(slaves[slavelognum].cellTemps[11], + BATTERY_TEMP_TYPE); + buffer[2] = CAN_convert_logval(slaves[slavelognum].cellTemps[12], + BATTERY_TEMP_TYPE); + buffer[3] = CAN_convert_logval(slaves[slavelognum].cellTemps[13], + BATTERY_TEMP_TYPE); + buffer[4] = CAN_convert_logval(slaves[slavelognum].cellTemps[14], + BATTERY_TEMP_TYPE); + buffer[5] = CAN_convert_logval(slaves[slavelognum].cellTemps[15], + BATTERY_TEMP_TYPE); + buffer[6] = CAN_convert_logval(slaves[slavelognum].cellTemps[16], + BATTERY_TEMP_TYPE); + buffer[7] = CAN_convert_logval(slaves[slavelognum].cellTemps[17], + BATTERY_TEMP_TYPE); + break; - case 4: - buffer[1] = CAN_convert_logval(slaves[slavelognum].cellTemps[18], - BATTERY_TEMP_TYPE); - buffer[2] = CAN_convert_logval(slaves[slavelognum].cellTemps[19], - BATTERY_TEMP_TYPE); - buffer[3] = CAN_convert_logval(slaves[slavelognum].cellTemps[20], - BATTERY_TEMP_TYPE); - buffer[4] = CAN_convert_logval(slaves[slavelognum].cellTemps[21], - BATTERY_TEMP_TYPE); - buffer[5] = CAN_convert_logval(slaves[slavelognum].cellTemps[22], - BATTERY_TEMP_TYPE); - buffer[6] = CAN_convert_logval(slaves[slavelognum].cellTemps[23], - BATTERY_TEMP_TYPE); - buffer[7] = CAN_convert_logval(slaves[slavelognum].cellTemps[24], - BATTERY_TEMP_TYPE); - break; + case 4: + buffer[1] = CAN_convert_logval(slaves[slavelognum].cellTemps[18], + BATTERY_TEMP_TYPE); + buffer[2] = CAN_convert_logval(slaves[slavelognum].cellTemps[19], + BATTERY_TEMP_TYPE); + buffer[3] = CAN_convert_logval(slaves[slavelognum].cellTemps[20], + BATTERY_TEMP_TYPE); + buffer[4] = CAN_convert_logval(slaves[slavelognum].cellTemps[21], + BATTERY_TEMP_TYPE); + buffer[5] = CAN_convert_logval(slaves[slavelognum].cellTemps[22], + BATTERY_TEMP_TYPE); + buffer[6] = CAN_convert_logval(slaves[slavelognum].cellTemps[23], + BATTERY_TEMP_TYPE); + buffer[7] = CAN_convert_logval(slaves[slavelognum].cellTemps[24], + BATTERY_TEMP_TYPE); + break; - case 5: - buffer[1] = CAN_convert_logval(slaves[slavelognum].cellTemps[25], - BATTERY_TEMP_TYPE); - buffer[2] = CAN_convert_logval(slaves[slavelognum].cellTemps[26], - BATTERY_TEMP_TYPE); - buffer[3] = CAN_convert_logval(slaves[slavelognum].cellTemps[27], - BATTERY_TEMP_TYPE); - buffer[4] = CAN_convert_logval(slaves[slavelognum].cellTemps[28], - BATTERY_TEMP_TYPE); - buffer[5] = CAN_convert_logval(slaves[slavelognum].cellTemps[29], - BATTERY_TEMP_TYPE); - buffer[6] = CAN_convert_logval(slaves[slavelognum].cellTemps[30], - BATTERY_TEMP_TYPE); - buffer[7] = CAN_convert_logval(slaves[slavelognum].cellTemps[31], - BATTERY_TEMP_TYPE); - break; - } + case 5: + buffer[1] = CAN_convert_logval(slaves[slavelognum].cellTemps[25], + BATTERY_TEMP_TYPE); + buffer[2] = CAN_convert_logval(slaves[slavelognum].cellTemps[26], + BATTERY_TEMP_TYPE); + buffer[3] = CAN_convert_logval(slaves[slavelognum].cellTemps[27], + BATTERY_TEMP_TYPE); + buffer[4] = CAN_convert_logval(slaves[slavelognum].cellTemps[28], + BATTERY_TEMP_TYPE); + buffer[5] = CAN_convert_logval(slaves[slavelognum].cellTemps[29], + BATTERY_TEMP_TYPE); + buffer[6] = CAN_convert_logval(slaves[slavelognum].cellTemps[30], + BATTERY_TEMP_TYPE); + buffer[7] = CAN_convert_logval(slaves[slavelognum].cellTemps[31], + BATTERY_TEMP_TYPE); + break; + } - CAN_Transmit(hcan, AMS_LOGGING_ID, buffer, 8); + CAN_Transmit(hcan, AMS_LOGGING_ID, buffer, 8); - framelognum++; - if ((framelognum >= AMS_LOGGING_NUM_FRAMES)) { - framelognum = 0; - slavelognum++; - } - if ((slavelognum >= NUMBEROFSLAVES)) { - slavelognum = 0; - framelognum = 0; + framelognum++; + if ((framelognum >= AMS_LOGGING_NUM_FRAMES)) { + framelognum = 0; + slavelognum++; + } + if ((slavelognum >= NUMBEROFSLAVES)) { + slavelognum = 0; + framelognum = 0; + } } } diff --git a/Core/Src/main.c b/Core/Src/main.c index e932249..928eb75 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -33,6 +33,8 @@ #include "SPI_Communication.h" #include "USB_Shell.h" +#include "stm32g4xx_hal.h" + /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -77,6 +79,17 @@ void setAMSError(); void AMS_Error_Handler(uint8_t ErrorCode); void Send_Can_Info_Frame(void); void softTSAL(void); + +void CheckCellLimits() { + if (HAL_GetTick() < 10000) { + return; + } + + if (min_temp < THRESH_UT || max_temp > THRESH_OT || min_voltage < THRESH_UV || + max_voltage > THRESH_OV) { + AMS_Error_Handler(0x10); + } +} /* USER CODE END 0 */ /** @@ -145,6 +158,7 @@ int main(void) { CAN_Receive(&hfdcan1); CAN_SendAbxStatus(&hfdcan1); CheckShuntLimits(); + CheckCellLimits(); CAN_SendLoggingFrame(&hfdcan1); HAL_GPIO_TogglePin(Status_LED_GPIO_Port, Status_LED_Pin); Temp_Ctrl_Loop();