Battery Pack, individual cell voltage measurement

Check out the linked pdf doc.

Wow, +-250V CMRR. That's impressive.

separate Arduino processors, powered at different points in the battery chain, and each reading 6 A/D channels,

I also was thinking about this overnight. I thought that my above design could be modified to handle either 6 batteries (although 6x15v is getting too high for good resolution) or maybe "12 volts" where that is made up of various combinations, 6x2v, 3x4v, 2x6v or 1x12v.

You would then hang boards at various location on the battery string as required. In the case of this thread's application that would mean 3 batteries per board or 15 boards, maybe as few as 8 if you up the range per board.

Another option it to incorporate a special monitor chip like the 12-channel MAX11068, they can only handle 5v per cell which is no good for me but would work here. Also there's the LTC6802.


Rob

The off the shelf battery management system that is failing, is it a balancer type system or just a battery monitor.
A balancer type does more than just measure individual cell voltage.

Or just one with a 2 pole 45 throw switch ahead of the opamp.

Can you get those at Radio Shack?

A balancer type does more than just measure individual cell voltage.

Good point mauried.

@phoyt
How much to these gadgets cost?


Rob

That's what I'm talking about @oric_dan. You only need 4 banks, and 4 Megas for 0.04v resolution.
45x2 tiny resistors. No other hardware.

relays for computer logic gates.

We did an entire runway lighting control system with relays once, 1000s of them in 19" racks, all plug-in modules with NAND, AND, OR, flip flop etc functions and all at 48 volts.

It was destined for an Asian country (Malaysia I think) and the design brief was that it had to be simple technology that the "natives" could fix.

and 4 Megas

You didn't mention 4 megas originally which partly explains why I didn't get it but you still have to isolate the megas from each other. This means powering each mega off it's bank, then having an isolated comms link. Is that what you have in mind?


Rob

You got it Rob!

I'm not the fastest horse in the race, but I get there eventually :slight_smile:

I've modified my design to allow monitoring of 6 batteries and 2 temperatures. If phoyt or anyone is interested I'll post the new design. This is very similar to what you're proposing but without the extra crap that comes with a Mega and that isn't needed. However with mine you still need a single Arduino (just a small one will do) to talk to a PC, display the results etc.


Rob

We did an entire runway lighting control system with relays once, 1000s of them in 19" racks, all plug-in modules with NAND, AND, OR, flip flop etc functions and all at 48 volts.

It was destined for an Asian country (Malaysia I think) and the design brief was that it had to be simple technology that the "natives" could fix.

