diff --git a/Core/Inc/mainDataTypes.h b/Core/Inc/mainDataTypes.h index 26aefad..64e32ae 100644 --- a/Core/Inc/mainDataTypes.h +++ b/Core/Inc/mainDataTypes.h @@ -601,6 +601,7 @@ typedef enum { COMM_GET_GSM_DATA, COMM_GET_GSM_DEFAULT_DATA, COMM_SET_GSM_DATA, + COMM_GET_FAULT_STATE, } COMM_PACKET_ID; typedef enum { diff --git a/Core/Inc/modPowerElectronics.h b/Core/Inc/modPowerElectronics.h index fda4d11..acb6b88 100644 --- a/Core/Inc/modPowerElectronics.h +++ b/Core/Inc/modPowerElectronics.h @@ -110,9 +110,13 @@ typedef struct { uint8_t preChargeDesired; uint8_t disChargeDesired; uint8_t disChargeLCAllowed; + bool disChargeOverMaxTemperature; + bool disChargeOverMinTemperature; uint8_t chargeDesired; uint8_t chargePFETDesired; uint8_t chargeAllowed; + bool chargeOverMaxTemperature; + bool chargeOverMinTemperature; uint8_t coolingDesired; uint8_t coolingAllowed; uint8_t safetyOverCANHCSafeNSafe; diff --git a/Core/Src/main.c b/Core/Src/main.c index 4240475..3547358 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -1096,6 +1096,7 @@ void transmitCan1Packet() uint8_t data1[8] = {0x45}; CAN_Transmit(300, data1, 8, &hcan1); + can1_transmit_clock = TIM_Clock; return; CAN_TxHeaderTypeDef header; @@ -2044,7 +2045,7 @@ int main(void) //MX_CAN1_Init(); //MX_CAN2_Init(); -// CAN_SetSpeed(CAN_SPD_100, &hcan1); + CAN_SetSpeed(CAN_SPD_100, &hcan1); //HAL_GPIO_WritePin(HL4_GPIO_Port, HL4_Pin, 1); @@ -2290,7 +2291,7 @@ int main(void) // If there is new data handle SoC estimation // mainWatchDogReset(); -// transmitCan1Packet(); + transmitCan1Packet(); //transmitCan2Packet(); outputControl(); diff --git a/Core/Src/modCommands.c b/Core/Src/modCommands.c index 3d774f9..dd8ee2c 100644 --- a/Core/Src/modCommands.c +++ b/Core/Src/modCommands.c @@ -528,6 +528,11 @@ void modCommandsProcessPacket(unsigned char *data, unsigned int len) { modCommandsSendBuffer[ind++] = packet_id; modCommandsSendPacket(modCommandsSendBuffer, ind); break; + case COMM_GET_FAULT_STATE: + ind = 0; + modCommandsSendBuffer[ind++] = COMM_GET_FAULT_STATE; + libBufferAppend_uint16(modCommandsSendBuffer, (uint16_t)modCommandsGeneralState->faultState, &ind); + modCommandsSendPacket(modCommandsSendBuffer, ind); default: break; } diff --git a/Core/Src/modPowerElectronics.c b/Core/Src/modPowerElectronics.c index ea597f4..343365e 100644 --- a/Core/Src/modPowerElectronics.c +++ b/Core/Src/modPowerElectronics.c @@ -123,6 +123,11 @@ void modPowerElectronicsInit(modPowerElectronicsPackStateTypedef *packState, mod modPowerElectronicsPackStateHandle->powerDownDesired = false; modPowerElectronicsPackStateHandle->powerOnLongButtonPress = false; + modPowerElectronicsPackStateHandle->disChargeOverMaxTemperature = false; + modPowerElectronicsPackStateHandle->disChargeOverMinTemperature = false; + modPowerElectronicsPackStateHandle->chargeOverMaxTemperature = false; + modPowerElectronicsPackStateHandle->chargeOverMinTemperature = false; + for (uint8_t tempPointer = 0; tempPointer < NoOfTempSensors; ++tempPointer) { modPowerElectronicsPackStateHandle->temperatures[tempPointer] = 0; @@ -399,101 +404,165 @@ void modPowerElectronicsCallMonitorsCalcBalanceResistorArray(void) { } } -void modPowerElectronicsSubTaskVoltageWatch(void) { +void modPowerElectronicsSubTaskVoltageWatch(void) +{ static bool lastdisChargeLCAllowed = false; static bool lastChargeAllowed = false; //modPowerElectronicsCellMonitorsReadVoltageFlags(&hardUnderVoltageFlags,&hardOverVoltageFlags); modPowerElectronicsCalculateCellStats(); - if(modPowerElectronicsPackStateHandle->packOperationalCellState != PACK_STATE_ERROR_HARD_CELLVOLTAGE && modPowerElectronicsPackStateHandle->packOperationalCellState != PACK_STATE_ERROR_TEMPERATURE) { - + if (modPowerElectronicsPackStateHandle->packOperationalCellState != PACK_STATE_ERROR_HARD_CELLVOLTAGE && modPowerElectronicsPackStateHandle->packOperationalCellState != PACK_STATE_ERROR_TEMPERATURE) + { // Handle soft cell voltage limits & temperatures //Discharge disable - if(modPowerElectronicsPackStateHandle->cellVoltageLow <= modPowerElectronicsGeneralConfigHandle->cellLCSoftUnderVoltage) { + if (modPowerElectronicsPackStateHandle->cellVoltageLow <= modPowerElectronicsGeneralConfigHandle->cellLCSoftUnderVoltage) + { modPowerElectronicsPackStateHandle->disChargeLCAllowed = false; modPowerElectronicsDisChargeLCRetryLastTick = HAL_GetTick(); modPowerElectronicsPackStateHandle->faultState = FAULT_CODE_CELL_SOFT_UNDER_VOLTAGE; } - if(modPowerElectronicsPackStateHandle->tempBatteryHigh >= modPowerElectronicsGeneralConfigHandle->allowedTempBattDischargingMax){ + const float minTempDisChargeThreshold = modPowerElectronicsPackStateHandle->disChargeOverMinTemperature ? + modPowerElectronicsGeneralConfigHandle->allowedTempBattDischargingMin + 10 : + modPowerElectronicsGeneralConfigHandle->allowedTempBattDischargingMin; + + const float maxTempDisChargeThreshold = modPowerElectronicsPackStateHandle->disChargeOverMaxTemperature ? + modPowerElectronicsGeneralConfigHandle->allowedTempBattDischargingMax - 10 : + modPowerElectronicsGeneralConfigHandle->allowedTempBattDischargingMax; + + if (modPowerElectronicsPackStateHandle->tempBatteryHigh >= maxTempDisChargeThreshold) + { modPowerElectronicsPackStateHandle->disChargeLCAllowed = false; + modPowerElectronicsPackStateHandle->disChargeOverMinTemperature = false; + modPowerElectronicsPackStateHandle->disChargeOverMaxTemperature = true; modPowerElectronicsDisChargeLCRetryLastTick = HAL_GetTick(); modPowerElectronicsPackStateHandle->faultState = FAULT_CODE_DISCHARGE_OVER_TEMP_CELLS; } - if(modPowerElectronicsPackStateHandle->tempBatteryLow <= modPowerElectronicsGeneralConfigHandle->allowedTempBattDischargingMin){ + if (modPowerElectronicsPackStateHandle->tempBatteryLow <= minTempDisChargeThreshold) + { modPowerElectronicsPackStateHandle->disChargeLCAllowed = false; + modPowerElectronicsPackStateHandle->disChargeOverMinTemperature = true; + modPowerElectronicsPackStateHandle->disChargeOverMaxTemperature = false; modPowerElectronicsDisChargeLCRetryLastTick = HAL_GetTick(); modPowerElectronicsPackStateHandle->faultState = FAULT_CODE_DISCHARGE_UNDER_TEMP_CELLS; } + //Charge disable - if(modPowerElectronicsPackStateHandle->cellVoltageHigh >= modPowerElectronicsGeneralConfigHandle->cellSoftOverVoltage) { + if (modPowerElectronicsPackStateHandle->cellVoltageHigh >= modPowerElectronicsGeneralConfigHandle->cellSoftOverVoltage) + { modPowerElectronicsPackStateHandle->chargeAllowed = false; modPowerElectronicsChargeRetryLastTick = HAL_GetTick(); modPowerElectronicsPackStateHandle->faultState = FAULT_CODE_CELL_SOFT_OVER_VOLTAGE; } + + const float minTempChargeThreshold = modPowerElectronicsPackStateHandle->chargeOverMinTemperature ? + modPowerElectronicsGeneralConfigHandle->allowedTempBattChargingMin + 10 : + modPowerElectronicsGeneralConfigHandle->allowedTempBattChargingMin; + + const float maxTempChargeThreshold = modPowerElectronicsPackStateHandle->chargeOverMaxTemperature ? + modPowerElectronicsGeneralConfigHandle->allowedTempBattChargingMax - 10 : + modPowerElectronicsGeneralConfigHandle->allowedTempBattChargingMax; - if( modPowerElectronicsPackStateHandle->tempBatteryHigh >= modPowerElectronicsGeneralConfigHandle->allowedTempBattChargingMax) { + if (modPowerElectronicsPackStateHandle->tempBatteryHigh >= maxTempChargeThreshold) + { modPowerElectronicsPackStateHandle->chargeAllowed = false; + modPowerElectronicsPackStateHandle->chargeOverMinTemperature = false; + modPowerElectronicsPackStateHandle->chargeOverMaxTemperature = true; modPowerElectronicsChargeRetryLastTick = HAL_GetTick(); modPowerElectronicsPackStateHandle->faultState = FAULT_CODE_CHARGE_OVER_TEMP_CELLS; } - if(modPowerElectronicsPackStateHandle->tempBatteryLow <= modPowerElectronicsGeneralConfigHandle->allowedTempBattChargingMin) { + if (modPowerElectronicsPackStateHandle->tempBatteryLow <= minTempChargeThreshold) + { modPowerElectronicsPackStateHandle->chargeAllowed = false; + modPowerElectronicsPackStateHandle->chargeOverMinTemperature = true; + modPowerElectronicsPackStateHandle->chargeOverMaxTemperature = false; modPowerElectronicsChargeRetryLastTick = HAL_GetTick(); modPowerElectronicsPackStateHandle->faultState = FAULT_CODE_CHARGE_UNDER_TEMP_CELLS; } //Enable discharge - if(modPowerElectronicsPackStateHandle->cellVoltageLow >= (modPowerElectronicsGeneralConfigHandle->cellLCSoftUnderVoltage + modPowerElectronicsGeneralConfigHandle->hysteresisDischarge) && modPowerElectronicsPackStateHandle->tempBatteryHigh <= modPowerElectronicsGeneralConfigHandle->allowedTempBattDischargingMax && modPowerElectronicsPackStateHandle->tempBatteryLow >= modPowerElectronicsGeneralConfigHandle->allowedTempBattDischargingMin) { - if(modDelayTick1ms(&modPowerElectronicsDisChargeLCRetryLastTick,modPowerElectronicsGeneralConfigHandle->timeoutDischargeRetry)){ + if (modPowerElectronicsPackStateHandle->cellVoltageLow >= (modPowerElectronicsGeneralConfigHandle->cellLCSoftUnderVoltage + modPowerElectronicsGeneralConfigHandle->hysteresisDischarge) && + modPowerElectronicsPackStateHandle->tempBatteryHigh <= maxTempDisChargeThreshold && + modPowerElectronicsPackStateHandle->tempBatteryLow >= minTempDisChargeThreshold) + { + if (modDelayTick1ms(&modPowerElectronicsDisChargeLCRetryLastTick, modPowerElectronicsGeneralConfigHandle->timeoutDischargeRetry)) + { modPowerElectronicsPackStateHandle->disChargeLCAllowed = true; + modPowerElectronicsPackStateHandle->disChargeOverMinTemperature = false; + modPowerElectronicsPackStateHandle->disChargeOverMaxTemperature = false; modPowerElectronicsPackStateHandle->faultState = FAULT_CODE_NONE; - } + } } + //Enable charge - if(modPowerElectronicsPackStateHandle->cellVoltageHigh <= (modPowerElectronicsGeneralConfigHandle->cellSoftOverVoltage - modPowerElectronicsGeneralConfigHandle->hysteresisCharge) && modPowerElectronicsPackStateHandle->tempBatteryHigh <= modPowerElectronicsGeneralConfigHandle->allowedTempBattChargingMax && modPowerElectronicsPackStateHandle->tempBatteryLow >= modPowerElectronicsGeneralConfigHandle->allowedTempBattChargingMin) { - if(modDelayTick1ms(&modPowerElectronicsChargeRetryLastTick,modPowerElectronicsGeneralConfigHandle->timeoutChargeRetry)){ + if (modPowerElectronicsPackStateHandle->cellVoltageHigh <= (modPowerElectronicsGeneralConfigHandle->cellSoftOverVoltage - modPowerElectronicsGeneralConfigHandle->hysteresisCharge) && + modPowerElectronicsPackStateHandle->tempBatteryHigh <= maxTempChargeThreshold && + modPowerElectronicsPackStateHandle->tempBatteryLow >= minTempChargeThreshold) + { + if (modDelayTick1ms(&modPowerElectronicsChargeRetryLastTick, modPowerElectronicsGeneralConfigHandle->timeoutChargeRetry)) + { modPowerElectronicsPackStateHandle->chargeAllowed = true; + modPowerElectronicsPackStateHandle->chargeOverMinTemperature = false; + modPowerElectronicsPackStateHandle->chargeOverMaxTemperature = false; modPowerElectronicsPackStateHandle->faultState = FAULT_CODE_NONE; } } //Handle cooling - if(modPowerElectronicsPackStateHandle->tempBatteryHigh <= modPowerElectronicsGeneralConfigHandle->allowedTempBattCoolingMax && modPowerElectronicsPackStateHandle->tempBatteryLow >= modPowerElectronicsGeneralConfigHandle->allowedTempBattCoolingMin){ + if (modPowerElectronicsPackStateHandle->tempBatteryHigh <= modPowerElectronicsGeneralConfigHandle->allowedTempBattCoolingMax && + modPowerElectronicsPackStateHandle->tempBatteryLow >= modPowerElectronicsGeneralConfigHandle->allowedTempBattCoolingMin) + { modPowerElectronicsPackStateHandle->coolingAllowed = false; - }else{ + } + else + { modPowerElectronicsPackStateHandle->coolingAllowed = true; }; - } // Handle hard cell voltage limits - if(modPowerElectronicsVoltageSenseError || modPowerElectronicsPackStateHandle->cellVoltageHigh > modPowerElectronicsGeneralConfigHandle-> cellHardOverVoltage || modPowerElectronicsPackStateHandle->cellVoltageLow < modPowerElectronicsGeneralConfigHandle-> cellHardUnderVoltage || (modPowerElectronicsPackStateHandle->packVoltage > modPowerElectronicsGeneralConfigHandle->noOfCellsSeries*modPowerElectronicsGeneralConfigHandle->cellHardOverVoltage)) { - if(modPowerElectronicsUnderAndOverVoltageErrorCount++ > modPowerElectronicsGeneralConfigHandle->maxUnderAndOverVoltageErrorCount){ + if (modPowerElectronicsVoltageSenseError || + modPowerElectronicsPackStateHandle->cellVoltageHigh > modPowerElectronicsGeneralConfigHandle-> cellHardOverVoltage || + modPowerElectronicsPackStateHandle->cellVoltageLow < modPowerElectronicsGeneralConfigHandle-> cellHardUnderVoltage || + modPowerElectronicsPackStateHandle->packVoltage > modPowerElectronicsGeneralConfigHandle->noOfCellsSeries * modPowerElectronicsGeneralConfigHandle->cellHardOverVoltage) + { + if (modPowerElectronicsUnderAndOverVoltageErrorCount++ > modPowerElectronicsGeneralConfigHandle->maxUnderAndOverVoltageErrorCount) + { modPowerElectronicsPackStateHandle->packOperationalCellState = PACK_STATE_ERROR_HARD_CELLVOLTAGE; modPowerElectronicsPackStateHandle->faultState = FAULT_CODE_MAX_UVP_OVP_ERRORS; } modPowerElectronicsPackStateHandle->disChargeLCAllowed = false; modPowerElectronicsPackStateHandle->chargeAllowed = false; - }else + } + else + { modPowerElectronicsUnderAndOverVoltageErrorCount = 0; + } - // Handle temperature limits - if(modPowerElectronicsPackStateHandle->tempBatteryHigh > (modPowerElectronicsGeneralConfigHandle->allowedTempBattDischargingMax + 10.0f) || modPowerElectronicsPackStateHandle->tempBatteryLow < (modPowerElectronicsGeneralConfigHandle->allowedTempBattDischargingMin - 10.0f)) { - if(modPowerElectronicsUnderAndOverTemperatureErrorCount++ > modPowerElectronicsGeneralConfigHandle->maxUnderAndOverTemperatureErrorCount){ + // Handle temperature limits + if (modPowerElectronicsPackStateHandle->tempBatteryHigh > (modPowerElectronicsGeneralConfigHandle->allowedTempBattDischargingMax + 10.0f) || + modPowerElectronicsPackStateHandle->tempBatteryLow < (modPowerElectronicsGeneralConfigHandle->allowedTempBattDischargingMin - 10.0f)) + { + if(modPowerElectronicsUnderAndOverTemperatureErrorCount++ > modPowerElectronicsGeneralConfigHandle->maxUnderAndOverTemperatureErrorCount) + { modPowerElectronicsPackStateHandle->packOperationalCellState = PACK_STATE_ERROR_TEMPERATURE; modPowerElectronicsPackStateHandle->faultState = FAULT_CODE_MAX_UVT_OVT_ERRORS; } modPowerElectronicsPackStateHandle->disChargeLCAllowed = false; modPowerElectronicsPackStateHandle->chargeAllowed = false; - }else + } + else + { modPowerElectronicsUnderAndOverTemperatureErrorCount = 0; + } // update outputs directly if needed - if((lastChargeAllowed != modPowerElectronicsPackStateHandle->chargeAllowed) || (lastdisChargeLCAllowed != modPowerElectronicsPackStateHandle->disChargeLCAllowed)) { + if (lastChargeAllowed != modPowerElectronicsPackStateHandle->chargeAllowed || + lastdisChargeLCAllowed != modPowerElectronicsPackStateHandle->disChargeLCAllowed) + { lastChargeAllowed = modPowerElectronicsPackStateHandle->chargeAllowed; lastdisChargeLCAllowed = modPowerElectronicsPackStateHandle->disChargeLCAllowed; modPowerElectronicsUpdateSwitches();