Post Go back to editing

LTC6804-2 Non-linear/Incorrect Voltage Readings

Category: Hardware
Product Number: LTC6804-2

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.