Added temperature hysteresis for charge and discharge. Added separate command for fault state
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user