Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
bq769x0.h@0:d92f936cf10d, 2021-07-31 (annotated)
- Committer:
- MPPT51
- Date:
- Sat Jul 31 09:12:21 2021 +0000
- Revision:
- 0:d92f936cf10d
commit_bms
Who changed what in which revision?
User | Revision | Line number | New 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 |