BMS (Home brew)

Written by chivey on July 5, 2026 Tags: Uncategorized

!!!Reference designs

I started thinking about a faster method of monitoring the batteries, than the me with DVM on each battery. There are several commercial solutions out there, but they start in the $300 range for a basic system. For those kind of dollars some custom design options could be considered. Some Google research I found some existing projects that had build simple BMS systems for EVs:

http://home.earthlink.net/~evtkw/evbattmon.html

http://genki.home.ionet.net/BattMon/BattMonArticle.html

!!!High level design

My idea was to try and build a simple monitoring device that would collect the data. Rather than build a custom module to be mounted in the card, I felt it would be nice to leverage other display devices I already own (~BlackBerry, iTouch, etc) which could be used for a variety of other purposes. The simple interface to such device is a basic web server and use the built in browser on the handheld device to display the data.

This approach has a number of advantages, it requires less engineering on the display side (just some basic web page design). It is also less expensive as the display device is always leveraged for other applications.

I found a basic PIC module for around $70 that has 12 ~ADCs, IP stack and even a web server demo application.

http://microcontrollershop.com/product_info.php?products_id=893&osCsid=cf78aef068dc74ad19a42afa585e5245

There is a mounting kit with a prototype card so that I can mount the interface on the prototype card and have the system nicely boxed up.

http://microcontrollershop.com/product_info.php?products_id=1389&osCsid=cf78aef068dc74ad19a42afa585e5245

!!!Schematics

Following the generic interface design, I used the basic opto-isolater interface design to connect the battery to the PIC ADC inputs.

!!!Calibration

I built that circuit up on a breadboard and carried some calibration tests

Measurements from test circuit

|!Vin|15|13.5|13|12|11|10|9|8|7|6|

|!~ADCin|1.05|1.50|1.64|1.95|2.26|2.57|2.88|3.19|3.51|3.82|

Plot

Finding the slope: y = mx + b (m = -3.2491, b = 18.4115)

Convert to 8bit and 10bit for ADC maths

|!Vin|15|13.5|13|12|11|10|9|8|7|6|

|!~ADCin|1.05|1.50|1.64|1.95|2.26|2.57|2.88|3.19|3.51|3.82|

|!8-bit val|54|77|84|100|116|132|147|163|180|196|

|!10-bit val|215|307|336|399|463|526|590|653|719|782|

8bit conversion formula:

{{{~BatV = -0.06338 * 8bADCval + 18.4115}}}

10bit conversion formula:

{{{~BatV = -0.01587 * 10bADCval + 18.4115}}}

!!!Web interface

!!!Prototype wiring