Add more mappings

This commit is contained in:
Daniel Öster 2024-09-09 22:59:02 +03:00
parent b30a0948f5
commit 5b43fed340
4 changed files with 330 additions and 36 deletions

View file

@ -377,6 +377,9 @@ void init_CAN() {
digitalWrite(CAN_SE_PIN, LOW);
#endif
CAN_cfg.speed = CAN_SPEED_500KBPS;
#ifdef NATIVECAN_250KBPS // Some component is requesting lower CAN speed
CAN_cfg.speed = CAN_SPEED_250KBPS;
#endif
CAN_cfg.tx_pin_id = CAN_TX_PIN;
CAN_cfg.rx_pin_id = CAN_RX_PIN;
CAN_cfg.rx_queue = xQueueCreate(rx_queue_size, sizeof(CAN_frame_t));

View file

@ -2,63 +2,347 @@
#ifdef RJXZS_BMS
#include "../datalayer/datalayer.h"
#include "../devboard/utils/events.h"
#include "PYLON-BATTERY.h"
#include "RJXZS-BMS.h"
/* Do not change code below unless you are sure what you are doing */
static unsigned long previousMillis1000 = 0; // will store last time a 1s CAN Message was sent
static unsigned long previousMillis10s = 0; // will store last time a 10s CAN Message was sent
//Actual content messages
CAN_frame RJXZS_F4 = {.FD = false, .ext_ID = false, .DLC = 3, .ID = 0xF4, .data = {0x1C, 0x00, 0x02}};
CAN_frame RJXZS_1C = {.FD = false, .ext_ID = true, .DLC = 3, .ID = 0xF4, .data = {0x1C, 0x00, 0x02}};
CAN_frame RJXZS_10 = {.FD = false, .ext_ID = true, .DLC = 3, .ID = 0xF4, .data = {0x10, 0x00, 0x02}};
static int16_t celltemperature_max_dC = 0;
static int16_t celltemperature_min_dC = 0;
static int16_t current_dA = 0;
static uint16_t voltage_dV = 0;
static uint16_t cellvoltage_max_mV = 0;
static uint16_t cellvoltage_min_mV = 0;
static uint16_t charge_cutoff_voltage = 0;
static uint16_t discharge_cutoff_voltage = 0;
static int16_t max_charge_current = 0;
static int16_t max_discharge_current = 0;
static uint8_t voltage_level = 0;
static uint8_t ah_number = 0;
static uint8_t SOC = 0;
static uint8_t SOH = 0;
static uint8_t mux = 0;
static bool setup_completed = false;
static uint16_t total_voltage = 0;
static int16_t total_current = 0;
static uint16_t total_power = 0;
static uint16_t battery_usage_capacity = 0;
static uint16_t battery_capacity_percentage = 0;
static uint16_t charging_capacity = 0;
static uint16_t charging_recovery_voltage = 0;
static uint16_t discharging_recovery_voltage = 0;
static uint16_t remaining_capacity = 0;
static int16_t host_temperature = 0;
static uint16_t status_accounting = 0;
static uint16_t equalization_starting_voltage = 0;
static uint16_t discharge_protection_voltage = 0;
static uint16_t protective_current = 0;
static uint16_t battery_pack_capacity = 0;
static uint16_t number_of_battery_strings = 0;
static uint16_t charging_protection_voltage = 0;
static int16_t protection_temperature = 0;
static bool temperature_below_zero_mod1_4 = false;
static bool temperature_below_zero_mod5_8 = false;
static uint16_t module_1_temperature = 0;
static uint16_t module_2_temperature = 0;
static uint16_t module_3_temperature = 0;
static uint16_t module_4_temperature = 0;
static uint16_t module_5_temperature = 0;
static uint16_t module_6_temperature = 0;
static uint16_t module_7_temperature = 0;
static uint16_t module_8_temperature = 0;
static uint16_t module_9_temperature = 0;
static uint16_t module_10_temperature = 0;
static uint16_t module_11_temperature = 0;
static uint16_t module_12_temperature = 0;
static uint16_t module_13_temperature = 0;
static uint16_t module_14_temperature = 0;
static uint16_t module_15_temperature = 0;
static uint16_t module_16_temperature = 0;
static uint16_t balanced_reference_voltage = 0;
static uint16_t minimum_cell_voltage = 0;
static uint16_t maximum_cell_voltage = 0;
static uint16_t cellvoltages[MAX_AMOUNT_CELLS];
static uint8_t populated_cellvoltages = 0;
void update_values_battery() {
datalayer.battery.status.real_soc;
datalayer.battery.status.real_soc = battery_capacity_percentage;
datalayer.battery.status.soh_pptt;
datalayer.battery.status.voltage_dV;
datalayer.battery.status.voltage_dV = total_voltage;
datalayer.battery.status.current_dA;
datalayer.battery.status.current_dA = total_current;
datalayer.battery.status.active_power_W = //Power in watts, Negative = charging batt
((datalayer.battery.status.voltage_dV * datalayer.battery.status.current_dA) / 100);
datalayer.battery.status.max_charge_power_W;
datalayer.battery.status.max_charge_power_W = protective_current * total_voltage;
datalayer.battery.status.max_discharge_power_W;
datalayer.battery.status.max_discharge_power_W = protective_current * total_voltage;
datalayer.battery.status.cell_max_voltage_mV;
uint16_t temperatures[] = {
module_1_temperature, module_2_temperature, module_3_temperature, module_4_temperature,
module_5_temperature, module_6_temperature, module_7_temperature, module_8_temperature,
module_9_temperature, module_10_temperature, module_11_temperature, module_12_temperature,
module_13_temperature, module_14_temperature, module_15_temperature, module_16_temperature};
datalayer.battery.status.cell_min_voltage_mV;
uint16_t min_temp = std::numeric_limits<uint16_t>::max();
uint16_t max_temp = 0;
datalayer.battery.status.temperature_min_dC;
// Loop through the array to find min and max temperatures, ignoring 0 values
for (int i = 0; i < 16; i++) {
if (temperatures[i] != 0) { // Ignore unavailable temperatures
if (temperatures[i] < min_temp) {
min_temp = temperatures[i];
}
if (temperatures[i] > max_temp) {
max_temp = temperatures[i];
}
}
}
datalayer.battery.status.temperature_max_dC;
datalayer.battery.status.temperature_min_dC = min_temp;
datalayer.battery.info.max_design_voltage_dV;
datalayer.battery.status.temperature_max_dC = max_temp;
datalayer.battery.info.min_design_voltage_dV;
// The cellvoltages[] array can contain 0s inside it
populated_cellvoltages = 0;
for (int i = 0; i < MAX_AMOUNT_CELLS; ++i) {
if (cellvoltages[i] > 0) { // We have a measurement available
datalayer.battery.status.cell_voltages_mV[populated_cellvoltages] = cellvoltages[i];
populated_cellvoltages++;
}
}
datalayer.battery.info.number_of_cells = populated_cellvoltages; // 1-192S
datalayer.battery.info.max_design_voltage_dV; // Set according to cells?
datalayer.battery.info.min_design_voltage_dV; // Set according to cells?
datalayer.battery.status.cell_max_voltage_mV = maximum_cell_voltage;
datalayer.battery.status.cell_min_voltage_mV = minimum_cell_voltage;
}
void receive_can_battery(CAN_frame rx_frame) {
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
// All CAN messages recieved will be logged via serial
Serial.print(millis()); // Example printout, time, ID, length, data: 7553 1DB 8 FF C0 B9 EA 0 0 2 5D
Serial.print(" ");
Serial.print(rx_frame.ID, HEX);
Serial.print(" ");
Serial.print(rx_frame.DLC);
Serial.print(" ");
for (int i = 0; i < rx_frame.DLC; ++i) {
Serial.print(rx_frame.data.u8[i], HEX);
Serial.print(" ");
}
Serial.println("");
switch (rx_frame.ID) {
case 0x1:
case 0xF5: // This is the only message is sent from BMS
setup_completed = true; // Let the function know we no longer need to send startup messages
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
mux = rx_frame.data.u8[0];
if (mux == 0x01) { // discharge protection voltage, protective current, battery pack capacity
discharge_protection_voltage = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
protective_current = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
battery_pack_capacity = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x02) { // Number of strings, charge protection voltage, protection temperature
number_of_battery_strings = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
charging_protection_voltage = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
protection_temperature = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x03) { // Total voltage/current/power
total_voltage = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
total_current = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
total_power = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x04) { // Capacity, percentages
battery_usage_capacity = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
battery_capacity_percentage = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
charging_capacity = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x05) { //Recovery / capacity
charging_recovery_voltage = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
discharging_recovery_voltage = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
remaining_capacity = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x06) { // temperature, equalization
host_temperature = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
status_accounting = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
equalization_starting_voltage = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x07) { // Cellvoltages 1-3
cellvoltages[0] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[1] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[2] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x08) { // Cellvoltages 4-6
cellvoltages[3] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[4] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[5] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x09) { // Cellvoltages 7-9
cellvoltages[6] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[7] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[8] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x0A) { // Cellvoltages 10-12
cellvoltages[9] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[10] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[11] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x0B) { // Cellvoltages 13-15
cellvoltages[12] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[13] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[14] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x0C) { // Cellvoltages 16-18
cellvoltages[15] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[16] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[17] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x0D) { // Cellvoltages 19-21
cellvoltages[18] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[19] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[20] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x0E) { // Cellvoltages 22-24
cellvoltages[21] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[22] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[23] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x0F) { // Cellvoltages 25-27
cellvoltages[24] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[25] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[26] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x10) { // Cellvoltages 28-30
cellvoltages[27] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[28] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[29] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x11) { // Cellvoltages 31-33
cellvoltages[30] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[31] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[32] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x12) { // Cellvoltages 34-36
cellvoltages[33] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[34] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[35] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x13) { // Cellvoltages 37-39
cellvoltages[36] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[37] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[38] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x14) { // Cellvoltages 40-42
cellvoltages[39] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[40] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[41] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x15) { // Cellvoltages 43-45
cellvoltages[42] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[43] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[44] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x16) { // Cellvoltages 46-48
cellvoltages[45] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[46] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[47] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x17) { // Cellvoltages 49-51
cellvoltages[48] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[49] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[50] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x18) { // Cellvoltages 52-54
cellvoltages[51] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[52] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[53] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x19) { // Cellvoltages 55-57
cellvoltages[54] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[55] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[56] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x1A) { // Cellvoltages 58-60
cellvoltages[57] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[58] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[59] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x1B) { // Cellvoltages 61-63
cellvoltages[60] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[61] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[62] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x1C) { // Cellvoltages 64-66
cellvoltages[63] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[64] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[65] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x1D) { // Cellvoltages 67-69
cellvoltages[66] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[67] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[68] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x1E) { // Cellvoltages 70-72
cellvoltages[69] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[70] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[71] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x1F) { // Cellvoltages 73-75
cellvoltages[72] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[73] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[74] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x20) { // Cellvoltages 76-78
cellvoltages[75] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[76] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[77] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x21) { // Cellvoltages 79-81
cellvoltages[78] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[79] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[80] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x22) { // Cellvoltages 82-84
cellvoltages[81] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[82] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[83] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x23) { // Cellvoltages 85-87
cellvoltages[84] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[85] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[86] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x24) { // Cellvoltages 88-90
cellvoltages[87] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[88] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[89] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x25) { // Cellvoltages 91-93
cellvoltages[90] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[91] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[92] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x26) { // Cellvoltages 94-96
cellvoltages[93] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[94] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[95] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x27) { // Cellvoltages 97-99
cellvoltages[96] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[97] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[98] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x28) { // Cellvoltages 100-102
cellvoltages[99] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[100] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[101] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x29) { // Cellvoltages 103-105
cellvoltages[102] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[103] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[104] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x2A) { // Cellvoltages 106-108
cellvoltages[105] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[106] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[107] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x2B) { // Cellvoltages 109-111
cellvoltages[108] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[109] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[110] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x2C) { // Cellvoltages 112-114
cellvoltages[111] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[112] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[113] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x2D) { // Cellvoltages 115-117
cellvoltages[114] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[115] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[116] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x2E) { // Cellvoltages 118-120
cellvoltages[117] = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
cellvoltages[118] = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
cellvoltages[119] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x47) {
temperature_below_zero_mod1_4 = rx_frame.data.u8[2];
module_1_temperature = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
} else if (mux == 0x48) {
module_2_temperature = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
module_3_temperature = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x49) {
module_4_temperature = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
} else if (mux == 0x4A) {
temperature_below_zero_mod5_8 = rx_frame.data.u8[2];
module_5_temperature = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
} else if (mux == 0x4B) {
module_6_temperature = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
module_7_temperature = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
} else if (mux == 0x4C) {
module_8_temperature = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
} else if (mux == 0x51) {
balanced_reference_voltage = (rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2];
minimum_cell_voltage = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
maximum_cell_voltage = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
}
break;
default:
break;
@ -67,12 +351,15 @@ void receive_can_battery(CAN_frame rx_frame) {
void send_can_battery() {
unsigned long currentMillis = millis();
// Send 1s CAN Message
if (currentMillis - previousMillis1000 >= INTERVAL_1_S) {
// Send 10s CAN Message
if (currentMillis - previousMillis10s >= INTERVAL_10_S) {
previousMillis1000 = currentMillis;
previousMillis10s = currentMillis;
transmit_can(&RJXZS_F4, can_config.battery); // Start broadcast
if (!setup_completed) {
transmit_can(&RJXZS_10, can_config.battery); // Communication connected flag
transmit_can(&RJXZS_1C, can_config.battery); // CAN OK
}
}
}
@ -81,8 +368,8 @@ void setup_battery(void) { // Performs one time setup at startup
Serial.println("RJXZS BMS selected");
#endif
datalayer.battery.info.max_design_voltage_dV = 4500;
datalayer.battery.info.min_design_voltage_dV = 2500;
datalayer.battery.info.max_design_voltage_dV = 5000;
datalayer.battery.info.min_design_voltage_dV = 1000;
}
#endif // RJXZS_BMS

View file

@ -5,6 +5,7 @@
#define BATTERY_SELECTED
#define MAX_CELL_DEVIATION_MV 250
#define NATIVECAN_250KBPS
void setup_battery(void);
void transmit_can(CAN_frame* tx_frame, int interface);

View file

@ -558,6 +558,9 @@ String processor(const String& var) {
#ifdef NISSAN_LEAF_BATTERY
content += "Nissan LEAF";
#endif // NISSAN_LEAF_BATTERY
#ifdef RJXZS_BMS
content += "RJXZS BMS, DIY battery";
#endif // RJXZS_BMS
#ifdef RENAULT_KANGOO_BATTERY
content += "Renault Kangoo";
#endif // RENAULT_KANGOO_BATTERY