From 35f88a8fe281a5f9627a91a623ff62bde603147b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Mon, 31 Mar 2025 20:54:40 +0300 Subject: [PATCH] Add more PID polls --- Software/src/battery/CMFA-EV-BATTERY.cpp | 501 ++++++++++++++++++++++- Software/src/battery/CMFA-EV-BATTERY.h | 115 +++++- 2 files changed, 596 insertions(+), 20 deletions(-) diff --git a/Software/src/battery/CMFA-EV-BATTERY.cpp b/Software/src/battery/CMFA-EV-BATTERY.cpp index 837592ff..344da7f8 100644 --- a/Software/src/battery/CMFA-EV-BATTERY.cpp +++ b/Software/src/battery/CMFA-EV-BATTERY.cpp @@ -40,9 +40,21 @@ CAN_frame CMFA_POLLING_FRAME = {.FD = false, .DLC = 8, .ID = 0x79B, .data = {0x03, 0x22, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00}}; - +static bool end_of_charge = false; +static bool interlock_flag = false; +static uint16_t soc_z = 0; +static uint16_t soc_u = 0; +static uint16_t max_regen_power = 0; +static uint16_t max_discharge_power = 0; +static uint16_t average_temperature = 0; +static uint16_t minimum_temperature = 0; +static uint16_t maximum_temperature = 0; +static uint16_t maximum_charge_power = 0; +static uint16_t SOH_available_power = 0; +static uint16_t SOH_generated_power = 0; static uint32_t average_voltage_of_cells = 270000; static uint16_t highest_cell_voltage_mv = 3700; +static uint16_t lowest_cell_voltage_mv = 3700; static uint16_t lead_acid_voltage = 12000; static uint8_t highest_cell_voltage_number = 0; static uint8_t lowest_cell_voltage_number = 0; @@ -50,8 +62,10 @@ static uint64_t cumulative_energy_when_discharging = 0; static uint64_t cumulative_energy_when_charging = 0; static uint64_t cumulative_energy_in_regen = 0; static uint16_t soh_average = 10000; +static uint16_t cellvoltages_mv[72]; static uint32_t poll_pid = PID_POLL_SOH_AVERAGE; static uint16_t pid_reply = 0; + static uint8_t counter_10ms = 0; static uint8_t content_125[16] = {0x07, 0x0C, 0x01, 0x06, 0x0B, 0x00, 0x05, 0x0A, 0x0F, 0x04, 0x09, 0x0E, 0x03, 0x08, 0x0D, 0x02}; @@ -95,10 +109,13 @@ void update_values_battery() { //This function maps all the values fetched via datalayer.battery.status.temperature_max_dC = (highest_cell_temperature * 10); - datalayer.battery.status.cell_min_voltage_mV = highest_cell_voltage_mv; //Placeholder until we can find minimum + datalayer.battery.status.cell_min_voltage_mV = lowest_cell_voltage_mv; datalayer.battery.status.cell_max_voltage_mV = highest_cell_voltage_mv; + //Map all cell voltages to the global array + memcpy(datalayer.battery.status.cell_voltages_mV, cellvoltages_mv, 72 * sizeof(uint16_t)); + if (lead_acid_voltage < 11000) { //11.000V set_event(EVENT_12V_LOW, lead_acid_voltage); } @@ -167,6 +184,12 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) { pid_reply = (rx_frame.data.u8[2] << 8) + rx_frame.data.u8[3]; switch (pid_reply) { + case PID_POLL_SOCZ: + soc_z = (uint16_t)((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]); + break; + case PID_POLL_USOC: + soc_u = (uint16_t)((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]); + break; case PID_POLL_SOH_AVERAGE: soh_average = (uint16_t)((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]); break; @@ -180,12 +203,51 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) { case PID_POLL_CELL_NUMBER_HIGHEST_VOLTAGE: highest_cell_voltage_number = rx_frame.data.u8[4]; break; + case PID_POLL_LOWEST_CELL_VOLTAGE: + lowest_cell_voltage_mv = (uint16_t)((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]); + break; case PID_POLL_CELL_NUMBER_LOWEST_VOLTAGE: lowest_cell_voltage_number = rx_frame.data.u8[4]; break; + case PID_POLL_CURRENT_OFFSET: + //current_offset = + break; + case PID_POLL_INSTANT_CURRENT: + //instant_offset = + break; + case PID_POLL_MAX_REGEN: + max_regen_power = (uint16_t)((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]); + break; + case PID_POLL_MAX_DISCHARGE_POWER: + max_discharge_power = (uint16_t)((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]); + break; case PID_POLL_12V_BATTERY: lead_acid_voltage = (uint16_t)((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]); break; + case PID_POLL_AVERAGE_TEMPERATURE: + average_temperature = (uint16_t)((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]); + break; + case PID_POLL_MIN_TEMPERATURE: + minimum_temperature = (uint16_t)((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]); + break; + case PID_POLL_MAX_TEMPERATURE: + maximum_temperature = (uint16_t)((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]); + break; + case PID_POLL_MAX_CHARGE_POWER: + maximum_charge_power = (uint16_t)((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]); + break; + case PID_POLL_END_OF_CHARGE_FLAG: + end_of_charge = rx_frame.data.u8[4]; + break; + case PID_POLL_INTERLOCK_FLAG: + interlock_flag = rx_frame.data.u8[4]; + break; + case PID_POLL_SOH_AVAILABLE_POWER_CALCULATION: + SOH_available_power = (uint16_t)((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]); + break; + case PID_POLL_SOH_GENERATED_POWER_CALCULATION: + SOH_generated_power = (uint16_t)((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]); + break; case PID_POLL_CUMULATIVE_ENERGY_WHEN_DISCHARGING: cumulative_energy_when_discharging = (uint64_t)((rx_frame.data.u8[4] << 24) | (rx_frame.data.u8[5] << 16) | (rx_frame.data.u8[6] << 8) | (rx_frame.data.u8[7])); @@ -197,6 +259,15 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) { case PID_POLL_CUMULATIVE_ENERGY_IN_REGEN: cumulative_energy_in_regen = (uint64_t)((rx_frame.data.u8[4] << 24) | (rx_frame.data.u8[5] << 16) | (rx_frame.data.u8[6] << 8) | (rx_frame.data.u8[7])); + case PID_POLL_CELL_1: + cellvoltages_mv[0] = (uint16_t)((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]); + break; + case PID_POLL_CELL_2: + cellvoltages_mv[1] = (uint16_t)((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]); + break; + case PID_POLL_CELL_3: + cellvoltages_mv[2] = (uint16_t)((rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]); + break; break; default: break; @@ -251,6 +322,11 @@ void transmit_can_battery() { case PID_POLL_HIGHEST_CELL_VOLTAGE: CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_HIGHEST_CELL_VOLTAGE >> 8); CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_HIGHEST_CELL_VOLTAGE; + poll_pid = PID_POLL_LOWEST_CELL_VOLTAGE; + break; + case PID_POLL_LOWEST_CELL_VOLTAGE: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_LOWEST_CELL_VOLTAGE >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_LOWEST_CELL_VOLTAGE; poll_pid = PID_POLL_CELL_NUMBER_HIGHEST_VOLTAGE; break; case PID_POLL_CELL_NUMBER_HIGHEST_VOLTAGE: @@ -281,9 +357,428 @@ void transmit_can_battery() { case PID_POLL_CUMULATIVE_ENERGY_IN_REGEN: CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CUMULATIVE_ENERGY_IN_REGEN >> 8); CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CUMULATIVE_ENERGY_IN_REGEN; + poll_pid = PID_POLL_SOCZ; + break; + case PID_POLL_SOCZ: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_SOCZ >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_SOCZ; + poll_pid = PID_POLL_USOC; + break; + case PID_POLL_USOC: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_USOC >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_USOC; + poll_pid = PID_POLL_CURRENT_OFFSET; + break; + case PID_POLL_CURRENT_OFFSET: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CURRENT_OFFSET >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CURRENT_OFFSET; + poll_pid = PID_POLL_INSTANT_CURRENT; + break; + case PID_POLL_INSTANT_CURRENT: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_INSTANT_CURRENT >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_INSTANT_CURRENT; + poll_pid = PID_POLL_MAX_REGEN; + break; + case PID_POLL_MAX_REGEN: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_MAX_REGEN >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_MAX_REGEN; + poll_pid = PID_POLL_MAX_DISCHARGE_POWER; + break; + case PID_POLL_MAX_DISCHARGE_POWER: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_MAX_DISCHARGE_POWER >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_MAX_DISCHARGE_POWER; + poll_pid = PID_POLL_MAX_CHARGE_POWER; + break; + case PID_POLL_MAX_CHARGE_POWER: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_MAX_CHARGE_POWER >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_MAX_CHARGE_POWER; + poll_pid = PID_POLL_AVERAGE_TEMPERATURE; + break; + case PID_POLL_AVERAGE_TEMPERATURE: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_AVERAGE_TEMPERATURE >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_AVERAGE_TEMPERATURE; + poll_pid = PID_POLL_MIN_TEMPERATURE; + break; + case PID_POLL_MIN_TEMPERATURE: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_MIN_TEMPERATURE >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_MIN_TEMPERATURE; + poll_pid = PID_POLL_MAX_TEMPERATURE; + break; + case PID_POLL_MAX_TEMPERATURE: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_MAX_TEMPERATURE >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_MAX_TEMPERATURE; + poll_pid = PID_POLL_END_OF_CHARGE_FLAG; + break; + case PID_POLL_END_OF_CHARGE_FLAG: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_END_OF_CHARGE_FLAG >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_END_OF_CHARGE_FLAG; + poll_pid = PID_POLL_INTERLOCK_FLAG; + break; + case PID_POLL_INTERLOCK_FLAG: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_INTERLOCK_FLAG >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_INTERLOCK_FLAG; + poll_pid = PID_POLL_CELL_1; + break; + case PID_POLL_CELL_1: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_1 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_1; + poll_pid = PID_POLL_CELL_2; + break; + case PID_POLL_CELL_2: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_2 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_2; + poll_pid = PID_POLL_CELL_3; + break; + case PID_POLL_CELL_3: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_3 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_3; + poll_pid = PID_POLL_CELL_4; + break; + case PID_POLL_CELL_4: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_4 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_4; + poll_pid = PID_POLL_CELL_5; + break; + case PID_POLL_CELL_5: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_5 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_5; + poll_pid = PID_POLL_CELL_6; + break; + case PID_POLL_CELL_6: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_6 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_6; + poll_pid = PID_POLL_CELL_7; + break; + case PID_POLL_CELL_7: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_7 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_7; + poll_pid = PID_POLL_CELL_8; + break; + case PID_POLL_CELL_8: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_8 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_8; + poll_pid = PID_POLL_CELL_9; + break; + case PID_POLL_CELL_9: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_9 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_9; + poll_pid = PID_POLL_CELL_10; + break; + case PID_POLL_CELL_10: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_10 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_10; + poll_pid = PID_POLL_CELL_11; + break; + case PID_POLL_CELL_11: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_11 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_11; + poll_pid = PID_POLL_CELL_12; + break; + case PID_POLL_CELL_12: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_12 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_12; + poll_pid = PID_POLL_CELL_13; + break; + case PID_POLL_CELL_13: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_13 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_13; + poll_pid = PID_POLL_CELL_14; + break; + case PID_POLL_CELL_14: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_14 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_14; + poll_pid = PID_POLL_CELL_15; + break; + case PID_POLL_CELL_15: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_15 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_15; + poll_pid = PID_POLL_CELL_16; + break; + case PID_POLL_CELL_16: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_16 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_16; + poll_pid = PID_POLL_CELL_17; + break; + case PID_POLL_CELL_17: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_17 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_17; + poll_pid = PID_POLL_CELL_18; + break; + case PID_POLL_CELL_18: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_18 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_18; + poll_pid = PID_POLL_CELL_19; + break; + case PID_POLL_CELL_19: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_19 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_19; + poll_pid = PID_POLL_CELL_20; + break; + case PID_POLL_CELL_20: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_20 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_20; + poll_pid = PID_POLL_CELL_21; + break; + case PID_POLL_CELL_21: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_21 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_21; + poll_pid = PID_POLL_CELL_22; + break; + case PID_POLL_CELL_22: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_22 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_22; + poll_pid = PID_POLL_CELL_23; + break; + case PID_POLL_CELL_23: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_23 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_23; + poll_pid = PID_POLL_CELL_24; + break; + case PID_POLL_CELL_24: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_24 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_24; + poll_pid = PID_POLL_CELL_25; + break; + case PID_POLL_CELL_25: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_25 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_25; + poll_pid = PID_POLL_CELL_26; + break; + case PID_POLL_CELL_26: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_26 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_26; + poll_pid = PID_POLL_CELL_27; + break; + case PID_POLL_CELL_27: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_27 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_27; + poll_pid = PID_POLL_CELL_28; + break; + case PID_POLL_CELL_28: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_28 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_28; + poll_pid = PID_POLL_CELL_29; + break; + case PID_POLL_CELL_29: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_29 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_29; + poll_pid = PID_POLL_CELL_30; + break; + case PID_POLL_CELL_30: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_30 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_30; + poll_pid = PID_POLL_CELL_31; + break; + case PID_POLL_CELL_31: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_31 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_31; + poll_pid = PID_POLL_CELL_32; + break; + case PID_POLL_CELL_32: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_32 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_32; + poll_pid = PID_POLL_CELL_33; + break; + case PID_POLL_CELL_33: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_33 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_33; + poll_pid = PID_POLL_CELL_34; + break; + case PID_POLL_CELL_34: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_34 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_34; + poll_pid = PID_POLL_CELL_35; + break; + case PID_POLL_CELL_35: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_35 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_35; + poll_pid = PID_POLL_CELL_36; + break; + case PID_POLL_CELL_36: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_36 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_36; + poll_pid = PID_POLL_CELL_37; + break; + case PID_POLL_CELL_37: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_37 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_37; + poll_pid = PID_POLL_CELL_38; + break; + case PID_POLL_CELL_38: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_38 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_38; + poll_pid = PID_POLL_CELL_39; + break; + case PID_POLL_CELL_39: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_39 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_39; + poll_pid = PID_POLL_CELL_40; + break; + case PID_POLL_CELL_40: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_40 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_40; + poll_pid = PID_POLL_CELL_41; + break; + case PID_POLL_CELL_41: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_41 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_41; + poll_pid = PID_POLL_CELL_42; + break; + case PID_POLL_CELL_42: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_42 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_42; + poll_pid = PID_POLL_CELL_43; + break; + case PID_POLL_CELL_43: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_43 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_43; + poll_pid = PID_POLL_CELL_44; + break; + case PID_POLL_CELL_44: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_44 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_44; + poll_pid = PID_POLL_CELL_45; + break; + case PID_POLL_CELL_45: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_45 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_45; + poll_pid = PID_POLL_CELL_46; + break; + case PID_POLL_CELL_46: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_46 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_46; + poll_pid = PID_POLL_CELL_47; + break; + case PID_POLL_CELL_47: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_47 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_47; + poll_pid = PID_POLL_CELL_48; + break; + case PID_POLL_CELL_48: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_48 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_48; + poll_pid = PID_POLL_CELL_49; + break; + case PID_POLL_CELL_49: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_49 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_49; + poll_pid = PID_POLL_CELL_50; + break; + case PID_POLL_CELL_50: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_50 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_50; + poll_pid = PID_POLL_CELL_51; + break; + case PID_POLL_CELL_51: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_51 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_51; + poll_pid = PID_POLL_CELL_52; + break; + case PID_POLL_CELL_52: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_52 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_52; + poll_pid = PID_POLL_CELL_53; + break; + case PID_POLL_CELL_53: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_53 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_53; + poll_pid = PID_POLL_CELL_54; + break; + case PID_POLL_CELL_54: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_54 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_54; + poll_pid = PID_POLL_CELL_55; + break; + case PID_POLL_CELL_55: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_55 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_55; + poll_pid = PID_POLL_CELL_56; + break; + case PID_POLL_CELL_56: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_56 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_56; + poll_pid = PID_POLL_CELL_57; + break; + case PID_POLL_CELL_57: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_57 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_57; + poll_pid = PID_POLL_CELL_58; + break; + case PID_POLL_CELL_58: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_58 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_58; + poll_pid = PID_POLL_CELL_59; + break; + case PID_POLL_CELL_59: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_59 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_59; + poll_pid = PID_POLL_CELL_60; + break; + case PID_POLL_CELL_60: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_60 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_60; + poll_pid = PID_POLL_CELL_61; + break; + case PID_POLL_CELL_61: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_61 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_61; + poll_pid = PID_POLL_CELL_62; + break; + case PID_POLL_CELL_62: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_62 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_62; + poll_pid = PID_POLL_CELL_63; + break; + case PID_POLL_CELL_63: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_63 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_63; + poll_pid = PID_POLL_CELL_64; + break; + case PID_POLL_CELL_64: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_64 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_64; + poll_pid = PID_POLL_CELL_65; + break; + case PID_POLL_CELL_65: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_65 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_65; + poll_pid = PID_POLL_CELL_66; + break; + case PID_POLL_CELL_66: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_66 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_66; + poll_pid = PID_POLL_CELL_67; + break; + case PID_POLL_CELL_67: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_67 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_67; + poll_pid = PID_POLL_CELL_68; + break; + case PID_POLL_CELL_68: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_68 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_68; + poll_pid = PID_POLL_CELL_69; + break; + case PID_POLL_CELL_69: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_69 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_69; + poll_pid = PID_POLL_CELL_70; + break; + case PID_POLL_CELL_70: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_70 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_70; + poll_pid = PID_POLL_CELL_71; + break; + case PID_POLL_CELL_71: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_71 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_71; + poll_pid = PID_POLL_CELL_72; + break; + case PID_POLL_CELL_72: + CMFA_POLLING_FRAME.data.u8[2] = (uint8_t)(PID_POLL_CELL_72 >> 8); + CMFA_POLLING_FRAME.data.u8[3] = (uint8_t)PID_POLL_CELL_72; poll_pid = PID_POLL_SOH_AVERAGE; break; - default: poll_pid = PID_POLL_SOH_AVERAGE; break; } diff --git a/Software/src/battery/CMFA-EV-BATTERY.h b/Software/src/battery/CMFA-EV-BATTERY.h index ec4c2268..7a084ae7 100644 --- a/Software/src/battery/CMFA-EV-BATTERY.h +++ b/Software/src/battery/CMFA-EV-BATTERY.h @@ -9,23 +9,102 @@ #define MAX_CELL_VOLTAGE_MV 4250 //Battery is put into emergency stop if one cell goes over this value #define MIN_CELL_VOLTAGE_MV 2700 //Battery is put into emergency stop if one cell goes below this value -// OBD2 PID polls -/* -#define PID_POLL_UNKNOWN1 0x9001 //122 in log -#define PID_POLL_UNKNOWNX 0x9002 //5531 (Possible SOC candidate) -*/ +// OBD2 PID polls. Some of these have been reverse engineered, but there are many unknown values still +#define PID_POLL_SOCZ 0x9001 //122 in log +#define PID_POLL_USOC 0x9002 //5531 (Possible SOC candidate) #define PID_POLL_SOH_AVERAGE 0x9003 -#define PID_POLL_AVERAGE_VOLTAGE_OF_CELLS 0x9006 //Guaranteed pack voltage -#define PID_POLL_HIGHEST_CELL_VOLTAGE 0x9007 //Best guess, not confirmed -#define PID_POLL_CELL_NUMBER_HIGHEST_VOLTAGE 0x9008 // Cell number with highest voltage -#define PID_POLL_CELL_NUMBER_LOWEST_VOLTAGE 0x900A // Cell number with the lowest voltage -//#define PID_POLL_UNKNOWNX 0x900D -#define PID_POLL_12V_BATTERY 0x9011 //Confirmed 12v lead acid battery +#define PID_POLL_AVERAGE_VOLTAGE_OF_CELLS 0x9006 +#define PID_POLL_HIGHEST_CELL_VOLTAGE 0x9007 +#define PID_POLL_CELL_NUMBER_HIGHEST_VOLTAGE 0x9008 +#define PID_POLL_LOWEST_CELL_VOLTAGE 0x9009 +#define PID_POLL_CELL_NUMBER_LOWEST_VOLTAGE 0x900A +#define PID_POLL_CURRENT_OFFSET 0x900C +#define PID_POLL_INSTANT_CURRENT 0x900D +#define PID_POLL_MAX_REGEN 0x900E +#define PID_POLL_MAX_DISCHARGE_POWER 0x900F +#define PID_POLL_12V_BATTERY 0x9011 +#define PID_POLL_AVERAGE_TEMPERATURE 0x9012 //749 in log +#define PID_POLL_MIN_TEMPERATURE 0x9013 //736 in log +#define PID_POLL_MAX_TEMPERATURE 0x9014 //752 in log +#define PID_POLL_MAX_CHARGE_POWER 0x9018 +#define PID_POLL_END_OF_CHARGE_FLAG 0x9019 +#define PID_POLL_INTERLOCK_FLAG 0x901A +#define PID_POLL_BATTERY_IDENTIFICATION 0x901B // Multi frame message +#define PID_POLL_CELL_1 0x9021 +#define PID_POLL_CELL_2 0x9022 +#define PID_POLL_CELL_3 0x9023 +#define PID_POLL_CELL_4 0x9024 +#define PID_POLL_CELL_5 0x9025 +#define PID_POLL_CELL_6 0x9026 +#define PID_POLL_CELL_7 0x9027 +#define PID_POLL_CELL_8 0x9028 +#define PID_POLL_CELL_9 0x9029 +#define PID_POLL_CELL_10 0x902A +#define PID_POLL_CELL_11 0x902B +#define PID_POLL_CELL_12 0x902C +#define PID_POLL_CELL_13 0x902D +#define PID_POLL_CELL_14 0x902E +#define PID_POLL_CELL_15 0x902F +#define PID_POLL_CELL_16 0x9030 +#define PID_POLL_CELL_17 0x9031 +#define PID_POLL_CELL_18 0x9032 +#define PID_POLL_CELL_19 0x9033 +#define PID_POLL_CELL_20 0x9034 +#define PID_POLL_CELL_21 0x9035 +#define PID_POLL_CELL_22 0x9036 +#define PID_POLL_CELL_23 0x9037 +#define PID_POLL_CELL_24 0x9038 +#define PID_POLL_CELL_25 0x9039 +#define PID_POLL_CELL_26 0x903A +#define PID_POLL_CELL_27 0x903B +#define PID_POLL_CELL_28 0x903C +#define PID_POLL_CELL_29 0x903D +#define PID_POLL_CELL_30 0x903E +#define PID_POLL_CELL_31 0x903F +#define PID_POLL_DIDS_SUPPORTED_IN_RANGE_9041_9060 0x9040 +#define PID_POLL_CELL_32 0x9041 +#define PID_POLL_CELL_33 0x9042 +#define PID_POLL_CELL_34 0x9043 +#define PID_POLL_CELL_35 0x9044 +#define PID_POLL_CELL_36 0x9045 +#define PID_POLL_CELL_37 0x9046 +#define PID_POLL_CELL_38 0x9047 +#define PID_POLL_CELL_39 0x9048 +#define PID_POLL_CELL_40 0x9049 +#define PID_POLL_CELL_41 0x904A +#define PID_POLL_CELL_42 0x904B +#define PID_POLL_CELL_43 0x904C +#define PID_POLL_CELL_44 0x904D +#define PID_POLL_CELL_45 0x904E +#define PID_POLL_CELL_46 0x904F +#define PID_POLL_CELL_47 0x9050 +#define PID_POLL_CELL_48 0x9051 +#define PID_POLL_CELL_49 0x9052 +#define PID_POLL_CELL_50 0x9053 +#define PID_POLL_CELL_51 0x9054 +#define PID_POLL_CELL_52 0x9055 +#define PID_POLL_CELL_53 0x9056 +#define PID_POLL_CELL_54 0x9057 +#define PID_POLL_CELL_55 0x9058 +#define PID_POLL_CELL_56 0x9059 +#define PID_POLL_CELL_57 0x905A +#define PID_POLL_CELL_58 0x905B +#define PID_POLL_CELL_59 0x905C +#define PID_POLL_CELL_60 0x905D +#define PID_POLL_CELL_61 0x905E +#define PID_POLL_CELL_62 0x905F +#define PID_POLL_DIDS_SUPPORTED_IN_RANGE_9061_9080 0x9060 +#define PID_POLL_CELL_63 0x9061 +#define PID_POLL_CELL_64 0x9062 +#define PID_POLL_CELL_65 0x9063 +#define PID_POLL_CELL_66 0x9064 +#define PID_POLL_CELL_67 0x9065 +#define PID_POLL_CELL_68 0x9066 +#define PID_POLL_CELL_69 0x9067 +#define PID_POLL_CELL_70 0x9068 +#define PID_POLL_CELL_71 0x9069 +#define PID_POLL_CELL_72 0x906A /* -#define PID_POLL_UNKNOWNX 0x9012 //749 in log -#define PID_POLL_UNKNOWN3 0x9013 //736 in log -#define PID_POLL_UNKNOWN4 0x9014 //752 in log -#define PID_POLL_UNKNOWN4 0x901B // Multi frame message, lots of values ranging between 0x30 - 0x52 #define PID_POLL_UNKNOWNX 0x912F // Multi frame message, empty #define PID_POLL_UNKNOWNX 0x9129 #define PID_POLL_UNKNOWNX 0x9131 @@ -42,8 +121,10 @@ #define PID_POLL_UNKNOWNX 0x913C #define PID_POLL_UNKNOWN5 0x912F #define PID_POLL_UNKNOWNX 0x91B7 -#define PID_POLL_SOH_AVAILABLE_POWER_CALCULATION 0x91BC // 0-100% -#define PID_POLL_SOH_GENERATED_POWER_CALCULATION 0x91BD // 0-100% +*/ +#define PID_POLL_SOH_AVAILABLE_POWER_CALCULATION 0x91BC // 0-100% +#define PID_POLL_SOH_GENERATED_POWER_CALCULATION 0x91BD // 0-100% +/* #define PID_POLL_UNKNOWNX 0x91C1 #define PID_POLL_UNKNOWNX 0x91CD #define PID_POLL_UNKNOWNX 0x91CF