-
Seems to work..
01/29/2019 at 13:19 • 0 commentsI've now discharged 32 cells!
3 were 'bad' with a capacity below 200mAh.
Some were in the 1500mAh range.
The majority came in between 1800mAh to 2300mAh.
Some were from before I calibrated properly and were cycled again. They all went up in capacity a similar amount.
I've also tested several post-calibration cells twice to check consistency. They all went up in capacity between 80-150mAh on the second charge/discharge cycle. I'm assuming this was the result of bringing them back from ~2.8v and that they are regaining some capacity by being cycled.
<EDIT> I cycled two of these consistency check cells one more time.
The first one reported 3mAh higher capacity. The second one reported 42mAh higher.
That is way more consistent than I expected. I'll take it.
</EDIT>
I've also moved the same cell between discharge slots and so far the numbers look good.
-
We all float down here.
01/29/2019 at 07:47 • 0 commentsInputs to the ADC have no pulldowns. This was somewhat intentional.
- The pulldown resistors would ultimately be wired across the cell under test, which would continue to discharge the cell after the end of the cycle. A large value resistor on the order of 10k would probably be tolerable.
- I didn't have 8 of *any* value of resistor above > 470 ohms handy. (EDIT: I forgot I have a couple rolls of physically huge surface mount 499k resistors... that would probably do it, but I'm trying the software fix first anyway..)
- Nano has no INPUT_PULLDOWN? I guess I've been spoiled by the Teensy.
The immediate side effect of this is the settle time for the ADC without a cell plugged in is on the order of 10-30 seconds, which delays putting in the next cell. The trigger for starting the next discharge cycle is the ADC reading for the cell voltage dropping below 1v.
if ( Cell_Volt[cell] < 1) { // Low voltage = No cell. Reset for next. Serial.println("Ready"); analogWrite(Mosfet_Pin[cell], 0); State[cell] = READY;
Just touching the cell terminals fixes this, giving the remaining stray charge a path to ground.
I think I can solve this in software just by turning on the mosfet at a low PWM value, for a brief instant, just before every ADC reading while the discharge is NOT running. Of course this puts me back in the camp of continuing to discharge already discharged cells.
In the more dangerous camp, I could also digitalWrite the ADC pins low for a split second to clear the charge. Given they are sometimes hooked directly across a power source capable of delivering 20A or more, I would be relying on the Nano current limiting for its survival.
I'll be trying the mosfet PWM trick first I think. :)
EDIT: Turning on the mosfet briefly worked, and the cell bounced back after discharge to 3.4v. It doesn't look like 5ms of <1% PWM discharge is enough to pull down on a cell, but was plenty enough to clear the ADC pin charge. Done.
-
Why a balanced pack matters..
01/28/2019 at 23:43 • 0 commentsThings drift, heat-up, wear out, excetera... so a perfectly balanced pack after day one doesn't really exist. That's what a BMS is for... it makes up the little differences in the pack, and prevents bad scenarios.
However, to compensate for an otherwise fully charged pack where one set of cells needs to catch up, the BMS handles this by reducing the current to the entire pack, and shorting the fully charged cells slightly, so that the balancing current only travels through the cells that need it. A similar tactic is applied to discharging in that once one parallel set of cells is fully discharged, the BMS will 'open' the entire pack. Ride over, even if you had 25% or more in the remaining cells.
Ultimately this BMS protection kicking in is also why 2 out of 3 cells in a 'dead' surplus battery are usually fine and therefore is the reason we can build these packs for cheap to begin with... but I digress.
Bulk charging for a well balanced pack can happen in under an hour. Balance charging can literally take days. For example, my BMS is rated for 15A charging current, but once we enter balance charging land for leveling the cells, it is a painfully slow 56mA.
The better balanced the pack, the better the BMS will perform, and the happier you will be.
-
Calibration.
01/28/2019 at 09:00 • 0 commentsVoltage calibration.
The ADC in the Nano as setup uses its 5v regulator as the scale for measurements. Running the Nano from a PC USB port will likely result in less than 5v for this scale. If you do that, you will need to compensate for it.
Running it from a 12v wall wart or cheap USB charger mostly eliminates this issue, but you probably want to check anyway. So...
Measure the voltage on the Nano at the +5v pin with respect to ground.
Put this value in the .ino as Vcc.
// float Vcc = 4.88; // When run from PC USB float Vcc = 5.02; // When run from 12v
Measure the voltage across a cell. Compare this to the reported voltage.
If the ADC is reporting slightly off, you can adjust the value for Vcc in either direction a tiny bit until the reported voltage matches your meter.
Current calibration.
Reliably measuring resistance of less than 5 ohms can be problematic. It is ultimately much simpler to drop a known voltage across your resistor and measure the current that flows.
Tap in to between the cell negative terminal and the power mosfet with a current meter.
Set Discharge_Rate to 2000 in the .ino. With a 3 ohm resistor the current maxes out at ~1.2A. Setting the Discharge_Rate higher ensures that no PWM happens during calibration. Some meters don't like it.
float Discharge_Rate = 2000; // Discharge rate in mA. Will Adjust PWM to meet this.
Insert a cell. Wait for the cycle to start. Let things stabilize for 20 seconds or so.
Compare the current read by the Nano (via USB logging) with the current read by the meter.
If the current reported by the Nano is higher than the measured current, reduce the value set for that resistor in Res_Value. If it's 10% higher, reduce the value by 10% and such. Repeat until they match.
float Res_Value[4] = {3.18,3.02,3.18,3.18}; // Resistor Value in Ohm
Then repeat this for all four channels.
As with all 4 value arrays in the code, the values correspond to the 4 channels of the discharger.
Set the current back to 1000, so current control happens again.
float Discharge_Rate = 1000; // Discharge rate in mA.
Enjoy your calibrated cell discharger.