...
We will use a 0.2C discharge curve. We plan on doing this with the Chroma 6200D HV power supply. Once we have the discharge curve of the pack we can map voltage values to specific SOC values. The voltage value will represent the voltage UNDER LOAD. There will be inaccuracy due to varying voltages under load.
A 0.2C curve is roughly ~7.76A, which is what we expect our car to be at during cruising speed. Also, our implementation will use a function to control the voltage weighting.
...
My reasoning for this is that at high and low SOCs the discharge curve is significantly steeper. It is also non-linear in these regions. Coulomb counting is only effective for linear regions in the discharge curve, which is why voltage mapping is superior at the extreme ends. When we are less than 20% or greater than 80%, voltage weight will begin to ramp up.
Note: The current implementation as of September 22, 2024 does not use a 0.2C discharge curve. It instead uses the discharge curve found on this website https://lygte-info.dk/review/batteries2012/LG%2021700%20M50%205000mAh%20%28Grey%29%20UK.html I have taken the data off of the 0.2A per cell. Which is ~1.6A on the pack. That is why we have a predict_voltage() function, that accounts for the voltage lost by the internal resistance.
The general math behind this is:
Use a lookup table to find 2 voltage values such that VOLTAGE_LOW <= Pack_Voltage <= VOLTAGE_HIGH.
VOLTAGE_LOW and VOLTAGE_HIGH will map to a SOC %. We can interpolate between the two values to find a better approximation of the current SOC %.
...