diff --git a/Software/src/battery/BATTERIES.h b/Software/src/battery/BATTERIES.h index d68a892f..1880d8e8 100644 --- a/Software/src/battery/BATTERIES.h +++ b/Software/src/battery/BATTERIES.h @@ -32,4 +32,9 @@ #ifdef TEST_FAKE_BATTERY #include "TEST-FAKE-BATTERY.h" //See this file for more Fake battery settings #endif + +#ifdef SERIAL_LINK_RECEIVER_FROM_BATTERY +#include "SERIAL-LINK-RECEIVER-FROM-BATTERY.h" +#endif + #endif diff --git a/Software/src/battery/SERIAL-LINK-RECEIVER-FROM-BATTERY.cpp b/Software/src/battery/SERIAL-LINK-RECEIVER-FROM-BATTERY.cpp new file mode 100644 index 00000000..55641393 --- /dev/null +++ b/Software/src/battery/SERIAL-LINK-RECEIVER-FROM-BATTERY.cpp @@ -0,0 +1,86 @@ +// SERIAL-LINK-RECEIVER-FROM-BATTERY.cpp + +#include "SERIAL-LINK-RECEIVER-FROM-BATTERY.h" + +#define INVERTER_SEND_NUM_VARIABLES 3 //--- comment out if nothing to send +#define INVERTER_RECV_NUM_VARIABLES 16 + +#ifdef INVERTER_SEND_NUM_VARIABLES + const uint8_t sendingNumVariables = INVERTER_SEND_NUM_VARIABLES; +#else + const uint8_t sendingNumVariables = 0; +#endif + +// txid,rxid, num_send,num_recv +SerialDataLink dataLinkReceive(Serial2, 0, 0x01, sendingNumVariables, + INVERTER_RECV_NUM_VARIABLES); // ... + + + + +void __getData() +{ + SOC = (uint16_t) dataLinkReceive.getReceivedData(0); + StateOfHealth = (uint16_t) dataLinkReceive.getReceivedData(1); + battery_voltage = (uint16_t) dataLinkReceive.getReceivedData(2); + battery_current = (uint16_t) dataLinkReceive.getReceivedData(3); + capacity_Wh = (uint16_t) dataLinkReceive.getReceivedData(4); + remaining_capacity_Wh = (uint16_t) dataLinkReceive.getReceivedData(5); + max_target_discharge_power = (uint16_t) dataLinkReceive.getReceivedData(6); + max_target_charge_power = (uint16_t) dataLinkReceive.getReceivedData(7); + bms_status = (uint16_t) dataLinkReceive.getReceivedData(8); + bms_char_dis_status = (uint16_t) dataLinkReceive.getReceivedData(9); + stat_batt_power = (uint16_t) dataLinkReceive.getReceivedData(10); + temperature_min = (uint16_t) dataLinkReceive.getReceivedData(11); + temperature_max = (uint16_t) dataLinkReceive.getReceivedData(12); + cell_max_voltage = (uint16_t) dataLinkReceive.getReceivedData(13); + cell_min_voltage = (uint16_t) dataLinkReceive.getReceivedData(14); + batteryAllowsContactorClosing = (uint16_t) dataLinkReceive.getReceivedData(15); +} + +void updateData() +{ + // --- update with fresh data + /* + dataLinkReceive.updateData(0,var1); + dataLinkReceive.updateData(1,var2); + dataLinkReceive.updateData(2,var3); + */ +} + + +/* +* @ 9600bps, assume void manageSerialLinkReceiver() +* is called every 1mS +*/ + +void manageSerialLinkReceiver() +{ + dataLinkReceive.run(); + bool readError = dataLinkReceive.checkReadError(true); // check for error & clear error flag + if (dataLinkReceive.checkNewData(true)) // true = clear Flag + { + __getData(); + } + + + + #ifdef INVERTER_SEND_NUM_VARIABLES + static bool initLink=false; + static unsigned long updateTime = 0; + if (! initLink) + { + initLink = true; + // sends variables every 5000mS even if no change + dataLinkReceive.setUpdateInterval(5000); + } + unsigned long currentTime = millis(); + if (currentTime - updateTime > 100) + { + updateTime = currentTime; + dataLinkReceive.run(); + bool sendError = dataLinkReceive.checkTransmissionError(true); // check for error & clear error flag + updateData(); + } + #endif +} diff --git a/Software/src/battery/SERIAL-LINK-RECEIVER-FROM-BATTERY.h b/Software/src/battery/SERIAL-LINK-RECEIVER-FROM-BATTERY.h new file mode 100644 index 00000000..04ebe799 --- /dev/null +++ b/Software/src/battery/SERIAL-LINK-RECEIVER-FROM-BATTERY.h @@ -0,0 +1,51 @@ +// SERIAL-LINK-RECEIVER-FROM-BATTERY.h + +#ifndef SERIAL_LINK_RECEIVER_FROM_BATTERY_H +#define SERIAL_LINK_RECEIVER_FROM_BATTERY_H + +#include +#include "../../USER_SETTINGS.h" +#include "../lib/SerialDataLink/SerialDataLink.h" + +// https://github.com/mackelec/SerialDataLink + +#define ABSOLUTE_MAX_VOLTAGE \ + 4040 // 404.4V,if battery voltage goes over this, charging is not possible (goes into forced discharge) +#define ABSOLUTE_MIN_VOLTAGE 3100 // 310.0V if battery voltage goes under this, discharging further is disabled + + +// These parameters need to be mapped for the inverter +extern uint16_t SOC; //SOC%, 0-100.00 (0-10000) +extern uint16_t StateOfHealth; //SOH%, 0-100.00 (0-10000) +extern uint16_t battery_voltage; //V+1, 0-500.0 (0-5000) +extern uint16_t battery_current; //A+1, Goes thru convert2unsignedint16 function (5.0A = 50, -5.0A = 65485) +extern uint16_t capacity_Wh; //Wh, 0-60000 +extern uint16_t remaining_capacity_Wh; //Wh, 0-60000 +extern uint16_t max_target_discharge_power; //W, 0-60000 +extern uint16_t max_target_charge_power; //W, 0-60000 +extern uint16_t bms_status; //Enum, 0-5 +extern uint16_t bms_char_dis_status; //Enum, 0-2 +extern uint16_t stat_batt_power; //W, Goes thru convert2unsignedint16 function (5W = 5, -5W = 65530) +extern uint16_t temperature_min; //C+1, Goes thru convert2unsignedint16 function (15.0C = 150, -15.0C = 65385) +extern uint16_t temperature_max; //C+1, Goes thru convert2unsignedint16 function (15.0C = 150, -15.0C = 65385) +extern uint16_t cell_max_voltage; //mV, 0-4350 +extern uint16_t cell_min_voltage; //mV, 0-4350 +extern bool batteryAllowsContactorClosing; //Bool, 1=true, 0=false + + + + + + +void manageSerialLinkReceiver(); + + + + + + + + + + +#endif \ No newline at end of file