diff --git a/Software/src/battery/BOLT-AMPERA-BATTERY.cpp b/Software/src/battery/BOLT-AMPERA-BATTERY.cpp index a6ecdd79..a0cb0e95 100644 --- a/Software/src/battery/BOLT-AMPERA-BATTERY.cpp +++ b/Software/src/battery/BOLT-AMPERA-BATTERY.cpp @@ -6,21 +6,168 @@ #include "BOLT-AMPERA-BATTERY.h" /* Do not change code below unless you are sure what you are doing */ -static unsigned long previousMillis20 = 0; // will store last time a 20ms CAN Message was send +static unsigned long previousMillis20ms = 0; // will store last time a 20ms CAN Message was send +static unsigned long previousMillis200ms = 0; // will store last time a 200ms CAN Message was send -CAN_frame BOLT_778 = {.FD = false, +CAN_frame BOLT_778 = {.FD = false, // Unsure of what this message is, added only as example .ext_ID = false, .DLC = 7, .ID = 0x778, .data = {0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00}}; +CAN_frame BOLT_POLL_7E4 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x7E4, + .data = {0x02, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; + +static uint16_t battery_cell_voltages[96]; //array with all the cellvoltages +static uint16_t battery_capacity_my17_18 = 0; +static uint16_t battery_capacity_my19plus = 0; +static uint16_t battery_SOC_display = 0; +static uint16_t battery_SOC_raw_highprec = 0; +static uint16_t battery_max_temperature = 0; +static uint16_t battery_min_temperature = 0; +static uint16_t battery_min_cell_voltage = 0; +static uint16_t battery_max_cell_voltage = 0; +static uint16_t battery_internal_resistance = 0; +static uint16_t battery_min_voltage = 0; +static uint16_t battery_max_voltage = 0; +static uint16_t battery_voltage = 3700; +static uint16_t battery_vehicle_isolation = 0; +static uint16_t battery_isolation_kohm = 0; +static uint16_t battery_HV_locked = 0; +static uint16_t battery_crash_event = 0; +static uint16_t battery_HVIL = 0; +static uint16_t battery_HVIL_status = 0; +static int16_t battery_current = 0; + +static uint8_t poll_index = 0; +static uint16_t currentpoll = POLL_CAPACITY_EST_GEN1; +static uint16_t reply_poll = 0; + +const uint16_t poll_commands[115] = {POLL_CAPACITY_EST_GEN1, + POLL_CAPACITY_EST_GEN2, + POLL_SOC_DISPLAY, + POLL_SOC_RAW_HIGHPREC, + POLL_MAX_TEMPERATURE, + POLL_MIN_TEMPERATURE, + POLL_MIN_CELL_V, + POLL_MAX_CELL_V, + POLL_INTERNAL_RES, + POLL_MIN_BATT_V, + POLL_MAX_BATT_V, + POLL_VOLTAGE, + POLL_VEHICLE_ISOLATION, + POLL_ISOLATION_TEST_KOHM, + POLL_HV_LOCKED_OUT, + POLL_CRASH_EVENT, + POLL_HVIL, + POLL_HVIL_STATUS, + POLL_CURRENT, + POLL_CELL_01, + POLL_CELL_02, + POLL_CELL_03, + POLL_CELL_04, + POLL_CELL_05, + POLL_CELL_06, + POLL_CELL_07, + POLL_CELL_08, + POLL_CELL_09, + POLL_CELL_10, + POLL_CELL_11, + POLL_CELL_12, + POLL_CELL_13, + POLL_CELL_14, + POLL_CELL_15, + POLL_CELL_16, + POLL_CELL_17, + POLL_CELL_18, + POLL_CELL_19, + POLL_CELL_20, + POLL_CELL_21, + POLL_CELL_22, + POLL_CELL_23, + POLL_CELL_24, + POLL_CELL_25, + POLL_CELL_26, + POLL_CELL_27, + POLL_CELL_28, + POLL_CELL_29, + POLL_CELL_30, + POLL_CELL_31, + POLL_CELL_32, + POLL_CELL_33, + POLL_CELL_34, + POLL_CELL_35, + POLL_CELL_36, + POLL_CELL_37, + POLL_CELL_38, + POLL_CELL_39, + POLL_CELL_40, + POLL_CELL_41, + POLL_CELL_42, + POLL_CELL_43, + POLL_CELL_44, + POLL_CELL_45, + POLL_CELL_46, + POLL_CELL_47, + POLL_CELL_48, + POLL_CELL_49, + POLL_CELL_50, + POLL_CELL_51, + POLL_CELL_52, + POLL_CELL_53, + POLL_CELL_54, + POLL_CELL_55, + POLL_CELL_56, + POLL_CELL_57, + POLL_CELL_58, + POLL_CELL_59, + POLL_CELL_60, + POLL_CELL_61, + POLL_CELL_62, + POLL_CELL_63, + POLL_CELL_64, + POLL_CELL_65, + POLL_CELL_66, + POLL_CELL_67, + POLL_CELL_68, + POLL_CELL_69, + POLL_CELL_70, + POLL_CELL_71, + POLL_CELL_72, + POLL_CELL_73, + POLL_CELL_74, + POLL_CELL_75, + POLL_CELL_76, + POLL_CELL_77, + POLL_CELL_78, + POLL_CELL_79, + POLL_CELL_80, + POLL_CELL_81, + POLL_CELL_82, + POLL_CELL_83, + POLL_CELL_84, + POLL_CELL_85, + POLL_CELL_86, + POLL_CELL_87, + POLL_CELL_88, + POLL_CELL_89, + POLL_CELL_90, + POLL_CELL_91, + POLL_CELL_92, + POLL_CELL_93, + POLL_CELL_94, + POLL_CELL_95, + POLL_CELL_96}; void update_values_battery() { //This function maps all the values fetched via CAN to the battery datalayer - datalayer.battery.status.real_soc; + datalayer.battery.status.real_soc = (battery_SOC_display * 100 / 255); - datalayer.battery.status.voltage_dV; + datalayer.battery.status.voltage_dV = battery_voltage * 0.52; - datalayer.battery.status.current_dA; + datalayer.battery.status.current_dA = battery_current / -6.675; datalayer.battery.info.total_capacity_Wh; @@ -35,6 +182,9 @@ void update_values_battery() { //This function maps all the values fetched via datalayer.battery.status.temperature_min_dC; datalayer.battery.status.temperature_max_dC; + + //Map all cell voltages to the global array + memcpy(datalayer.battery.status.cell_voltages_mV, battery_cell_voltages, 96 * sizeof(uint16_t)); } void receive_can_battery(CAN_frame rx_frame) { @@ -45,6 +195,359 @@ void receive_can_battery(CAN_frame rx_frame) { case 0x3E3: datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; break; + case 0x7EC: //TODO: Confirm if this is the reply from BMS when polling + //Frame 2 & 3 contains reply + reply_poll = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3]; + + switch (reply_poll) { + case POLL_CAPACITY_EST_GEN1: + battery_capacity_my17_18 = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CAPACITY_EST_GEN2: + battery_capacity_my19plus = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_SOC_DISPLAY: + battery_SOC_display = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_SOC_RAW_HIGHPREC: + battery_SOC_raw_highprec = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_MAX_TEMPERATURE: + battery_max_temperature = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_MIN_TEMPERATURE: + battery_min_temperature = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_MIN_CELL_V: + battery_min_cell_voltage = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_MAX_CELL_V: + battery_max_cell_voltage = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_INTERNAL_RES: + battery_internal_resistance = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_MIN_BATT_V: + battery_min_voltage = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_MAX_BATT_V: + battery_max_voltage = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_VOLTAGE: + battery_voltage = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_VEHICLE_ISOLATION: + battery_vehicle_isolation = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_ISOLATION_TEST_KOHM: + battery_isolation_kohm = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_HV_LOCKED_OUT: + battery_HV_locked = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CRASH_EVENT: + battery_crash_event = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_HVIL: + battery_HVIL = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_HVIL_STATUS: + battery_HVIL_status = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CURRENT: + battery_current = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_01: + battery_cell_voltages[0] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_02: + battery_cell_voltages[1] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_03: + battery_cell_voltages[2] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_04: + battery_cell_voltages[3] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_05: + battery_cell_voltages[4] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_06: + battery_cell_voltages[5] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_07: + battery_cell_voltages[6] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_08: + battery_cell_voltages[7] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_09: + battery_cell_voltages[8] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_10: + battery_cell_voltages[9] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_11: + battery_cell_voltages[10] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_12: + battery_cell_voltages[11] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_13: + battery_cell_voltages[12] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_14: + battery_cell_voltages[13] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_15: + battery_cell_voltages[14] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_16: + battery_cell_voltages[15] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_17: + battery_cell_voltages[16] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_18: + battery_cell_voltages[17] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_19: + battery_cell_voltages[18] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_20: + battery_cell_voltages[19] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_21: + battery_cell_voltages[20] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_22: + battery_cell_voltages[21] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_23: + battery_cell_voltages[22] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_24: + battery_cell_voltages[23] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_25: + battery_cell_voltages[24] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_26: + battery_cell_voltages[25] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_27: + battery_cell_voltages[26] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_28: + battery_cell_voltages[27] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_29: + battery_cell_voltages[28] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_30: + battery_cell_voltages[29] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_31: + battery_cell_voltages[30] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_32: + battery_cell_voltages[31] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_33: + battery_cell_voltages[32] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_34: + battery_cell_voltages[33] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_35: + battery_cell_voltages[34] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_36: + battery_cell_voltages[35] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_37: + battery_cell_voltages[36] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_38: + battery_cell_voltages[37] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_39: + battery_cell_voltages[38] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_40: + battery_cell_voltages[39] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_41: + battery_cell_voltages[40] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_42: + battery_cell_voltages[41] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_43: + battery_cell_voltages[42] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_44: + battery_cell_voltages[43] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_45: + battery_cell_voltages[44] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_46: + battery_cell_voltages[45] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_47: + battery_cell_voltages[46] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_48: + battery_cell_voltages[47] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_49: + battery_cell_voltages[48] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_50: + battery_cell_voltages[49] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_51: + battery_cell_voltages[50] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_52: + battery_cell_voltages[51] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_53: + battery_cell_voltages[52] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_54: + battery_cell_voltages[53] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_55: + battery_cell_voltages[54] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_56: + battery_cell_voltages[55] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_57: + battery_cell_voltages[56] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_58: + battery_cell_voltages[57] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_59: + battery_cell_voltages[58] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_60: + battery_cell_voltages[59] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_61: + battery_cell_voltages[60] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_62: + battery_cell_voltages[61] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_63: + battery_cell_voltages[62] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_64: + battery_cell_voltages[63] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_65: + battery_cell_voltages[64] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_66: + battery_cell_voltages[65] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_67: + battery_cell_voltages[66] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_68: + battery_cell_voltages[67] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_69: + battery_cell_voltages[68] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_70: + battery_cell_voltages[69] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_71: + battery_cell_voltages[70] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_72: + battery_cell_voltages[71] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_73: + battery_cell_voltages[72] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_74: + battery_cell_voltages[73] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_75: + battery_cell_voltages[74] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_76: + battery_cell_voltages[75] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_77: + battery_cell_voltages[76] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_78: + battery_cell_voltages[77] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_79: + battery_cell_voltages[78] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_80: + battery_cell_voltages[79] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_81: + battery_cell_voltages[80] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_82: + battery_cell_voltages[81] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_83: + battery_cell_voltages[82] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_84: + battery_cell_voltages[83] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_85: + battery_cell_voltages[84] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_86: + battery_cell_voltages[85] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_87: + battery_cell_voltages[86] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_88: + battery_cell_voltages[87] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_89: + battery_cell_voltages[88] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_90: + battery_cell_voltages[89] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_91: + battery_cell_voltages[90] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_92: + battery_cell_voltages[91] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_93: + battery_cell_voltages[92] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_94: + battery_cell_voltages[93] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_95: + battery_cell_voltages[94] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + case POLL_CELL_96: + battery_cell_voltages[95] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5]; + break; + default: + break; + } default: break; } @@ -54,22 +557,36 @@ void send_can_battery() { unsigned long currentMillis = millis(); //Send 20ms message - if (currentMillis - previousMillis20 >= INTERVAL_20_MS) { + if (currentMillis - previousMillis20ms >= INTERVAL_20_MS) { // Check if sending of CAN messages has been delayed too much. - if ((currentMillis - previousMillis20 >= INTERVAL_20_MS_DELAYED) && (currentMillis > BOOTUP_TIME)) { - set_event(EVENT_CAN_OVERRUN, (currentMillis - previousMillis20)); + if ((currentMillis - previousMillis20ms >= INTERVAL_20_MS_DELAYED) && (currentMillis > BOOTUP_TIME)) { + set_event(EVENT_CAN_OVERRUN, (currentMillis - previousMillis20ms)); } else { clear_event(EVENT_CAN_OVERRUN); } - previousMillis20 = currentMillis; + previousMillis20ms = currentMillis; transmit_can(&BOLT_778, can_config.battery); } + + //Send 200ms message + if (currentMillis - previousMillis200ms >= INTERVAL_200_MS) { + previousMillis200ms = currentMillis; + + // Update current poll from the array + currentpoll = poll_commands[poll_index]; + poll_index = (poll_index + 1) % 115; + + BOLT_POLL_7E4.data.u8[2] = (uint8_t)((currentpoll & 0xFF00) >> 8); + BOLT_POLL_7E4.data.u8[3] = (uint8_t)(currentpoll & 0x00FF); + + transmit_can(&BOLT_POLL_7E4, can_config.battery); + } } void setup_battery(void) { // Performs one time setup at startup strncpy(datalayer.system.info.battery_protocol, "Chevrolet Bolt EV/Opel Ampera-e", 63); datalayer.system.info.battery_protocol[63] = '\0'; - + datalayer.battery.info.number_of_cells = 96; datalayer.battery.info.max_design_voltage_dV = MAX_PACK_VOLTAGE_DV; datalayer.battery.info.min_design_voltage_dV = MIN_PACK_VOLTAGE_DV; datalayer.battery.info.max_cell_voltage_mV = MAX_CELL_VOLTAGE_MV; diff --git a/Software/src/battery/BOLT-AMPERA-BATTERY.h b/Software/src/battery/BOLT-AMPERA-BATTERY.h index 42d743d5..46c28f0a 100644 --- a/Software/src/battery/BOLT-AMPERA-BATTERY.h +++ b/Software/src/battery/BOLT-AMPERA-BATTERY.h @@ -10,7 +10,122 @@ #define MAX_CELL_DEVIATION_MV 500 #define MAX_CELL_VOLTAGE_MV 4250 //Battery is put into emergency stop if one cell goes over this value #define MIN_CELL_VOLTAGE_MV 2700 //Battery is put into emergency stop if one cell goes below this value -#define MAX_CHARGE_POWER_W 5000 // Battery can be charged with this amount of power + +#define POLL_CAPACITY_EST_GEN1 0x41A3 +#define POLL_CAPACITY_EST_GEN2 0x45F9 +#define POLL_SOC_DISPLAY 0x8334 +#define POLL_SOC_RAW_HIGHPREC 0x43AF +#define POLL_MAX_TEMPERATURE 0x4349 +#define POLL_MIN_TEMPERATURE 0x434A +#define POLL_MIN_CELL_V 0x4329 +#define POLL_MAX_CELL_V 0x432B +#define POLL_INTERNAL_RES 0x40E9 +#define POLL_MIN_BATT_V 0x433B +#define POLL_MAX_BATT_V 0x433C +#define POLL_VOLTAGE 0x432D +#define POLL_VEHICLE_ISOLATION 0x41EC +#define POLL_ISOLATION_TEST_KOHM 0x43A6 +#define POLL_HV_LOCKED_OUT 0x44F8 +#define POLL_CRASH_EVENT 0x4522 +#define POLL_HVIL 0x4310 +#define POLL_HVIL_STATUS 0x4311 +#define POLL_CURRENT 0x4356 +#define POLL_CELL_01 0x4181 +#define POLL_CELL_02 0x4182 +#define POLL_CELL_03 0x4183 +#define POLL_CELL_04 0x4184 +#define POLL_CELL_05 0x4185 +#define POLL_CELL_06 0x4186 +#define POLL_CELL_07 0x4187 +#define POLL_CELL_08 0x4188 +#define POLL_CELL_09 0x4189 +#define POLL_CELL_10 0x418A +#define POLL_CELL_11 0x418B +#define POLL_CELL_12 0x418C +#define POLL_CELL_13 0x418D +#define POLL_CELL_14 0x418E +#define POLL_CELL_15 0x418F +#define POLL_CELL_16 0x4190 +#define POLL_CELL_17 0x4191 +#define POLL_CELL_18 0x4192 +#define POLL_CELL_19 0x4193 +#define POLL_CELL_20 0x4194 +#define POLL_CELL_21 0x4195 +#define POLL_CELL_22 0x4196 +#define POLL_CELL_23 0x4197 +#define POLL_CELL_24 0x4198 +#define POLL_CELL_25 0x4199 +#define POLL_CELL_26 0x419A +#define POLL_CELL_27 0x419B +#define POLL_CELL_28 0x419C +#define POLL_CELL_29 0x419D +#define POLL_CELL_30 0x419E +#define POLL_CELL_31 0x419F +#define POLL_CELL_32 0x4200 +#define POLL_CELL_33 0x4201 +#define POLL_CELL_34 0x4202 +#define POLL_CELL_35 0x4203 +#define POLL_CELL_36 0x4204 +#define POLL_CELL_37 0x4205 +#define POLL_CELL_38 0x4206 +#define POLL_CELL_39 0x4207 +#define POLL_CELL_40 0x4208 +#define POLL_CELL_41 0x4209 +#define POLL_CELL_42 0x420A +#define POLL_CELL_43 0x420B +#define POLL_CELL_44 0x420C +#define POLL_CELL_45 0x420D +#define POLL_CELL_46 0x420E +#define POLL_CELL_47 0x420F +#define POLL_CELL_48 0x4210 +#define POLL_CELL_49 0x4211 +#define POLL_CELL_50 0x4212 +#define POLL_CELL_51 0x4213 +#define POLL_CELL_52 0x4214 +#define POLL_CELL_53 0x4215 +#define POLL_CELL_54 0x4216 +#define POLL_CELL_55 0x4217 +#define POLL_CELL_56 0x4218 +#define POLL_CELL_57 0x4219 +#define POLL_CELL_58 0x421A +#define POLL_CELL_59 0x421B +#define POLL_CELL_60 0x421C +#define POLL_CELL_61 0x421D +#define POLL_CELL_62 0x421E +#define POLL_CELL_63 0x421F +#define POLL_CELL_64 0x4220 +#define POLL_CELL_65 0x4221 +#define POLL_CELL_66 0x4222 +#define POLL_CELL_67 0x4223 +#define POLL_CELL_68 0x4224 +#define POLL_CELL_69 0x4225 +#define POLL_CELL_70 0x4226 +#define POLL_CELL_71 0x4227 +#define POLL_CELL_72 0x4228 +#define POLL_CELL_73 0x4229 +#define POLL_CELL_74 0x422A +#define POLL_CELL_75 0x422B +#define POLL_CELL_76 0x422C +#define POLL_CELL_77 0x422D +#define POLL_CELL_78 0x422E +#define POLL_CELL_79 0x422F +#define POLL_CELL_80 0x4230 +#define POLL_CELL_81 0x4231 +#define POLL_CELL_82 0x4232 +#define POLL_CELL_83 0x4233 +#define POLL_CELL_84 0x4234 +#define POLL_CELL_85 0x4235 +#define POLL_CELL_86 0x4236 +#define POLL_CELL_87 0x4237 +#define POLL_CELL_88 0x4238 +#define POLL_CELL_89 0x4239 +#define POLL_CELL_90 0x423A +#define POLL_CELL_91 0x423B +#define POLL_CELL_92 0x423C +#define POLL_CELL_93 0x423D +#define POLL_CELL_94 0x423E +#define POLL_CELL_95 0x423F +#define POLL_CELL_96 0x4240 void setup_battery(void); void transmit_can(CAN_frame* tx_frame, int interface);