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.



  • It sounds like you're experiencing voltage saturation, which can occur when the voltage being measured exceeds the range of the analog-to-digital converter (ADC) on the microcontroller. When this happens, the ADC output becomes non-linear and inaccurate, which can make it difficult to measure the voltage accurately.

    To address this issue, you could consider:

    1. Using a voltage divider circuit to reduce the input voltage to within the range of the ADC. A voltage divider consists of two resistors in series, with the input voltage applied across the resistors and the output voltage taken from the junction between them. By choosing appropriate resistor values, you can create a voltage divider that scales the input voltage down to a level that the ADC can handle.

    2. Using an external ADC with a higher input voltage range. Many external ADCs are available with higher input voltage ranges than the built-in ADC on microcontrollers. You could connect one of these ADCs to your microcontroller and use it to measure the voltage accurately.

    3. Reducing the voltage range of the input signal. If you can't use a voltage divider or external ADC, you could try reducing the voltage range of the input signal by using a voltage regulator or a zener diode to clamp the voltage to a lower level.

    It's worth noting that the accuracy of the voltage measurements can also be affected by noise, so you should ensure that the input signal is filtered and free from any electrical interference.

  • Thanks for your detailed reply. We checked for each pin that the input voltage was within the range of the ADC (based on the datasheet and measurements of Vreg). Do you know any other problems which might cause this behavior?

Reply Children
No Data