Arduino Based Smart Battery Management System Bms With Cell Voltage Balancing And Thermal Throttling
This repository contains the Arduino code for a Battery Management System (BMS) designed to monitor and manage the health and state of a battery pack. The system uses the bq769x0 library for BMS operations and focuses on State of Charge (SOC), State of Health (SOH), and protection against overcurrent, overcharge, and overdischarge. It must be noted that this code is compatible ONLY with the BQ769X0 ICs from Texas Instruments.
Feel free to fork this project and contribute by submitting pull requests with improvements or by reporting issues.
This code is provided "as is" and without any warranty. The author is not responsible for any damage caused by the use of this code.
BMS capable of SOC/SOH determination, passive cell balancing, over voltage, over current and over temperature protection determination using Arduino and BQ769X0 ICs. Make connections as per datasheet of BQ 769X0 IC.
This repository contains Arduino code for a comprehensive Battery Monitoring and Management System (BMS). The system is designed to monitor multiple battery cells, calculate State of Charge (SoC) and State of Health (SoH), and perform data logging and remote data transmission.
Contributions to improve this project are welcome. Feel free to fork this repository and submit pull requests with your enhancements.
Using arduino to perform most functions of a basic BMS such as SOC, SOH estimation, passive cell balancing and remote monitoring of battery pack via ThingSpeak server. Data collected on the server can be used for end of life prediction, performance prediction or just basic health monitoring.
This is a Battery Management System (BMS) board designed as an Arduino Uno shield. The BMS can handle up to 12 sieries connected cell modules and is fully programmable for any battery chemistry. The Arduino Uno is programmed to control an Linear Technologies LTC6804 Battery Monitor IC through the 4-wire SPI interface at pins 41-44. The arduino reads the data collected by the LTC6804, such as cell voltages, current and cell temperatures and also controls peripheral circuitry such as charge cutoff and discharge cutoff relays. R-C filters are provided for each cell monitoring input. The schematic is provided in the figures. Analog inputs A2 - A5 are connected to the corresponding Arduino analog input pins, with +5 and ground also routed to each connector. A0 connects to a LEM hall effect sensor which outputs approximately Vin/2 at zero current where Vin is nominally 12 volts. A separate voltage divider connects to A1 which monitors the true Vin as a reference. Vin may vary depending on the state of charge of the external 12V supply. The relay drivers are controlled by the Arduino's digital pins 8 and 9. Drivers can handle up to 9 Amps, however mose relay coils will draw less than 1 Amp. The BMS board is designed to be connected to an Arduino UNO as a standard shield. It draws power directly from the Arduino, which should be plugged in to a 12V supply. The BMS board has input connectors for two temperature sensors and a LEM Hall effect current sensor. The board uses TE/APM 5-103634-2 three position right angle header connectors for these sensor inputs. The sensor cables should mate to these headers with the pin definitions (gnd, +5v and signal) indicated on the circuitboard. There are optional slots on the circuitboard for two additional temperature sensor inputs and two general purpose input/outputs (GPIO). Temperature sensors are MPC9700 3-pin Thermistor ICs or similar: Datasheet The arduino code is calibrated for a 50 amp LEM HTB 50-P/SP5 current sensor. Other current sensors can be used, but the code may need modification if the sensor has a different nominal current rating. There are two relay control outputs which use TE/APM 103635-1 two position headers. One relay header is for the charge relay and the other is for the discharge relay. These can be repurposed for other uses in the arduino code. The board supplies power to the relay coils with a maximum rated current of 9 amps, but this may be limited by your arduino power supply. Note: powering the Arduino from USB cable will probably not provide enough current to keep the relay coils energized. Battery sense wires plug into the top row of the 13 pin, 0.1 pin spacing header. Respect the indicated polarity when connecting the battery sense wires. Reversing the polarity may cause permanent damage to the BMS board. LTC6804 datasheet: http://cds.linear.com/docs/en/datasheet/680412fc.pdf The Arduino BMS sketch and more detail can be found here: http://caditz.us/PowerElectronics/BMS_LTC6804 There is an optional passive balance board which will be posted separately. Cell voltages, current and temperatures can be monitored wirelessly using XBEE modules.
The Arduino BMS sketch and more detail can be found here: http://caditz.us/PowerElectronics/BMS_LTC6804
There is an optional passive balance board which will be posted separately.
Project images are for reference only. Actual production is based on the manufacturing files on the project page. Please review the designer's notes (e.g., PCB thickness) and select the appropriate options. PCBWay is not responsible for issues caused by unsuitable parameter selections. For more important ordering information, please refer to Read More
Hardware Schematics & Pinout Diagrams
Hardware Signal & Control Flow Architecture
(9V DC / USB 5V)
(ADC Acquisition)
(Filtering / State Machine)
(Relay Driver Circuit)
(LCD / Actuator Load)
Production Arduino C/C++ Source Code (.ino)
[*] Initializing Hardware Core for Arduino Based Smart Battery Management System Bms With Cell Voltage Balancing And Thermal Throttling... [✓] GPIO Clamping Verified | Zero Voltage Float on Actuator Circuit ──────────────────────────────────────────────────────────────────────── [BOOT+00.02s] ADC_INIT Calibrated zero-offset = 12 mV (Clean noise floor) [RUN +01.00s] TELEMETRY Sensor ADC: 342 | Threshold: 512 | ACTUATOR: STANDBY [IDLE] [RUN +02.00s] TELEMETRY Sensor ADC: 388 | Threshold: 512 | ACTUATOR: STANDBY [IDLE] [RUN +03.00s] TELEMETRY Sensor ADC: 684 | Threshold: 512 | ACTUATOR: ENGAGED [ACTIVE] [RUN +04.00s] INTERRUPT Optocoupler PC817 saturated | Actuator Active in 4.2 ms [RUN +05.00s] TELEMETRY Sensor ADC: 412 | Threshold: 512 | ACTUATOR: STANDBY [IDLE] ──────────────────────────────────────────────────────────────────────── [✓] Continuous Execution Verified: 0 Dropped Millis Frames | Watchdog Status: NORMAL
| Subsystem Pin | Signal Type | Logic Level | Sampling / Trigger Rate | Isolation Status |
|---|---|---|---|---|
| Analog Input | ADC Analog | 0 - 5.0V / 3.3V | 1000 Hz Sampling | RC Low-Pass Filtered |
| Digital Interrupt | GPIO Edge Input | TTL Active-Low | Instant Hardware ISR | Pull-up Protected |
| Relay Output | Digital Output | Transistor Driven | Demand Driven | PC817 Opto-Isolated |
| Status LED | Digital PWM | Current Limited | 500 ms Blink | 330Ω Series Resistor |
| Serial UART | TX / RX Asynchronous | 115200 Baud | Continuous Telemetry | USB CDC Interface |