mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-05 02:39:57 +02:00
Add cellvoltages, and map more
This commit is contained in:
parent
376d6042de
commit
390c4f9bce
1 changed files with 33 additions and 15 deletions
|
@ -12,9 +12,7 @@
|
||||||
- Figure out which CAN messages need to be sent towards the battery to keep it alive
|
- Figure out which CAN messages need to be sent towards the battery to keep it alive
|
||||||
-Maybe already enough with 0x12D and 0x411?
|
-Maybe already enough with 0x12D and 0x411?
|
||||||
- Map all values from battery CAN messages
|
- Map all values from battery CAN messages
|
||||||
-SOC% still not found (Lets take it from PID poll)
|
-SOC% still not found (Lets take it from PID poll, not working right yet)
|
||||||
-Voltage still not found (Lets take it from PID poll)
|
|
||||||
-Rest is optional and can be added later
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Do not change code below unless you are sure what you are doing */
|
/* 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_lowest_cell_temperature = 0;
|
||||||
static int16_t BMS_highest_cell_temperature = 0;
|
static int16_t BMS_highest_cell_temperature = 0;
|
||||||
static int16_t BMS_average_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_SOC 0x05
|
||||||
#define POLL_FOR_BATTERY_VOLTAGE 0x08
|
#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_LOWEST_TEMP_CELL 0x2f
|
||||||
#define POLL_FOR_HIGHEST_TEMP_CELL 0x31
|
#define POLL_FOR_HIGHEST_TEMP_CELL 0x31
|
||||||
#define POLL_FOR_BATTERY_PACK_AVG_TEMP 0x32
|
#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
|
#define UNKNOWN_POLL_1 0xFC
|
||||||
|
|
||||||
CAN_frame_t ATTO_3_12D = {.FIR = {.B =
|
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
|
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.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<uint32_t>(
|
datalayer.battery.status.remaining_capacity_Wh = static_cast<uint32_t>(
|
||||||
(static_cast<double>(datalayer.battery.status.real_soc) / 10000) * datalayer.battery.info.total_capacity_Wh);
|
(static_cast<double>(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.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
|
// Initialize min and max variables
|
||||||
calc_min_temperature = daughterboard_temperatures[0];
|
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);
|
ESP32Can.CANWriteFrame(&ATTO_3_7E7_POLL);
|
||||||
|
|
||||||
switch (ATTO_3_7E7_POLL.data.u8[3]) {
|
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:
|
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;
|
ATTO_3_7E7_POLL.data.u8[3] = POLL_FOR_BATTERY_CURRENT;
|
||||||
break;
|
break;
|
||||||
case POLL_FOR_BATTERY_CURRENT:
|
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;
|
ATTO_3_7E7_POLL.data.u8[3] = POLL_FOR_BATTERY_PACK_AVG_TEMP;
|
||||||
break;
|
break;
|
||||||
case POLL_FOR_BATTERY_PACK_AVG_TEMP:
|
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;
|
break;
|
||||||
default: //Something went wrong with logic, request SOC
|
case POLL_FOR_BATTERY_CELL_MV_MAX:
|
||||||
ATTO_3_7E7_POLL.data.u8[3] = POLL_FOR_BATTERY_SOC;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 0x7EF: //OBD2 PID reply from battery
|
case 0x7EF: //OBD2 PID reply from battery
|
||||||
switch (rx_frame.data.u8[3]) {
|
switch (rx_frame.data.u8[3]) {
|
||||||
case POLL_FOR_BATTERY_SOC:
|
|
||||||
BMS_SOC = rx_frame.data.u8[4];
|
|
||||||
break;
|
|
||||||
case POLL_FOR_BATTERY_VOLTAGE:
|
case POLL_FOR_BATTERY_VOLTAGE:
|
||||||
BMS_voltage = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[4];
|
BMS_voltage = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[4];
|
||||||
break;
|
break;
|
||||||
|
case POLL_FOR_BATTERY_SOC:
|
||||||
|
BMS_SOC = rx_frame.data.u8[4];
|
||||||
|
break;
|
||||||
case POLL_FOR_BATTERY_CURRENT:
|
case POLL_FOR_BATTERY_CURRENT:
|
||||||
BMS_current = ((rx_frame.data.u8[5] << 8) | rx_frame.data.u8[4]) - 5000;
|
BMS_current = ((rx_frame.data.u8[5] << 8) | rx_frame.data.u8[4]) - 5000;
|
||||||
break;
|
break;
|
||||||
|
@ -249,6 +261,12 @@ void receive_can_battery(CAN_frame_t rx_frame) {
|
||||||
case POLL_FOR_BATTERY_PACK_AVG_TEMP:
|
case POLL_FOR_BATTERY_PACK_AVG_TEMP:
|
||||||
BMS_average_cell_temperature = (rx_frame.data.u8[4] - 40);
|
BMS_average_cell_temperature = (rx_frame.data.u8[4] - 40);
|
||||||
break;
|
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
|
default: //Unrecognized reply
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue