We're building a BMS using an LTC6804-2 with an Arduino Micro connected over SPI (non-iso). We've attached a schematic and Arduino code below.
Our LTC6804-2 chips have been giving us jumping/non-linear voltage readings for all 12 Cells.
As for the discontinuities, when cell voltages are higher than 3.277 V (2^15 *0.1 mV) the measurements are close to correct, but between 1.625 V and 3.250 V, they read as 1.625 V lower than their true value, which could be the result of a bit error in the reading or otherwise missing certain bits. At lower voltages there are also numerous discontinuities in the reading. The readings are all stable for a given input, they're just often wrong. For the primary issue, it seems that the second most significant bit is remaining 0 for the lower half of the range, where it should be switching to 1 for the second quarter of the range.
We also noticed that as we increased the voltage above 3.300 V, the voltages started to level off and become non-linear. The non-linear readings have a big effect on the overall accuracy - E.g. 3.50 V, 4.0 V and 4.5 V all get read as ~3.4 V, so we we are unable to monitor accurately.
The fact that the readings are able to be correct at certain values indicates that the chip/board connections should all be correct, along with SPI communication and the Arduino code.
We have tried the following with no luck:
- Tried multiple chips and batteries
- Changing SPI clock frequencies to 500 kHz down from 1 MHz
- Changing the set_adc speeds to all 6 configurations
- Changing the WRCFG array to most conceivable configurations (with/without under/overvoltage protect values, GPIO's on/off, REFON/SWTRD/ADCOPT on/off, DCTO[3] on/off)
- Reading individual registers using LTC6804_rdcv_reg (still see bad values)
- Shorting the SWTEN pin to Vref
- Removing all floats etc from the Arduino code and checking the conversions before it is sent as a CAN message and using different rewriting methods.
Any help would be dearly appreciated.