mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-06 03:50:13 +02:00
Add all 108 cellvoltages
This commit is contained in:
parent
a6adefdf3d
commit
285d2798e1
1 changed files with 136 additions and 10 deletions
|
@ -1,5 +1,6 @@
|
||||||
#include "../include.h"
|
#include "../include.h"
|
||||||
#ifdef ECMP_BATTERY
|
#ifdef ECMP_BATTERY
|
||||||
|
#include <algorithm> // For std::min and std::max
|
||||||
#include "../datalayer/datalayer.h"
|
#include "../datalayer/datalayer.h"
|
||||||
#include "../devboard/utils/events.h"
|
#include "../devboard/utils/events.h"
|
||||||
#include "ECMP-BATTERY.h"
|
#include "ECMP-BATTERY.h"
|
||||||
|
@ -16,6 +17,7 @@ CAN_frame ECMP_XXX = {.FD = false,
|
||||||
|
|
||||||
static uint16_t battery_voltage = 37000;
|
static uint16_t battery_voltage = 37000;
|
||||||
static uint16_t battery_soc = 0;
|
static uint16_t battery_soc = 0;
|
||||||
|
static uint16_t cellvoltages[108];
|
||||||
|
|
||||||
void update_values_battery() {
|
void update_values_battery() {
|
||||||
|
|
||||||
|
@ -34,17 +36,29 @@ void update_values_battery() {
|
||||||
|
|
||||||
datalayer.battery.status.max_discharge_power_W;
|
datalayer.battery.status.max_discharge_power_W;
|
||||||
|
|
||||||
datalayer.battery.status.cell_max_voltage_mV;
|
|
||||||
|
|
||||||
datalayer.battery.status.cell_min_voltage_mV;
|
|
||||||
|
|
||||||
datalayer.battery.status.temperature_min_dC;
|
datalayer.battery.status.temperature_min_dC;
|
||||||
|
|
||||||
datalayer.battery.status.temperature_max_dC;
|
datalayer.battery.status.temperature_max_dC;
|
||||||
|
|
||||||
datalayer.battery.info.max_design_voltage_dV;
|
// Initialize min and max, lets find which cells are min and max!
|
||||||
|
uint16_t min_cell_mv_value = std::numeric_limits<uint16_t>::max();
|
||||||
|
uint16_t max_cell_mv_value = 0;
|
||||||
|
// Loop to find the min and max while ignoring zero values
|
||||||
|
for (uint8_t i = 0; i < datalayer.battery.info.number_of_cells; ++i) {
|
||||||
|
uint16_t voltage_mV = datalayer.battery.status.cell_voltages_mV[i];
|
||||||
|
if (voltage_mV != 0) { // Skip unread values (0)
|
||||||
|
min_cell_mv_value = std::min(min_cell_mv_value, voltage_mV);
|
||||||
|
max_cell_mv_value = std::max(max_cell_mv_value, voltage_mV);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If all array values are 0, reset min/max to 3700
|
||||||
|
if (min_cell_mv_value == std::numeric_limits<uint16_t>::max()) {
|
||||||
|
min_cell_mv_value = 3700;
|
||||||
|
max_cell_mv_value = 3700;
|
||||||
|
}
|
||||||
|
|
||||||
datalayer.battery.info.min_design_voltage_dV;
|
datalayer.battery.status.cell_min_voltage_mV = min_cell_mv_value;
|
||||||
|
datalayer.battery.status.cell_max_voltage_mV = max_cell_mv_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void receive_can_battery(CAN_frame rx_frame) {
|
void receive_can_battery(CAN_frame rx_frame) {
|
||||||
|
@ -81,14 +95,30 @@ void receive_can_battery(CAN_frame rx_frame) {
|
||||||
case 0x6D2:
|
case 0x6D2:
|
||||||
break;
|
break;
|
||||||
case 0x6D3:
|
case 0x6D3:
|
||||||
|
cellvoltages[0] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[1] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[2] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[3] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6D4:
|
case 0x6D4:
|
||||||
|
cellvoltages[4] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[5] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[6] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[7] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6E0:
|
case 0x6E0:
|
||||||
break;
|
break;
|
||||||
case 0x6E1:
|
case 0x6E1:
|
||||||
|
cellvoltages[8] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[9] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[10] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[11] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6E2:
|
case 0x6E2:
|
||||||
|
cellvoltages[12] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[13] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[14] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[15] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6E3:
|
case 0x6E3:
|
||||||
break;
|
break;
|
||||||
|
@ -99,50 +129,146 @@ void receive_can_battery(CAN_frame rx_frame) {
|
||||||
case 0x6E6:
|
case 0x6E6:
|
||||||
break;
|
break;
|
||||||
case 0x6E7:
|
case 0x6E7:
|
||||||
|
cellvoltages[16] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[17] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[18] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[19] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6E8:
|
case 0x6E8:
|
||||||
|
cellvoltages[20] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[21] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[22] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[23] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6E9:
|
case 0x6E9:
|
||||||
|
cellvoltages[24] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[25] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[26] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[27] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6EB:
|
case 0x6EB:
|
||||||
|
cellvoltages[28] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[29] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[30] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[31] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
|
break;
|
||||||
|
case 0x6EC:
|
||||||
|
//Not available on e-C4
|
||||||
break;
|
break;
|
||||||
case 0x6ED:
|
case 0x6ED:
|
||||||
|
cellvoltages[32] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[33] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[34] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[35] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6EE:
|
case 0x6EE:
|
||||||
|
cellvoltages[36] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[37] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[38] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[39] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6EF:
|
case 0x6EF:
|
||||||
|
cellvoltages[40] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[41] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[42] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[43] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6F0:
|
case 0x6F0:
|
||||||
|
cellvoltages[44] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[45] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[46] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[47] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6F1:
|
case 0x6F1:
|
||||||
|
cellvoltages[48] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[49] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[50] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[51] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6F2:
|
case 0x6F2:
|
||||||
|
cellvoltages[52] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[53] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[54] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[55] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6F3:
|
case 0x6F3:
|
||||||
|
cellvoltages[56] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[57] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[58] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[59] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6F4:
|
case 0x6F4:
|
||||||
|
cellvoltages[60] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[61] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[62] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[63] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6F5:
|
case 0x6F5:
|
||||||
|
cellvoltages[64] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[65] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[66] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[67] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6F6:
|
case 0x6F6:
|
||||||
|
cellvoltages[68] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[69] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[70] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[71] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6F7:
|
case 0x6F7:
|
||||||
|
cellvoltages[72] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[73] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[74] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[75] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6F8:
|
case 0x6F8:
|
||||||
|
cellvoltages[76] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[77] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[78] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[79] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6F9:
|
case 0x6F9:
|
||||||
|
cellvoltages[80] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[81] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[82] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[83] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6FA:
|
case 0x6FA:
|
||||||
|
cellvoltages[84] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[85] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[86] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[87] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6FB:
|
case 0x6FB:
|
||||||
|
cellvoltages[88] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[89] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[90] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[91] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6FC:
|
case 0x6FC:
|
||||||
|
cellvoltages[92] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[93] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[94] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[95] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6FD:
|
case 0x6FD:
|
||||||
|
cellvoltages[96] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[97] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[98] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[99] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6FE:
|
case 0x6FE:
|
||||||
|
cellvoltages[100] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[101] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[102] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[103] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
break;
|
break;
|
||||||
case 0x6FF:
|
case 0x6FF:
|
||||||
|
cellvoltages[104] = (rx_frame.data.u8[0] << 8) | rx_frame.data.u8[1];
|
||||||
|
cellvoltages[105] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
cellvoltages[106] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
cellvoltages[107] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
|
memcpy(datalayer.battery.status.cell_voltages_mV, cellvoltages, 108 * sizeof(uint16_t));
|
||||||
break;
|
break;
|
||||||
case 0x794:
|
case 0x794:
|
||||||
break;
|
break;
|
||||||
|
@ -161,11 +287,11 @@ void send_can_battery() {
|
||||||
|
|
||||||
void setup_battery(void) { // Performs one time setup at startup
|
void setup_battery(void) { // Performs one time setup at startup
|
||||||
#ifdef DEBUG_VIA_USB
|
#ifdef DEBUG_VIA_USB
|
||||||
Serial.println("PSA battery selected");
|
Serial.println("ECMP battery selected");
|
||||||
#endif
|
#endif
|
||||||
|
datalayer.battery.info.number_of_cells = 108;
|
||||||
datalayer.battery.info.max_design_voltage_dV = 4040; // 404.0V, charging over this is not possible
|
datalayer.battery.info.max_design_voltage_dV = 4546; // 454.6V, charging over this is not possible
|
||||||
datalayer.battery.info.min_design_voltage_dV = 3100; // 310.0V, under this, discharging further is disabled
|
datalayer.battery.info.min_design_voltage_dV = 3210; // 321.0V, under this, discharging further is disabled
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue