Cell voltages fork (SoC)
Dependencies: CUER_CAN CUER_DS1820 LTC2943 LTC6804 mbed PowerControl
CANParserBMU.cpp
- Committer:
- lcockerton62
- Date:
- 2016-12-30
- Revision:
- 3:527790e4965a
- Parent:
- 1:51477fe4851b
- Child:
- 5:793afeef45dc
File content as of revision 3:527790e4965a:
// Here are the functions to generate the CAN messages #include "CANParserBMU.h" #include "mbed.h" using namespace CAN_IDs; CANMessage createTemperatureTelemetry(uint8_t ID, uint32_t CMUSerialNumber, uint16_t PCBTemperature, uint16_t cellTemperature) { CANMessage msg; msg.len = 8; msg.id = BMS_BASE_ID + ID; // for voltage 0x601 - 0x6EF CAN_Data data; data.setLower_uLong(CMUSerialNumber); data.set_u16(2, PCBTemperature); data.set_u16(3, cellTemperature); for (int i = 0; i<8; i++) { msg.data[i] = data.get_u8(i); } return msg; } CANMessage createVoltageTelemetry(int ID, uint16_t voltage[]) { CANMessage msg; msg.len = 8; msg.id = BMS_BASE_ID + ID; // for voltage 0x601 - 0x6EF @TODO CAN_Data data; data.set_u16(0, voltage[0]); data.set_u16(1, voltage[1]); data.set_u16(2, voltage[2]); data.set_u16(3, voltage[3]); for (int i = 0; i<8; i++) { msg.data[i] = data.get_u8(i); } return msg; } CANMessage createPackSOC(float SOC, float percentageCharge) { CANMessage msg; msg.len = 8; msg.id = BMS_BASE_ID + BATTERY_SOC_ID; CAN_Data data; data.setLowerFloat(SOC); data.setUpperFloat(percentageCharge); for(int i=0; i<8; i++) { msg.data[i] = data.get_u8(i); } return msg; } CANMessage createPackBalanceSOC(float SOC, float percentageCharge) { // @TODO - check is this being used?? section 5.4 trituim BMU CAN data sheet CANMessage msg; msg.len = 8; msg.id = BMS_BASE_ID + BATTERY_SOC_BASE_ID; CAN_Data data; data.setLowerFloat(SOC); data.setUpperFloat(percentageCharge); for(int i=0; i<8; i++) { msg.data[i] = data.get_u8(i); } return msg; } CANMessage createCellVoltageMAXMIN(pack_voltage_extremes max_voltage, pack_voltage_extremes min_voltage) { //@TODO create a structure to store this data , so that the data is stored in the correct order CANMessage msg; msg.len = 8; msg.id = BMS_BASE_ID + MAX_MIN_VOLTAGE; CAN_Data data; data.set_u16(0,min_voltage.voltage); //Min voltage data.set_u16(1,max_voltage.voltage); //Max voltage data.set_u8(4,min_voltage.CMU_number); //CMU number of lowest cell data.set_u8(5,min_voltage.cell_number); //Cell number in CMU with lowest voltage data.set_u8(6,min_voltage.CMU_number); //CMU number of maxiumum cell data.set_u8(7,min_voltage.cell_number); //Cell number in CMU with highest voltage for(int i=0; i<8; i++) { msg.data[i] = data.get_u8(i); } return msg; } CANMessage createCellTemperatureMAXMIN(pack_temperature_extremes min_temperature, pack_temperature_extremes max_temperature) { //@TODO create a structure to store this data , so that the data is stored in the correct order CANMessage msg; msg.len = 8; msg.id = BMS_BASE_ID + MAX_MIN_TEMPERATURE; CAN_Data data; data.set_u16(0,min_temperature.temperature); //Min temperature data.set_u16(1,max_temperature.temperature); //Max temperature data.set_u8(4,min_temperature.CMU_number); //CMU number of lowest temperature cell data.set_u8(5,BLANK_DATA); //Dummy data data.set_u8(6,max_temperature.CMU_number); //CMU number of maxiumum temperature cell data.set_u8(7,BLANK_DATA); //Dummy data for(int i=0; i<8; i++) { msg.data[i] = data.get_u8(i); } return msg; } CANMessage createBatteryVI(uint32_t batteryVoltage,uint32_t batteryCurrent) { CANMessage msg; msg.len = 8; msg.id = BMS_BASE_ID + BATTERY_VI_ID; CAN_Data data; data.setLower_uLong(batteryVoltage); data.setHigher_uLong(batteryCurrent); for(int i=0; i<8; i++) { msg.data[i] = data.get_u8(i); } return msg; } CANMessage createBatteryPackStatus(uint16_t voltageThreshold[], uint8_t statusFlag,uint8_t BMS_CMU_Count,uint16_t BMS_Firmware_Build) { CANMessage msg; msg.len = 8; msg.id = BMS_BASE_ID + BATTERY_PACK_STATUS_ID; CAN_Data data; data.set_u16(0,voltageThreshold[0]); data.set_u16(1,voltageThreshold[1]); data.set_16(3,BMS_Firmware_Build); data.set_u8(4,statusFlag); data.set_u8(5,BMS_CMU_Count); for(int i=0; i<8; i++) { msg.data[i] = data.get_u8(i); } return msg; } CANMessage createExtendedBatteryPackStatus(uint32_t status) { CANMessage msg; msg.len = 8; msg.id = BMS_BASE_ID + BATTERY_STATUS_ID; CAN_Data data; data.setLower_uLong(status); //@TODO see the data sheet for this data.set_u8(4,0x00);//Hardware version random data @TODO check this data.set_u8(5,0x00);//Model ID @TODO check this data.set_u16(3,0x00); // Unused for(int i=0; i<8; i++) { msg.data[i] = data.get_u8(i); } return msg; } void convertFloatFloat(float lower, float upper, CANMessage& msg, bool littleEndian) { // Code taken from driver_controls //two converters for lower and higher float float2byte convL; float2byte convH; convL.f = lower; convH.f = upper; if(littleEndian) { for(int i=0; i<4; i++) { msg.data[i] = convL.b[i]; //offset for upper float msg.data[i+4]=convH.b[i]; } } else { for(int i=0; i<4; i++) { /* * Subtract because output data is Big Endian * i.e. convL/H is LSB --> MSB * output is MSB --> LSB */ msg.data[4-i] = convL.b[i]; msg.data[7-i] = convH.b[i]; } } }