Browsed by
Category: Data

Surprisingly good pack balancing

Surprisingly good pack balancing

One of the notorious details of lithium batteries is the need to keep all of the cells in balance. With a string in series, the total voltage can stay within safe limits but individual cell-level voltages can be dangerously high if other cells are correspondingly low. The trick is to keep all of the cells “balanced”, and that is what LiPo chargers have to do actively. Inside power tools and laptops the balancing is handled behind the scenes; for phones there is no need since they use single cells.

The “cell-level” voltages that matter in my homebrewbattery are the packs that contain 10 (soon to be 20) cells in parallel. I divided the individual cells up into packs to try and achieve similar capacities for all seven, but it was not possible to achieve perfection. Even then, the capacities I measured were at a 1 A discharge current – and actual performance of each pack will also depend on other parameters such as internal resistance. I had no way to predict how well the packs would stay balanced after a few charge-discharge cycles.

In the long term I want to get a nice battery monitoring system that takes care of balancing, but my design goals are to start cheap and bootstrap the battery. To keep with the data-focused approach that has proved interesting so far, I decided to simply log the pack voltages occasionally to “manually monitor” the state of balance. My target was to have the packs stay reasonably balanced for a week at a time, and if that was possible then I’d use a hobby charger to do an active balance every weekend. Here’s the data so far:

After nearly a month the packs are still almost indistinguishable from each other in voltage – the variation is within bounds of +/- half a percent! During October 10-12 the packs became a bit more unbalanced, but that corresponded to the deepest level of discharge during the experiment so far (a week of cloudy days and storms made it hard for the solar charger to keep up with battery use). A more prominent imbalance at deeper discharge is not surprising. Imagine a set of buckets of slightly different size that start full of water, so that they are all at “100%”. If exactly the same volume of water is removed from each bucket, then there will be differing amounts of water left in each. When most of the water is gone, there may be a bucket which is essentially empty and one which is still 20% full – the imbalance will appear enormous. Filling the same quantity of water back into each bucket will return them all to 100% full and exactly balanced. This shows up for my battery, since the packs returned to closer balance when the battery charged after those darker days.

It is interesting to ponder what the “safety threshold” for imbalance might be. The PCM 60x charge controller is configured to reach a maximum battery voltage of 28.6 V, which is about 4.085 V per pack. I’m deliberately stopping short of the 4.2 V upper limit for LiPo cells, because this provides a safety buffer and increases the longevity of the cells. If a pack was undervoltage and another was overvoltage by compensating amounts, the dangerous point would be when the high pack went past 4.2 V. This extreme situation corresponds to the packs pushing past an envelope of +/- 2.8%.

This chart is live – and I’m adding it to my statistics page. Follow along with me as I wait for imbalance to creep in – but at this rate I’ll be fine until Christmas!

Characterising the solar charge

Characterising the solar charge

I was excited earlier this week when my battery fully charged in a day, but it left me wondering how that charge had progressed. The solar panel is only leaning against the house for now, and it faces west. I wanted to watch the charging activity, but frustratingly have to spend the sunny part of the day away from home at work.

A full battery doesn’t need charging, and so I powered my laptop from the homebrewbattery for about 4 hours in the evening while researching how to log charging data from my PCM 60x charge controller. I estimated about 120-150 Wh of energy were used. In the morning I left a computer logging the PCM 60x every minute.

The battery was fully charged by 2pm! This is surprising since the solar panel points to the afternoon sun – and this is actually “visible” in the data because the 265 W panel only reached a maximum of 90 W before it scaled back due to the battery being at maximum voltage. By numerically integrating the shaded area under the charging power plot, I discovered that the battery took 135 Wh of energy to be charged. This is spot-on my estimate of how much I had flattened it!

The obvious conclusion from this successful test is that I need more cells to make my battery bigger. Back to the cell-testing regime for now…

Reached first set – 70 good cells!

Reached first set – 70 good cells!

I’ve been interrupted by a family holiday, but just before leaving on that trip I reached the first real milestone for my battery build: 70 cells. This will allow me to make half-packs (10 cells each) and produce a fully-functioning 24 volt battery prototype. In the process I will be able to optimise the techniques for pack construction.


I’m calling each set of 7 packs a “string”, so that the battery is made up of strings which are made up of packs which are made up of cells. This first string of 70 cells has 0.518 kWh of storage, which is slightly above my estimate of 1 kWh per complete 140-cell string. My initial estimates of achievable cell capacity have turned out to be reasonable.

Just a few of these cells have had their plastic cover damaged by the extraction process, and the orange sleeves are sitting on top in this photo ready to be fitted as replacements. Obviously, some care must be put into the cell arrangement within a pack for visual appeal.

Dividing the 70 cells into packs is less arbitrary, because it is vital to have the packs as balanced as possible. I devised a simple algorithm as a starting point, and it has turned out to be remarkably effective.

  1. Sort the cells by capacity from highest to lowest.
  2. Take the top 7 cells in this list and distribute them in order into packs 1-7.
  3. Take the next 7 cells in this list and distribute them in reverse order into packs 7-1.
  4. Continue down the rest of the list, filling in this “zig-zag” manner.

This means that pack 1 gets the highest capacity cell, but then only the 14th in the list. Pack 7 gets the 7th in the list, but then also the 8th. This process produced packs ranging from 20.5 Ah to 20.59 Ah, and that 4% variation can be handled by balance-charging.

Deciding thresholds for cell categories

Deciding thresholds for cell categories

One decision that I initially postponed was the threshold to use for labelling a cell as “good”. I wanted to keep the storage ability as high as possible by using only cells with a high capacity, but I also wanted to be realistic and avoid “disqualifying” a big majority of the reclaimed cells. I decided to wait a bit and see what the data suggested.

After testing 20 cells I had an almost perfect dichotomy between dead cells (assigned a nominal capacity <1 mAh) and cells with capacities over 1900 mAh. The following histogram illustrates this situation, with the dead cells omitted as they are not interesting.

The histogram looked nice with 200 mAh bins, and that suggested a threshold for “good” of 1800 mAh. I still had plenty of cells to test, but adopted this as my draft categorisation to start counting how many good cells I was accumulating. Another nice thing about this threshold is that having an average cell capacity of 1930 mAh means that a 7s20p battery is almost exactly 1 kWh of storage (1.93 Ah × 3.7 V ×  7 series × 20 parallel).

By the time I had tested 100 cells, the picture was surprisingly similar. There were no longer any empty bins in the histogram, but the cluster above 1800 mAh remained. The chart below shows that a second smaller cluster had started to appear above a threshold of 1000 mAh.

I was noticing cells turning up with capacity between 1000 mAh and 1800 mAh which were otherwise perfectly passing all my tests, and it seemed a shame to throw them away with the dead cells. The appearance of this second cluster led me to introduce a third category of “poor” cells, and I can think about what to do with them later.

The clustering in the cell capacity distribution is fascinating and caught me by surprise. It is still clearly visible in my histogram (currently 172 cells have been tested).