From 70232020b92a701d000ed4de9ebcefd4432a75d3 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 16 Jul 2023 21:32:03 +0300 Subject: [PATCH 1/4] Fix temperature scaling --- Software/TESLA-MODEL-3-BATTERY.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Software/TESLA-MODEL-3-BATTERY.cpp b/Software/TESLA-MODEL-3-BATTERY.cpp index d704a2f5..b67f3083 100644 --- a/Software/TESLA-MODEL-3-BATTERY.cpp +++ b/Software/TESLA-MODEL-3-BATTERY.cpp @@ -88,8 +88,10 @@ void update_values_tesla_model_3_battery() stat_batt_power = (volts * amps); //TODO, check if scaling is OK + min_temp = (min_temp * 10); temperature_min = convert2unsignedint16(min_temp); + max_temp = (max_temp * 10); temperature_max = convert2unsignedint16(max_temp); /* Check if the BMS is still sending CAN messages. If we go 60s without messages we raise an error*/ From 3f3cf70938409a16b309a63f9809777fdb720fda Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 16 Jul 2023 23:51:21 +0300 Subject: [PATCH 2/4] Remove calculated SOC, add real SOC --- Software/TESLA-MODEL-3-BATTERY.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/Software/TESLA-MODEL-3-BATTERY.cpp b/Software/TESLA-MODEL-3-BATTERY.cpp index b67f3083..68626fe3 100644 --- a/Software/TESLA-MODEL-3-BATTERY.cpp +++ b/Software/TESLA-MODEL-3-BATTERY.cpp @@ -41,6 +41,10 @@ uint16_t max_voltage = 0; uint16_t high_voltage = 0; uint16_t low_voltage = 0; uint16_t output_current = 0; +uint16_t soc_min = 0; +uint16_t soc_max = 0; +uint16_t soc_vi = 0; +uint16_t soc_ave = 0; uint8_t contactor = 0; //State of contactor uint8_t hvil_status = 0; uint8_t packContNegativeState = 0; @@ -59,16 +63,16 @@ void update_values_tesla_model_3_battery() StateOfHealth = 9900; //Hardcoded to 99%SOH //Calculate the SOC% value to send to Fronius - calculated_soc = MIN_SOC + (MAX_SOC - MIN_SOC) * (calculated_soc - MINPERCENTAGE) / (MAXPERCENTAGE - MINPERCENTAGE); - if (calculated_soc < 0) + soc_vi = MIN_SOC + (MAX_SOC - MIN_SOC) * (soc_vi - MINPERCENTAGE) / (MAXPERCENTAGE - MINPERCENTAGE); + if (soc_vi < 0) { //We are in the real SOC% range of 0-20%, always set SOC sent to Fronius as 0% - calculated_soc = 0; + soc_vi = 0; } - if (calculated_soc > 1000) + if (soc_vi > 1000) { //We are in the real SOC% range of 80-100%, always set SOC sent to Fronius as 100% - calculated_soc = 1000; + soc_vi = 1000; } - SOC = (calculated_soc * 10); //increase SOC range from 0-100.0 -> 100.00 + SOC = (soc_vi * 10); //increase SOC range from 0-100.0 -> 100.00 battery_voltage = (volts*10); //One more decimal needed (370 -> 3700) @@ -274,6 +278,12 @@ void receive_can_tesla_model_3_battery(CAN_frame_t rx_frame) high_voltage = (((rx_frame.data.u8[2] << 6) | ((rx_frame.data.u8[1] & 0xFC) >> 2))) * 0.146484; output_current = (((rx_frame.data.u8[4] & 0x0F) << 8) | rx_frame.data.u8[3]) / 100; break; + case 0x292: + soc_min = (((rx_frame.data.u8[1] & 0x03) << 8) | rx_frame.data.u8[0]); + soc_vi = (((rx_frame.data.u8[2] & 0x0F) << 6) | ((rx_frame.data.u8[1] & 0xFC) >> 2)); + soc_max = (((rx_frame.data.u8[3] & 0x3F) << 4) | ((rx_frame.data.u8[2] & 0xF0) >> 4)); + soc_ave = ((rx_frame.data.u8[4] << 2) | ((rx_frame.data.u8[3] & 0xC0) >> 6)); + break; default: break; } From 1817dacde12ccf2d33dbe9c23bf580b0eed2a558 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 16 Jul 2023 23:56:13 +0300 Subject: [PATCH 3/4] Add debug log for SOC --- Software/TESLA-MODEL-3-BATTERY.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Software/TESLA-MODEL-3-BATTERY.cpp b/Software/TESLA-MODEL-3-BATTERY.cpp index 68626fe3..2727f08f 100644 --- a/Software/TESLA-MODEL-3-BATTERY.cpp +++ b/Software/TESLA-MODEL-3-BATTERY.cpp @@ -180,6 +180,15 @@ void update_values_tesla_model_3_battery() Serial.print(low_voltage); Serial.print("V, Current Output:"); Serial.println(output_current); + + Serial.print("Min SOC: "); + Serial.print(soc_min); + Serial.print(", Max SOC: "); + Serial.print(soc_max); + Serial.print(", Avg SOC: "); + Serial.print(soc_ave); + Serial.print(", Vi SOC: "); + Serial.println(soc_vi); } } @@ -198,7 +207,7 @@ void receive_can_tesla_model_3_battery(CAN_frame_t rx_frame) ideal_energy_remaining = (((rx_frame.data.u8[5] & 0x0F) << 7) | ((rx_frame.data.u8[4] & 0xFE) >> 1)) * 0.1; //Example 311 * 0.1 = 31.1kWh energy_to_charge_complete = (((rx_frame.data.u8[6] & 0x7F) << 4) | ((rx_frame.data.u8[5] & 0xF0) >> 4)) * 0.1; //Example 147 * 0.1 = 14.7kWh energy_buffer = (((rx_frame.data.u8[7] & 0x7F) << 1) | ((rx_frame.data.u8[6] & 0x80) >> 7)) * 0.1; //Example 1 * 0.1 = 0 - full_charge_complete = (rx_frame.data.u8[7] & 0x80); + full_charge_complete = ((rx_frame.data.u8[7] & 0x80) >> 7); if(nominal_full_pack_energy > 0) { //Avoid division by 0 From 4da17fefb98e3b732150becbd4e08dd128fa242e Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 17 Jul 2023 00:24:28 +0300 Subject: [PATCH 4/4] Fix charge/discharge limits --- Software/TESLA-MODEL-3-BATTERY.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Software/TESLA-MODEL-3-BATTERY.cpp b/Software/TESLA-MODEL-3-BATTERY.cpp index 2727f08f..acc86a69 100644 --- a/Software/TESLA-MODEL-3-BATTERY.cpp +++ b/Software/TESLA-MODEL-3-BATTERY.cpp @@ -15,6 +15,8 @@ CAN_frame_t TESLA_221_1 = {.FIR = {.B = {.DLC = 8,.FF = CAN_frame_std,}},.MsgID CAN_frame_t TESLA_221_2 = {.FIR = {.B = {.DLC = 8,.FF = CAN_frame_std,}},.MsgID = 0x221,.data = {0x61, 0x15, 0x01, 0x00, 0x00, 0x00, 0x20, 0xBA}}; uint8_t alternate221 = 0; +uint32_t total_discharge = 0; +uint32_t total_charge = 0; uint16_t volts = 0; // V int16_t amps = 0; // A uint16_t raw_amps = 0; // A @@ -86,9 +88,9 @@ void update_values_tesla_model_3_battery() remaining_capacity_Wh = (expected_energy_remaining * 100); //Scale up 60.3kWh -> 60300Wh - max_target_discharge_power; + max_target_discharge_power = max_discharge_current; - max_target_charge_power; + max_target_charge_power = max_charge_current; stat_batt_power = (volts * amps); //TODO, check if scaling is OK @@ -148,7 +150,7 @@ void update_values_tesla_model_3_battery() Serial.print(max_temp); Serial.print(", Min temp: "); Serial.print(max_temp); - Serial.print(", Nominal full energy: "); + Serial.print(", Nominal full energy (XX.XkWh): "); Serial.print(nominal_full_pack_energy); Serial.print(", Nominal energy remain: "); Serial.print(nominal_energy_remaining); @@ -254,7 +256,9 @@ void receive_can_tesla_model_3_battery(CAN_frame_t rx_frame) break; case 0x3D2: - // total charge/discharge kwh + // total charge/discharge kwh + total_discharge = ((rx_frame.data.u8[3] << 24) | (rx_frame.data.u8[2] << 16) | (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[0]) * 0.001; + total_charge = ((rx_frame.data.u8[7] << 24) | (rx_frame.data.u8[6] << 16) | (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[4]) * 0.001; break; case 0x332: //min/max hist values