And the byline to this is that they could hear it in Indonesia.
[check your map if you don't know geography].

Would it be possible to use zener diodes to drop the voltages down into the range that the Arduino can measure?

Nope, leastways I can't think of a way to use zeners.

If you just want to drop the voltage down the easiest way is to use 45 voltage dividers, all set to provide the best range possible for the voltage at that point in the battery string.

Truth is that's probably the simplest method but it's not scalable, picking all the resister would be a pain and this approach needs 46 wires. Also it means some very high voltages are on your PCB, something I would not be happy with.


Rob

With my idea, there is no reason to use different values for each resistor. Only 2 values are needed. Sure with different values you could get more precision with the first few cells, but the one at the end would only get 0.04v precision. So why not just use the same resistors for all, giving them all the same precision instead of increasing the precision of the first cell to 5/1024v. Maybe I haven't explained it properly. It seems like Rob and Dan got it.

Peter is on to something. If you use Zeners to drop the 30-40v wires toward the end in my plan down to 10v, you would get more precision, if you needed it. Everything would have to be calibrated manually in software with a DMM. With this method, and 45 inputs, you could possible do it with only 1 Mega?

Graynomad:
Nope, leastways I can't think of a way to use zeners.

If you just want to drop the voltage down the easiest way is to use 45 voltage dividers, all set to provide the best range possible for the voltage at that point in the battery string.

The voltage divider approach obviously loses resolution the further you need to drop the voltage - I don't know what resolution is needed here, but there must come a point where the voltage is so high that it isn't possible to achieve enough resolution.

I was thinking with the zener something like connecting each battery junction to a zener and then through a voltage divider to ground, the idea being that the zener would drop the voltage by a known constant amount to bring the voltage down to a range that can be measured, with no loss of resolution.

By the time you have several cells in series all with varying voltages the range of values that needs to be measured could easily exceed 5V hence the voltage dividers to reduce the range - still some loss of resolution due to the voltage dividers used for that, but nothing like as much as there would have been if dividers were used to drop the full voltage down to 5V.

Works for me! This is the easiest solution for hardware. Calibrating it using a DMM in the code will take some time and effort.

I get the zener idea now (told you I was slow), but if each voltage divider is tuned to the voltage surely there's no loss of resolution anyway.

We haven't heard from the OP since post #7 so as is often the case we're talking to ourselves, still it's good to bounce some ideas around.


Rob

Hello
Would the temperature coeff. of zener/avalanche diodes skew the accuracy ?
http://users.tpg.com.au/users/ldbutler/ZenerDiodes.htm
jolphil

I realize this is old. But I'm working on a vary similar project using LifePo4 batteries. My batteries modules are from the Fisker cars. There 24v each. I am trying to brake them up to 12v. I am planning on splitting the packs to get 2 12v batteries out of each module. I had thought about using voltage dividers but that is assuming that the other cells before the cell you would like to measures stay at the same voltage. so if a cell that is before the one you would like to measure is low that will throw off the sell that you are measuring. Switching between cells sounds like a good idea. instead of using relays could you use transistors? How would you write the code for that?? Also I would like to have a serial print so it would need to tell me what the cell voltages are. I guess you can do that with a delay of some kind. I have a basic sketch made up for 4 cells using the analog inputs that will trigger a digital output if any of the 4 cells goes below a certain threshold voltage. That would trigger an external alarm/relay to pull that module out of the group. I have 4 of the 24v modules that i was going to do this mod to and parallel them in my battery bank. Each module will be getting a monitor. I was also planning on having individual cell balancing driven by a comparator to trigger a mosfet to a resistor bank. That would keep the cells from over charging in the event one or two cells have not fully charged.

There are a bunch of good ideas here.

Hope this can revive some of them.

Thanks Rich.

"Switching between cells sounds like a good idea. instead of using relays could you use transistors?"

I lean toward mechanical relays for this ( double pole). Transistors have voltage drop, relays do not.

Each relay can switch in a cell ( positive, and ground), to be tested, using only one analog pin.

Thanks for the quick reply.

I thought it would be something like that. ( voltage drop across transistors) I have started writing a new sketch. I'm getting a little lost on how to have it print the reading of individual cells and hold it till it reads that cell again. I will post a copy of what I have so far. Maby you can tell me if I'm on the right track.

Thanks again.
Rich.

int safty = 13;
int check = 12;
int threshold = 2.5;

int Cellv = A0;
int CellVal = 0;
float Cellpin = 0;
float CellVoltage = 0;

int gnd = 2;
int Cell1 = 3;
int Cell2 = 4;
int Cell3 = 5;
int Cell4 = 6;


  void setup(){
    Serial.begin(9600);
    
pinMode(safty, OUTPUT);
pinMode(check, INPUT);

pinMode(Cell1, OUTPUT);
pinMode(Cell2, OUTPUT);
pinMode(Cell3, OUTPUT);
pinMode(Cell4, OUTPUT);

}
 
 
   void loop(){
    
    int checkVal = digitalRead(check);
    int sampleCellVal = 0;
    int avgCellVal = 0;
    
    for (int x = 0; x< 10; x++){
      
      CellVal = analogRead (Cellv);
      sampleCellVal = sampleCellVal + CellVal;
      
      digitalWrite(Cell1, HIGH); delay(0.0);
      digitalWrite(Cell1, LOW); delay(0.5);
      digitalWrite(Cell2, HIGH); delay(1.0);
      digitalWrite(Cell2, LOW); delay(1.5);
      digitalWrite(Cell3, HIGH); delay(2.0);
      digitalWrite(Cell3, LOW); delay(2.5);
      digitalWrite(Cell4, HIGH); delay(3.0);
      
      
      
      if (CellVoltage < threshold) digitalWrite(safty, HIGH);
      else{ digitalWrite(safty,LOW);
      
    }


delay (10);

    }
    
    avgCellVal = sampleCellVal /10;
    Cellpin = avgCellVal * 0.00610;
    
    CellVoltage = Cellpin;
    
    
    
    
delay(10);
   }

I know I said I was going to have 2 groups of 4 cells. But for trial I'm only going to do one group. I can add the other group after proof of concept. I'm also doing .5 seconds of read per cell. I'm not really shore if this is enough time to get an accurate reading?