Joined
·
3,904 Posts
Post:
It took a bunch of work to determine the relative capacity of each cell in @mmdepace 's car.
To make this process easier, I'm going to add the following feature to the firmware (pseudocode):
This will give us a QTY48 element array, where each element is the number of seconds cell N has spent discharging during the latest grid charge event.
LiBCM can then display this data to the user. Assuming the pack was initially balanced at 75% SoC:
-if all cells are similar, then all array elements should have similar values (ideally they would all be 0).
-cells with less capacity will self-discharge more (at rest, at idle etc).
-cells with more capacity will span a narrower voltage range (compared to cells with less capacity).
-The absolute value stored for each cell in the cellBalanceTimer_seconds array isn't important, but the difference between the various cells is.
-Outlier cells (i.e. that spend more or less time balancing) are suspect.
-a weaker cell will tend to self-discharge more often than healthy cells. Since healthy cells won't lose this energy (through self-discharge), they'll spend more time balancing. Therefore, weaker cells will likely tend to have lower stored values in the cellBalanceTimer_seconds array.
It took a bunch of work to determine the relative capacity of each cell in @mmdepace 's car.
To make this process easier, I'm going to add the following feature to the firmware (pseudocode):
Code:
uint16_t cellBalanceTimer_seconds[NUMCELLS]=0;
uint8_t balancingComplete = false;
if( gridChargerJustPluggedIn ) { clear cellBalanceTimer_seconds(); balancingComplete = false; } //set all array elements to zero
if( balancingFinished ) { balancingComplete = true; } //the first time balancing finishes, we stop accumulating the cell timers
if( hasOneSecondPassed && (balancingComplete == FALSE) ) {
for(cellNumber=1; cellNumber<NUMCELLS; cellNumber++) {
if(cellStatus[cellNumber] == BALANCING) { cellBalanceTimer_seconds[cellNumber]++; }
}}
LiBCM can then display this data to the user. Assuming the pack was initially balanced at 75% SoC:
-if all cells are similar, then all array elements should have similar values (ideally they would all be 0).
-cells with less capacity will self-discharge more (at rest, at idle etc).
-cells with more capacity will span a narrower voltage range (compared to cells with less capacity).
-The absolute value stored for each cell in the cellBalanceTimer_seconds array isn't important, but the difference between the various cells is.
-Outlier cells (i.e. that spend more or less time balancing) are suspect.
-a weaker cell will tend to self-discharge more often than healthy cells. Since healthy cells won't lose this energy (through self-discharge), they'll spend more time balancing. Therefore, weaker cells will likely tend to have lower stored values in the cellBalanceTimer_seconds array.