Discovered charge power PID

This commit is contained in:
Daniel Öster 2025-05-03 00:02:35 +03:00
parent 0c90cb2ce0
commit 2266619592
3 changed files with 14 additions and 14 deletions

View file

@ -42,7 +42,7 @@ static uint16_t BMS_lowest_cell_voltage_mV = 3300;
static uint16_t BMS_highest_cell_voltage_mV = 3300; static uint16_t BMS_highest_cell_voltage_mV = 3300;
static uint32_t BMS_unknown0 = 0; static uint32_t BMS_unknown0 = 0;
static uint32_t BMS_unknown1 = 0; static uint32_t BMS_unknown1 = 0;
static uint16_t BMS_unknown2 = 0; static uint16_t BMS_allowed_charge_power = 0;
static uint16_t BMS_unknown3 = 0; static uint16_t BMS_unknown3 = 0;
static uint16_t BMS_unknown4 = 0; static uint16_t BMS_unknown4 = 0;
static uint16_t BMS_unknown5 = 0; static uint16_t BMS_unknown5 = 0;
@ -85,7 +85,7 @@ static uint16_t battery2_cellvoltages[CELLCOUNT_EXTENDED] = {0};
#define POLL_FOR_BATTERY_CELL_MV_MIN 0x002B #define POLL_FOR_BATTERY_CELL_MV_MIN 0x002B
#define UNKNOWN_POLL_0 0x1FFE //0x64 19 C4 3B #define UNKNOWN_POLL_0 0x1FFE //0x64 19 C4 3B
#define UNKNOWN_POLL_1 0x1FFC //0x72 1F C4 3B #define UNKNOWN_POLL_1 0x1FFC //0x72 1F C4 3B
#define UNKNOWN_POLL_2 0x000A //0x04CF (1231 interesting!) #define POLL_MAX_CHARGE_POWER 0x000A
#define UNKNOWN_POLL_3 0x000B //0x00B1 (177 interesting!) #define UNKNOWN_POLL_3 0x000B //0x00B1 (177 interesting!)
#define UNKNOWN_POLL_4 0x000E //0x0B27 (2855 interesting!) #define UNKNOWN_POLL_4 0x000E //0x0B27 (2855 interesting!)
#define UNKNOWN_POLL_5 0x000F //0x00237B (9083 interesting!) #define UNKNOWN_POLL_5 0x000F //0x00237B (9083 interesting!)
@ -255,7 +255,7 @@ void update_values_battery() { //This function maps all the values fetched via
datalayer.battery.status.max_discharge_power_W = MAXPOWER_DISCHARGE_W; //TODO: Map from CAN later on datalayer.battery.status.max_discharge_power_W = MAXPOWER_DISCHARGE_W; //TODO: Map from CAN later on
datalayer.battery.status.max_charge_power_W = MAXPOWER_CHARGE_W; //TODO: Map from CAN later on datalayer.battery.status.max_charge_power_W = BMS_allowed_charge_power * 10; //Scaling unknown, *10 best guess
datalayer.battery.status.cell_max_voltage_mV = BMS_highest_cell_voltage_mV; datalayer.battery.status.cell_max_voltage_mV = BMS_highest_cell_voltage_mV;
@ -348,7 +348,7 @@ void update_values_battery() { //This function maps all the values fetched via
datalayer_extended.bydAtto3.battery_temperatures[9] = battery_daughterboard_temperatures[9]; datalayer_extended.bydAtto3.battery_temperatures[9] = battery_daughterboard_temperatures[9];
datalayer_extended.bydAtto3.unknown0 = BMS_unknown0; datalayer_extended.bydAtto3.unknown0 = BMS_unknown0;
datalayer_extended.bydAtto3.unknown1 = BMS_unknown1; datalayer_extended.bydAtto3.unknown1 = BMS_unknown1;
datalayer_extended.bydAtto3.unknown2 = BMS_unknown2; datalayer_extended.bydAtto3.chargePower = BMS_allowed_charge_power;
datalayer_extended.bydAtto3.unknown3 = BMS_unknown3; datalayer_extended.bydAtto3.unknown3 = BMS_unknown3;
datalayer_extended.bydAtto3.unknown4 = BMS_unknown4; datalayer_extended.bydAtto3.unknown4 = BMS_unknown4;
datalayer_extended.bydAtto3.unknown5 = BMS_unknown5; datalayer_extended.bydAtto3.unknown5 = BMS_unknown5;
@ -498,8 +498,8 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame) {
BMS_unknown1 = ((rx_frame.data.u8[7] << 24) | (rx_frame.data.u8[6] << 16) | (rx_frame.data.u8[5] << 8) | BMS_unknown1 = ((rx_frame.data.u8[7] << 24) | (rx_frame.data.u8[6] << 16) | (rx_frame.data.u8[5] << 8) |
rx_frame.data.u8[4]); rx_frame.data.u8[4]);
break; break;
case UNKNOWN_POLL_2: case POLL_MAX_CHARGE_POWER:
BMS_unknown2 = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[4]; BMS_allowed_charge_power = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[4];
break; break;
case UNKNOWN_POLL_3: case UNKNOWN_POLL_3:
BMS_unknown3 = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[4]; BMS_unknown3 = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[4];
@ -662,11 +662,11 @@ void transmit_can_battery() {
case UNKNOWN_POLL_1: case UNKNOWN_POLL_1:
ATTO_3_7E7_POLL.data.u8[2] = (uint8_t)((UNKNOWN_POLL_1 & 0xFF00) >> 8); ATTO_3_7E7_POLL.data.u8[2] = (uint8_t)((UNKNOWN_POLL_1 & 0xFF00) >> 8);
ATTO_3_7E7_POLL.data.u8[3] = (uint8_t)(UNKNOWN_POLL_1 & 0x00FF); ATTO_3_7E7_POLL.data.u8[3] = (uint8_t)(UNKNOWN_POLL_1 & 0x00FF);
poll_state = UNKNOWN_POLL_2; poll_state = POLL_MAX_CHARGE_POWER;
break; break;
case UNKNOWN_POLL_2: case POLL_MAX_CHARGE_POWER:
ATTO_3_7E7_POLL.data.u8[2] = (uint8_t)((UNKNOWN_POLL_2 & 0xFF00) >> 8); ATTO_3_7E7_POLL.data.u8[2] = (uint8_t)((POLL_MAX_CHARGE_POWER & 0xFF00) >> 8);
ATTO_3_7E7_POLL.data.u8[3] = (uint8_t)(UNKNOWN_POLL_2 & 0x00FF); ATTO_3_7E7_POLL.data.u8[3] = (uint8_t)(POLL_MAX_CHARGE_POWER & 0x00FF);
poll_state = UNKNOWN_POLL_3; poll_state = UNKNOWN_POLL_3;
break; break;
case UNKNOWN_POLL_3: case UNKNOWN_POLL_3:

View file

@ -187,7 +187,7 @@ typedef struct {
/** unknown values polled */ /** unknown values polled */
uint32_t unknown0 = 0; uint32_t unknown0 = 0;
uint32_t unknown1 = 0; uint32_t unknown1 = 0;
uint16_t unknown2 = 0; uint16_t chargePower = 0;
uint16_t unknown3 = 0; uint16_t unknown3 = 0;
uint16_t unknown4 = 0; uint16_t unknown4 = 0;
uint16_t unknown5 = 0; uint16_t unknown5 = 0;

View file

@ -505,7 +505,7 @@ String advanced_battery_processor(const String& var) {
content += "<h4>Temperature sensor 10: " + String(datalayer_extended.bydAtto3.battery_temperatures[9]) + "</h4>"; content += "<h4>Temperature sensor 10: " + String(datalayer_extended.bydAtto3.battery_temperatures[9]) + "</h4>";
content += "<h4>Unknown0: " + String(datalayer_extended.bydAtto3.unknown0) + "</h4>"; content += "<h4>Unknown0: " + String(datalayer_extended.bydAtto3.unknown0) + "</h4>";
content += "<h4>Unknown1: " + String(datalayer_extended.bydAtto3.unknown1) + "</h4>"; content += "<h4>Unknown1: " + String(datalayer_extended.bydAtto3.unknown1) + "</h4>";
content += "<h4>Unknown2: " + String(datalayer_extended.bydAtto3.unknown2) + "</h4>"; content += "<h4>Charge power raw: " + String(datalayer_extended.bydAtto3.chargePower) + "</h4>";
content += "<h4>Unknown3: " + String(datalayer_extended.bydAtto3.unknown3) + "</h4>"; content += "<h4>Unknown3: " + String(datalayer_extended.bydAtto3.unknown3) + "</h4>";
content += "<h4>Unknown4: " + String(datalayer_extended.bydAtto3.unknown4) + "</h4>"; content += "<h4>Unknown4: " + String(datalayer_extended.bydAtto3.unknown4) + "</h4>";
content += "<h4>Unknown5: " + String(datalayer_extended.bydAtto3.unknown5) + "</h4>"; content += "<h4>Unknown5: " + String(datalayer_extended.bydAtto3.unknown5) + "</h4>";