diff --git a/Software/src/battery/BYD-ATTO-3-BATTERY.cpp b/Software/src/battery/BYD-ATTO-3-BATTERY.cpp index ba28fb2e..8ac3ed95 100644 --- a/Software/src/battery/BYD-ATTO-3-BATTERY.cpp +++ b/Software/src/battery/BYD-ATTO-3-BATTERY.cpp @@ -12,9 +12,7 @@ - Figure out which CAN messages need to be sent towards the battery to keep it alive -Maybe already enough with 0x12D and 0x411? - Map all values from battery CAN messages - -SOC% still not found (Lets take it from PID poll) - -Voltage still not found (Lets take it from PID poll) - -Rest is optional and can be added later + -SOC% still not found (Lets take it from PID poll, not working right yet) */ /* Do not change code below unless you are sure what you are doing */ @@ -38,6 +36,8 @@ static int16_t BMS_current = 0; static int16_t BMS_lowest_cell_temperature = 0; static int16_t BMS_highest_cell_temperature = 0; static int16_t BMS_average_cell_temperature = 0; +static uint16_t BMS_lowest_cell_voltage_mV = 3300; +static uint16_t BMS_highest_cell_voltage_mV = 3300; #define POLL_FOR_BATTERY_SOC 0x05 #define POLL_FOR_BATTERY_VOLTAGE 0x08 @@ -45,6 +45,8 @@ static int16_t BMS_average_cell_temperature = 0; #define POLL_FOR_LOWEST_TEMP_CELL 0x2f #define POLL_FOR_HIGHEST_TEMP_CELL 0x31 #define POLL_FOR_BATTERY_PACK_AVG_TEMP 0x32 +#define POLL_FOR_BATTERY_CELL_MV_MAX 0x2D +#define POLL_FOR_BATTERY_CELL_MV_MAX 0x2B #define UNKNOWN_POLL_1 0xFC CAN_frame_t ATTO_3_12D = {.FIR = {.B = @@ -73,11 +75,11 @@ CAN_frame_t ATTO_3_7E7_POLL = { void update_values_battery() { //This function maps all the values fetched via CAN to the correct parameters used for modbus - datalayer.battery.status.real_soc = BMS_SOC * 100; + datalayer.battery.status.real_soc = BMS_SOC * 100; //TODO: This is not yet found! datalayer.battery.status.voltage_dV = BMS_voltage * 10; - datalayer.battery.status.current_dA = BMS_current; //TODO: Signed right way? + datalayer.battery.status.current_dA = BMS_current; datalayer.battery.status.remaining_capacity_Wh = static_cast( (static_cast(datalayer.battery.status.real_soc) / 10000) * datalayer.battery.info.total_capacity_Wh); @@ -86,7 +88,11 @@ void update_values_battery() { //This function maps all the values fetched via datalayer.battery.status.max_charge_power_W = 5000; - datalayer.battery.status.active_power_W; //TODO: Map! + datalayer.battery.status.active_power_W = (datalayer.battery.status.current_dA * (datalayer.battery.status.voltage_dV / 100)); + + datalayer.battery.status.cell_max_voltage_mV = BMS_highest_cell_voltage_mV; + + datalayer.battery.status.cell_min_voltage_mV = BMS_lowest_cell_voltage_mV; // Initialize min and max variables calc_min_temperature = daughterboard_temperatures[0]; @@ -205,10 +211,10 @@ void receive_can_battery(CAN_frame_t rx_frame) { ESP32Can.CANWriteFrame(&ATTO_3_7E7_POLL); switch (ATTO_3_7E7_POLL.data.u8[3]) { - case POLL_FOR_BATTERY_SOC: - ATTO_3_7E7_POLL.data.u8[3] = POLL_FOR_BATTERY_VOLTAGE; - break; case POLL_FOR_BATTERY_VOLTAGE: + ATTO_3_7E7_POLL.data.u8[3] = POLL_FOR_BATTERY_SOC; + break; + case POLL_FOR_BATTERY_SOC: ATTO_3_7E7_POLL.data.u8[3] = POLL_FOR_BATTERY_CURRENT; break; case POLL_FOR_BATTERY_CURRENT: @@ -221,22 +227,28 @@ void receive_can_battery(CAN_frame_t rx_frame) { ATTO_3_7E7_POLL.data.u8[3] = POLL_FOR_BATTERY_PACK_AVG_TEMP; break; case POLL_FOR_BATTERY_PACK_AVG_TEMP: - ATTO_3_7E7_POLL.data.u8[3] = POLL_FOR_BATTERY_SOC; + ATTO_3_7E7_POLL.data.u8[3] = POLL_FOR_BATTERY_CELL_MV_MAX; break; - default: //Something went wrong with logic, request SOC - ATTO_3_7E7_POLL.data.u8[3] = POLL_FOR_BATTERY_SOC; + case POLL_FOR_BATTERY_CELL_MV_MAX: + ATTO_3_7E7_POLL.data.u8[3] = POLL_FOR_BATTERY_CELL_MV_MIN; + break; + case POLL_FOR_BATTERY_CELL_MV_MIN: + ATTO_3_7E7_POLL.data.u8[3] = POLL_FOR_BATTERY_VOLTAGE; + break; + default: //Something went wrong with logic, request voltage + ATTO_3_7E7_POLL.data.u8[3] = POLL_FOR_BATTERY_VOLTAGE; break; } break; case 0x7EF: //OBD2 PID reply from battery switch (rx_frame.data.u8[3]) { - case POLL_FOR_BATTERY_SOC: - BMS_SOC = rx_frame.data.u8[4]; - break; case POLL_FOR_BATTERY_VOLTAGE: BMS_voltage = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[4]; break; + case POLL_FOR_BATTERY_SOC: + BMS_SOC = rx_frame.data.u8[4]; + break; case POLL_FOR_BATTERY_CURRENT: BMS_current = ((rx_frame.data.u8[5] << 8) | rx_frame.data.u8[4]) - 5000; break; @@ -249,6 +261,12 @@ void receive_can_battery(CAN_frame_t rx_frame) { case POLL_FOR_BATTERY_PACK_AVG_TEMP: BMS_average_cell_temperature = (rx_frame.data.u8[4] - 40); break; + case POLL_FOR_BATTERY_CELL_MV_MAX: + BMS_highest_cell_voltage_mV = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[4]; + break; + case POLL_FOR_BATTERY_CELL_MV_MIN: + BMS_lowest_cell_voltage_mV = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[4]; + break; default: //Unrecognized reply break; }