KIT Solar Car Project / Mbed 2 deprecated BMS_ver1

Dependencies:   mbed INA226gfg

Committer:
MPPT51
Date:
Sat Jul 31 09:12:21 2021 +0000
Revision:
0:d92f936cf10d
commit_bms

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MPPT51 0:d92f936cf10d 1 /* Battery management system based on bq769x0 for ARM mbed
MPPT51 0:d92f936cf10d 2 * Copyright (c) 2015-2018 Martin Jäger (www.libre.solar)
MPPT51 0:d92f936cf10d 3 *
MPPT51 0:d92f936cf10d 4 * Licensed under the Apache License, Version 2.0 (the "License");
MPPT51 0:d92f936cf10d 5 * you may not use this file except in compliance with the License.
MPPT51 0:d92f936cf10d 6 * You may obtain a copy of the License at
MPPT51 0:d92f936cf10d 7 *
MPPT51 0:d92f936cf10d 8 * http://www.apache.org/licenses/LICENSE-2.0
MPPT51 0:d92f936cf10d 9 *
MPPT51 0:d92f936cf10d 10 * Unless required by applicable law or agreed to in writing, software
MPPT51 0:d92f936cf10d 11 * distributed under the License is distributed on an "AS IS" BASIS,
MPPT51 0:d92f936cf10d 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
MPPT51 0:d92f936cf10d 13 * See the License for the specific language governing permissions and
MPPT51 0:d92f936cf10d 14 * limitations under the License.
MPPT51 0:d92f936cf10d 15 */
MPPT51 0:d92f936cf10d 16
MPPT51 0:d92f936cf10d 17 #ifndef BQ769X0_H
MPPT51 0:d92f936cf10d 18 #define BQ769X0_H
MPPT51 0:d92f936cf10d 19
MPPT51 0:d92f936cf10d 20 #include "mbed.h"
MPPT51 0:d92f936cf10d 21
MPPT51 0:d92f936cf10d 22 #define MAX_NUMBER_OF_CELLS 15
MPPT51 0:d92f936cf10d 23 #define MAX_NUMBER_OF_THERMISTORS 3
MPPT51 0:d92f936cf10d 24 #define NUM_OCV_POINTS 21
MPPT51 0:d92f936cf10d 25
MPPT51 0:d92f936cf10d 26 // IC type/size
MPPT51 0:d92f936cf10d 27 #define bq76920 1
MPPT51 0:d92f936cf10d 28 #define bq76930 2
MPPT51 0:d92f936cf10d 29 #define bq76940 3
MPPT51 0:d92f936cf10d 30
MPPT51 0:d92f936cf10d 31 // output information to serial console for debugging
MPPT51 0:d92f936cf10d 32 #define BQ769X0_DEBUG 1
MPPT51 0:d92f936cf10d 33
MPPT51 0:d92f936cf10d 34 class bq769x0 {
MPPT51 0:d92f936cf10d 35
MPPT51 0:d92f936cf10d 36 public:
MPPT51 0:d92f936cf10d 37 //bms1_output(PinName bms1_on)
MPPT51 0:d92f936cf10d 38 // initialization, status update and shutdown
MPPT51 0:d92f936cf10d 39 bq769x0(I2C& bqI2C, PinName alertPin, int bqType = bq76940, int bqI2CAddress = 0x18, bool crc = false);
MPPT51 0:d92f936cf10d 40 //bq769x0(I2C& bqI2C, PinName alertPin, int bqType = bq76930, int bqI2CAddress = 0x08, bool crc = true);
MPPT51 0:d92f936cf10d 41 //void init(); // kikkawa added
MPPT51 0:d92f936cf10d 42 void init1(); // kikkawa added
MPPT51 0:d92f936cf10d 43 void init2(); // kikkawa added
MPPT51 0:d92f936cf10d 44
MPPT51 0:d92f936cf10d 45 int checkStatus(); // returns 0 if everything is OK
MPPT51 0:d92f936cf10d 46
MPPT51 0:d92f936cf10d 47 void update(void);
MPPT51 0:d92f936cf10d 48 void update1(void); // added
MPPT51 0:d92f936cf10d 49 void update2(void); // added
MPPT51 0:d92f936cf10d 50
MPPT51 0:d92f936cf10d 51 void boot(PinName bootPin);
MPPT51 0:d92f936cf10d 52 void shutdown(void);
MPPT51 0:d92f936cf10d 53
MPPT51 0:d92f936cf10d 54 // charging control
MPPT51 0:d92f936cf10d 55 bool enableCharging(void);
MPPT51 0:d92f936cf10d 56 void disableCharging(void);
MPPT51 0:d92f936cf10d 57 bool enableDischarging(void);
MPPT51 0:d92f936cf10d 58 void disableDischarging(void);
MPPT51 0:d92f936cf10d 59
MPPT51 0:d92f936cf10d 60 // hardware settings
MPPT51 0:d92f936cf10d 61 void setShuntResistorValue(float res_mOhm);
MPPT51 0:d92f936cf10d 62 void setThermistorBetaValue(int beta_K);
MPPT51 0:d92f936cf10d 63
MPPT51 0:d92f936cf10d 64 void resetSOC(int percent = -1); // 0-100 %, -1 for automatic reset based on OCV
MPPT51 0:d92f936cf10d 65 void setBatteryCapacity(long capacity_mAh);
MPPT51 0:d92f936cf10d 66 void setOCV(int voltageVsSOC[NUM_OCV_POINTS]);
MPPT51 0:d92f936cf10d 67
MPPT51 0:d92f936cf10d 68 int getNumberOfCells(void);
MPPT51 0:d92f936cf10d 69 int getNumberOfConnectedCells(void);
MPPT51 0:d92f936cf10d 70
MPPT51 0:d92f936cf10d 71 // limit settings (for battery protection)
MPPT51 0:d92f936cf10d 72 void setTemperatureLimits(int minDischarge_degC, int maxDischarge_degC, int minCharge_degC, int maxCharge_degC, int hysteresis_degC = 2); // °C
MPPT51 0:d92f936cf10d 73 long setShortCircuitProtection(long current_mA, int delay_us = 70);
MPPT51 0:d92f936cf10d 74 long setOvercurrentChargeProtection(long current_mA, int delay_ms = 8);
MPPT51 0:d92f936cf10d 75 long setOvercurrentDischargeProtection(long current_mA, int delay_ms = 8);
MPPT51 0:d92f936cf10d 76 int setCellUndervoltageProtection(int voltage_mV, int delay_s = 1);
MPPT51 0:d92f936cf10d 77 int setCellOvervoltageProtection(int voltage_mV, int delay_s = 1);
MPPT51 0:d92f936cf10d 78
MPPT51 0:d92f936cf10d 79 // balancing settings
MPPT51 0:d92f936cf10d 80 void setBalancingThresholds(int idleTime_min = 30, int absVoltage_mV = 3400, int voltageDifference_mV = 20);
MPPT51 0:d92f936cf10d 81 void setIdleCurrentThreshold(int current_mA);
MPPT51 0:d92f936cf10d 82
MPPT51 0:d92f936cf10d 83 // automatic balancing when battery is within balancing thresholds
MPPT51 0:d92f936cf10d 84 void enableAutoBalancing(void);
MPPT51 0:d92f936cf10d 85 void disableAutoBalancing(void);
MPPT51 0:d92f936cf10d 86
MPPT51 0:d92f936cf10d 87 // battery status
MPPT51 0:d92f936cf10d 88 int getBatteryCurrent(void);
MPPT51 0:d92f936cf10d 89 int getBatteryVoltage(void);
MPPT51 0:d92f936cf10d 90 int getCellVoltage(int idCell); // from 1 to 15
MPPT51 0:d92f936cf10d 91
MPPT51 0:d92f936cf10d 92 int getCellVoltage1(int idCell); // from 1 to 15
MPPT51 0:d92f936cf10d 93 int getCellVoltage2(int idCell); // from 1 to 15
MPPT51 0:d92f936cf10d 94
MPPT51 0:d92f936cf10d 95 int getMinCellVoltage(void);
MPPT51 0:d92f936cf10d 96 int getMaxCellVoltage(void);
MPPT51 0:d92f936cf10d 97 int getAvgCellVoltage(void);
MPPT51 0:d92f936cf10d 98 float getTemperatureDegC(int channel = 1);
MPPT51 0:d92f936cf10d 99 float getTemperatureDegF(int channel = 1);
MPPT51 0:d92f936cf10d 100 float getSOC(void);
MPPT51 0:d92f936cf10d 101 int getBalancingStatus(void);
MPPT51 0:d92f936cf10d 102
MPPT51 0:d92f936cf10d 103 // interrupt handling (not to be called manually!)
MPPT51 0:d92f936cf10d 104 void setAlertInterruptFlag(void);
MPPT51 0:d92f936cf10d 105
MPPT51 0:d92f936cf10d 106 //public kara idou
MPPT51 0:d92f936cf10d 107
MPPT51 0:d92f936cf10d 108 #if BQ769X0_DEBUG
MPPT51 0:d92f936cf10d 109 void printRegisters(void);
MPPT51 0:d92f936cf10d 110 #endif
MPPT51 0:d92f936cf10d 111
MPPT51 0:d92f936cf10d 112 private:
MPPT51 0:d92f936cf10d 113 //DigitalOut _bms1_on;
MPPT51 0:d92f936cf10d 114
MPPT51 0:d92f936cf10d 115 // Variables
MPPT51 0:d92f936cf10d 116
MPPT51 0:d92f936cf10d 117 I2C& _i2c;
MPPT51 0:d92f936cf10d 118 Timer _timer;
MPPT51 0:d92f936cf10d 119 InterruptIn _alertInterrupt;
MPPT51 0:d92f936cf10d 120
MPPT51 0:d92f936cf10d 121 int I2CAddress;
MPPT51 0:d92f936cf10d 122 int type;
MPPT51 0:d92f936cf10d 123 bool crcEnabled;
MPPT51 0:d92f936cf10d 124
MPPT51 0:d92f936cf10d 125 float shuntResistorValue_mOhm;
MPPT51 0:d92f936cf10d 126 int thermistorBetaValue; // typical value for Semitec 103AT-5 thermistor: 3435
MPPT51 0:d92f936cf10d 127 int *OCV; // Open Circuit Voltage of cell for SOC 100%, 95%, ..., 5%, 0%
MPPT51 0:d92f936cf10d 128
MPPT51 0:d92f936cf10d 129 // indicates if a new current reading or an error is available from BMS IC
MPPT51 0:d92f936cf10d 130 bool alertInterruptFlag;
MPPT51 0:d92f936cf10d 131
MPPT51 0:d92f936cf10d 132 int numberOfCells; // number of cells allowed by IC
MPPT51 0:d92f936cf10d 133 int connectedCells; // actual number of cells connected
MPPT51 0:d92f936cf10d 134 int cellVoltages[MAX_NUMBER_OF_CELLS]; // mV
MPPT51 0:d92f936cf10d 135 int idCellMaxVoltage;
MPPT51 0:d92f936cf10d 136 int idCellMinVoltage;
MPPT51 0:d92f936cf10d 137 long batVoltage; // mV
MPPT51 0:d92f936cf10d 138 long batCurrent; // mA
MPPT51 0:d92f936cf10d 139 int temperatures[MAX_NUMBER_OF_THERMISTORS]; // °C/10
MPPT51 0:d92f936cf10d 140
MPPT51 0:d92f936cf10d 141 long nominalCapacity; // mAs, nominal capacity of battery pack, max. 1193 Ah possible
MPPT51 0:d92f936cf10d 142 long coulombCounter; // mAs (= milli Coulombs) for current integration
MPPT51 0:d92f936cf10d 143
MPPT51 0:d92f936cf10d 144 // Current limits (mA)
MPPT51 0:d92f936cf10d 145 long maxChargeCurrent;
MPPT51 0:d92f936cf10d 146 long maxDischargeCurrent;
MPPT51 0:d92f936cf10d 147 int idleCurrentThreshold; // mA
MPPT51 0:d92f936cf10d 148
MPPT51 0:d92f936cf10d 149 // Temperature limits (°C/10)
MPPT51 0:d92f936cf10d 150 int minCellTempCharge;
MPPT51 0:d92f936cf10d 151 int minCellTempDischarge;
MPPT51 0:d92f936cf10d 152 int maxCellTempCharge;
MPPT51 0:d92f936cf10d 153 int maxCellTempDischarge;
MPPT51 0:d92f936cf10d 154 int cellTempHysteresis;
MPPT51 0:d92f936cf10d 155
MPPT51 0:d92f936cf10d 156 // Cell voltage limits (mV)
MPPT51 0:d92f936cf10d 157 int maxCellVoltage;
MPPT51 0:d92f936cf10d 158 int minCellVoltage;
MPPT51 0:d92f936cf10d 159 int balancingMinCellVoltage_mV;
MPPT51 0:d92f936cf10d 160 int balancingMaxVoltageDifference_mV;
MPPT51 0:d92f936cf10d 161
MPPT51 0:d92f936cf10d 162 int adcGain; // uV/LSB
MPPT51 0:d92f936cf10d 163 int adcOffset; // mV
MPPT51 0:d92f936cf10d 164 int adcGain1; // uV/LSB // added
MPPT51 0:d92f936cf10d 165 int adcOffset1; // mV // added
MPPT51 0:d92f936cf10d 166 int adcGain2; // uV/LSB // added
MPPT51 0:d92f936cf10d 167 int adcOffset2; // mV // added
MPPT51 0:d92f936cf10d 168
MPPT51 0:d92f936cf10d 169 int errorStatus;
MPPT51 0:d92f936cf10d 170 bool autoBalancingEnabled;
MPPT51 0:d92f936cf10d 171 unsigned int balancingStatus; // holds on/off status of balancing switches
MPPT51 0:d92f936cf10d 172 int balancingMinIdleTime_s;
MPPT51 0:d92f936cf10d 173 unsigned long idleTimestamp;
MPPT51 0:d92f936cf10d 174
MPPT51 0:d92f936cf10d 175 unsigned int secSinceErrorCounter;
MPPT51 0:d92f936cf10d 176 unsigned long interruptTimestamp;
MPPT51 0:d92f936cf10d 177
MPPT51 0:d92f936cf10d 178 bool cellTempChargeErrorFlag;
MPPT51 0:d92f936cf10d 179 bool cellTempDischargeErrorFlag;
MPPT51 0:d92f936cf10d 180
MPPT51 0:d92f936cf10d 181 // Methods
MPPT51 0:d92f936cf10d 182
MPPT51 0:d92f936cf10d 183 bool determineAddressAndCrc(void);
MPPT51 0:d92f936cf10d 184
MPPT51 0:d92f936cf10d 185 void updateVoltages(void);
MPPT51 0:d92f936cf10d 186 void updateVoltages1(void); // added
MPPT51 0:d92f936cf10d 187 void updateVoltages2(void); // added
MPPT51 0:d92f936cf10d 188
MPPT51 0:d92f936cf10d 189 void updateCurrent(void);
MPPT51 0:d92f936cf10d 190 void updateTemperatures(void);
MPPT51 0:d92f936cf10d 191
MPPT51 0:d92f936cf10d 192 void updateBalancingSwitches(void);
MPPT51 0:d92f936cf10d 193
MPPT51 0:d92f936cf10d 194 void checkCellTemp(void);
MPPT51 0:d92f936cf10d 195
MPPT51 0:d92f936cf10d 196 int readRegister(int address);
MPPT51 0:d92f936cf10d 197 void writeRegister(int address, int data);
MPPT51 0:d92f936cf10d 198
MPPT51 0:d92f936cf10d 199 };
MPPT51 0:d92f936cf10d 200
MPPT51 0:d92f936cf10d 201 #endif // BQ769X0_H
MPPT51 0:d92f936cf10d 202