Post Go back to editing

Reading wrong adc value sometimes - ad4695

Category: Software
Product Number: AD4695
Software Version: 0.0.0

Hello,

I am working with the [ADC Model, e.g., AD4695] in a project where I am reading analog input voltages and converting them to digital values. Most of the time, the ADC readings seem accurate and stable, giving voltage outputs in the expected range (around ~1.5V for my input signals). However, occasionally, I see readings drop to unexpectedly low values (e.g., below 0.5V or above 2. something), even though the input signal remains constant.

Here are the details of my setup:

i am using ftdi , here is the code 

from time import sleep
from pyftdi.spi import SpiController

# Initialize SPI Controller
spi = SpiController()
spi.configure('ftdi://ftdi:232h:FT79XLTB/1') # Adjust to your FTDI device URL
slave = spi.get_port(cs=0, freq=1.1e6, mode=3)

# Constants for ADC to Voltage Conversion
VREF = 2.5 # Reference Voltage
ADC_RESOLUTION = 16 # 16-bit ADC

def adc_to_voltage(adc_value, vref=2.5):
"""Convert raw ADC value to voltage."""
return (adc_value / (2**ADC_RESOLUTION - 1)) * vref

def decode_status(status_byte):
"""Decode the status byte."""
ov_alt = (status_byte >> 4) & 0x01 # Bit 4: OV_ALT
inx = status_byte & 0x0F # Bits [3:0]: INX (Channel Index)
return ov_alt, inx

try:

data = slave.exchange([0x80, 0x20], 1)
print(hex(data[0]))

# Step 3: Enable Advanced Sequencer
slave.write([0x00, 0x22, 0x7F]) # SEQ_CTRL: NUM_SLOTS_AS = 15
sleep(0.1)

# Step 4: Configure Advanced Sequencer Slots (IN0 to IN15)
slave.write([0x01, 0x00, 0x00]) # Slot 0: IN0
slave.write([0x01, 0x01, 0x01]) # Slot 1: IN1
slave.write([0x01, 0x02, 0x02]) # Slot 2: IN2
slave.write([0x01, 0x03, 0x03]) # Slot 3: IN3
slave.write([0x01, 0x04, 0x04]) # Slot 4: IN4
slave.write([0x01, 0x05, 0x05]) # Slot 5: IN5
slave.write([0x01, 0x06, 0x06]) # Slot 6: IN6
slave.write([0x01, 0x07, 0x07]) # Slot 7: IN7
slave.write([0x01, 0x08, 0x08]) # Slot 8: IN8
slave.write([0x01, 0x09, 0x09]) # Slot 9: IN9
slave.write([0x01, 0x0A, 0x0A]) # Slot 10: IN10
slave.write([0x01, 0x0B, 0x0B]) # Slot 11: IN11
slave.write([0x01, 0x0C, 0x0C]) # Slot 12: IN12
slave.write([0x01, 0x0D, 0x0D]) # Slot 13: IN13
slave.write([0x01, 0x0E, 0x0E]) # Slot 14: IN14
slave.write([0x01, 0x0F, 0x0F]) # Slot 15: IN15
print("Advanced Sequencer Slots Configured")
sleep(0.1)

# Step 5: Verify Each Slot Configuration (Explicit Reads)
data = slave.exchange([0x81, 0x00], 1)
print(f"Read: Address=0x0100, Data=0x{data[0]:02X}")

data = slave.exchange([0x81, 0x01], 1)
print(f"Read: Address=0x0101, Data=0x{data[0]:02X}")
#
data = slave.exchange([0x81, 0x02], 1)
print(f"Read: Address=0x0102, Data=0x{data[0]:02X}")

data = slave.exchange([0x81, 0x03], 1)
print(f"Read: Address=0x0103, Data=0x{data[0]:02X}")
#
data = slave.exchange([0x81, 0x04], 1)
print(f"Read: Address=0x0104, Data=0x{data[0]:02X}")

data = slave.exchange([0x81, 0x05], 1)
print(f"Read: Address=0x0105, Data=0x{data[0]:02X}")

data = slave.exchange([0x81, 0x06], 1)
print(f"Read: Address=0x0106, Data=0x{data[0]:02X}")

data = slave.exchange([0x81, 0x07], 1)
print(f"Read: Address=0x0107, Data=0x{data[0]:02X}")

data = slave.exchange([0x81, 0x08], 1)
print(f"Read: Address=0x0108, Data=0x{data[0]:02X}")

data = slave.exchange([0x81, 0x09], 1)
print(f"Read: Address=0x0109, Data=0x{data[0]:02X}")

data = slave.exchange([0x81, 0x0A], 1)
print(f"Read: Address=0x010A, Data=0x{data[0]:02X}")

data = slave.exchange([0x81, 0x0B], 1)
print(f"Read: Address=0x010B, Data=0x{data[0]:02X}")

data = slave.exchange([0x81, 0x0C], 1)
print(f"Read: Address=0x010C, Data=0x{data[0]:02X}")

data = slave.exchange([0x81, 0x0D], 1)
print(f"Read: Address=0x010D, Data=0x{data[0]:02X}")

data = slave.exchange([0x81, 0x0E], 1)
print(f"Read: Address=0x010E, Data=0x{data[0]:02X}")

data = slave.exchange([0x81, 0x0F], 1)
print(f"Read: Address=0x010F, Data=0x{data[0]:02X}")

# Step 6: Enable Autocycle Mode
slave.write([0x00, 0x23, 0x01]) # AC_CTRL: Enable Autocycle Mode
data = slave.exchange([0x80, 0x23], 1)
print(f"....., Data=0x{data[0]:02X}")
sleep(1)

# Step 5: Enter Conversion Mode
slave.write([0x00, 0x20, 0x14]) # SETUP: Enter Conversion Mode
while True:
# Read 3 bytes of SPI data: [MSB_ADC, LSB_ADC, status_byte]
# data = slave.exchange([0x00], 3)
data = slave.read(2)
msb = data[0] # First byte is the MSB
lsb = data[1] # Second byte is the LSB
# status_byte = data[2] # Third byte is the status byte
print(hex(msb), hex(lsb))
# Combine MSB and LSB for ADC value
adc_value = (msb << 8) | lsb

# Decode the status byte
# ov_alt, inx = decode_status(status_byte)a

# Convert ADC value to voltage
voltage = adc_to_voltage(adc_value, VREF)

# Print status and ADC readings
# print(f"Status: OV_ALT={ov_alt}, Channel Index=IN{inx}")
print(f"Raw ADC Value: {adc_value}, Voltage: {voltage:.4f} V")
print("----------------------------------------------------------------")

sleep(0.01) # Adjust delay as necessary


except Exception as e:
print(f"Error: {e}")

finally:
# Terminate SPI connection
spi.terminate()​

output --------------------------------------------------
0x10
Advanced Sequencer Slots Configured
Read: Address=0x0100, Data=0x00
Read: Address=0x0101, Data=0x01
Read: Address=0x0102, Data=0x02
Read: Address=0x0103, Data=0x03
Read: Address=0x0104, Data=0x04
Read: Address=0x0105, Data=0x05
Read: Address=0x0106, Data=0x06
Read: Address=0x0107, Data=0x07
Read: Address=0x0108, Data=0x08
Read: Address=0x0109, Data=0x09
Read: Address=0x010A, Data=0x0A
Read: Address=0x010B, Data=0x0B
Read: Address=0x010C, Data=0x0C
Read: Address=0x010D, Data=0x0D
Read: Address=0x010E, Data=0x0E
Read: Address=0x010F, Data=0x0F
....., Data=0x01
0xa1 0xa1
Raw ADC Value: 41377, Voltage: 1.5784 V
----------------------------------------------------------------
0xa1 0x43
Raw ADC Value: 41283, Voltage: 1.5748 V
----------------------------------------------------------------
0x99 0xc1
Raw ADC Value: 39361, Voltage: 1.5015 V
----------------------------------------------------------------
0xa2 0x87
Raw ADC Value: 41607, Voltage: 1.5872 V
----------------------------------------------------------------
0xd0 0xfa
Raw ADC Value: 53498, Voltage: 2.0408 V
----------------------------------------------------------------
0xaa 0x1f
Raw ADC Value: 43551, Voltage: 1.6614 V
----------------------------------------------------------------
0xa1 0xe8
Raw ADC Value: 41448, Voltage: 1.5811 V
----------------------------------------------------------------
0xa1 0xa8
Raw ADC Value: 41384, Voltage: 1.5787 V
----------------------------------------------------------------
0xaa 0x1d
Raw ADC Value: 43549, Voltage: 1.6613 V
----------------------------------------------------------------
0x99 0xbf
Raw ADC Value: 39359, Voltage: 1.5014 V
----------------------------------------------------------------
0xa5 0xf
Raw ADC Value: 42255, Voltage: 1.6119 V
----------------------------------------------------------------
0xa1 0x43
Raw ADC Value: 41283, Voltage: 1.5748 V
----------------------------------------------------------------
0x9d 0x93
Raw ADC Value: 40339, Voltage: 1.5388 V
----------------------------------------------------------------
0xa1 0xa8
Raw ADC Value: 41384, Voltage: 1.5787 V
----------------------------------------------------------------
0xa1 0xd0
Raw ADC Value: 41424, Voltage: 1.5802 V
----------------------------------------------------------------
0xa1 0xa1
Raw ADC Value: 41377, Voltage: 1.5784 V
----------------------------------------------------------------
0xa8 0x75
Raw ADC Value: 43125, Voltage: 1.6451 V
----------------------------------------------------------------
0x4e 0xaa
Raw ADC Value: 20138, Voltage: 0.7682 V
----------------------------------------------------------------
0xa1 0xe8
Raw ADC Value: 41448, Voltage: 1.5811 V
----------------------------------------------------------------
0xa1 0x43
Raw ADC Value: 41283, Voltage: 1.5748 V
----------------------------------------------------------------
0xa1 0x43
Raw ADC Value: 41283, Voltage: 1.5748 V
----------------------------------------------------------------
0x50 0xea
Raw ADC Value: 20714, Voltage: 0.7902 V
----------------------------------------------------------------
0xa1 0xe8
Raw ADC Value: 41448, Voltage: 1.5811 V
----------------------------------------------------------------
0xa1 0x43
Raw ADC Value: 41283, Voltage: 1.5748 V
----------------------------------------------------------------
0xa8 0x75
Raw ADC Value: 43125, Voltage: 1.6451 V
----------------------------------------------------------------
0xa1 0xd0
Raw ADC Value: 41424, Voltage: 1.5802 V
----------------------------------------------------------------
0xa1 0xf4
Raw ADC Value: 41460, Voltage: 1.5816 V
----------------------------------------------------------------
0xa1 0xe8
Raw ADC Value: 41448, Voltage: 1.5811 V
----------------------------------------------------------------
0xa1 0xa1
Raw ADC Value: 41377, Voltage: 1.5784 V
----------------------------------------------------------------
0xa5 0xf
Raw ADC Value: 42255, Voltage: 1.6119 V
----------------------------------------------------------------
0xa1 0xa8
Raw ADC Value: 41384, Voltage: 1.5787 V
----------------------------------------------------------------
0xa1 0xd4
Raw ADC Value: 41428, Voltage: 1.5804 V
----------------------------------------------------------------
0xa1 0xa1
Raw ADC Value: 41377, Voltage: 1.5784 V
----------------------------------------------------------------
0x9a 0xa6
Raw ADC Value: 39590, Voltage: 1.5103 V
----------------------------------------------------------------
0xa2 0x87
Raw ADC Value: 41607, Voltage: 1.5872 V
----------------------------------------------------------------
0xa5 0xf
Raw ADC Value: 42255, Voltage: 1.6119 V
----------------------------------------------------------------
0xa2 0x87
Raw ADC Value: 41607, Voltage: 1.5872 V
----------------------------------------------------------------
0xa1 0xd0
Raw ADC Value: 41424, Voltage: 1.5802 V
----------------------------------------------------------------
0xa1 0xa1
Raw ADC Value: 41377, Voltage: 1.5784 V
----------------------------------------------------------------
0xa1 0xd0
Raw ADC Value: 41424, Voltage: 1.5802 V
----------------------------------------------------------------
0x89 0xe5
Raw ADC Value: 35301, Voltage: 1.3466 V
----------------------------------------------------------------
0xa1 0xa1
Raw ADC Value: 41377, Voltage: 1.5784 V
----------------------------------------------------------------
0xa1 0xd0
Raw ADC Value: 41424, Voltage: 1.5802 V
----------------------------------------------------------------
0x94 0x32
Raw ADC Value: 37938, Voltage: 1.4472 V
----------------------------------------------------------------
0xaa 0x1d
Raw ADC Value: 43549, Voltage: 1.6613 V
----------------------------------------------------------------
0xa1 0xd0
Raw ADC Value: 41424, Voltage: 1.5802 V
----------------------------------------------------------------
0x50 0xea
Raw ADC Value: 20714, Voltage: 0.7902 V
----------------------------------------------------------------
0xa1 0xa8
Raw ADC Value: 41384, Voltage: 1.5787 V
----------------------------------------------------------------
0xa1 0xa1
Raw ADC Value: 41377, Voltage: 1.5784 V
----------------------------------------------------------------
0xa8 0x75
Raw ADC Value: 43125, Voltage: 1.6451 V
----------------------------------------------------------------
0xa1 0xa1
Raw ADC Value: 41377, Voltage: 1.5784 V
----------------------------------------------------------------
0xa0 0xa1
Raw ADC Value: 41121, Voltage: 1.5687 V
----------------------------------------------------------------
0xa1 0xf4
Raw ADC Value: 41460, Voltage: 1.5816 V
----------------------------------------------------------------
0xa1 0xa8
Raw ADC Value: 41384, Voltage: 1.5787 V
----------------------------------------------------------------
0xaa 0x1f
Raw ADC Value: 43551, Voltage: 1.6614 V
----------------------------------------------------------------
0xa8 0x75
Raw ADC Value: 43125, Voltage: 1.6451 V
----------------------------------------------------------------
0xa0 0xa1
Raw ADC Value: 41121, Voltage: 1.5687 V
----------------------------------------------------------------
0xa1 0xd0
Raw ADC Value: 41424, Voltage: 1.5802 V
----------------------------------------------------------------
0xa8 0x7d
Raw ADC Value: 43133, Voltage: 1.6454 V
----------------------------------------------------------------
0xa1 0x43
Raw ADC Value: 41283, Voltage: 1.5748 V
----------------------------------------------------------------
0xa1 0xa8
Raw ADC Value: 41384, Voltage: 1.5787 V
----------------------------------------------------------------
0xcf 0x5a
Raw ADC Value: 53082, Voltage: 2.0249 V
----------------------------------------------------------------
0xa2 0x87
Raw ADC Value: 41607, Voltage: 1.5872 V
----------------------------------------------------------------
0xa1 0x50
Raw ADC Value: 41296, Voltage: 1.5753 V
----------------------------------------------------------------
0xb4 0x3e
Raw ADC Value: 46142, Voltage: 1.7602 V
----------------------------------------------------------------
0xa1 0xa1
Raw ADC Value: 41377, Voltage: 1.5784 V
----------------------------------------------------------------
0xa1 0x43
Raw ADC Value: 41283, Voltage: 1.5748 V
----------------------------------------------------------------
0xd0 0xfa
Raw ADC Value: 53498, Voltage: 2.0408 V
----------------------------------------------------------------

Problem observed: Most voltage readings are stable and accurate, but sometimes the output voltage wrong for a single read before returning to normal
Taken to Debug:
      • Verified the input signal using an oscilloscope – no anomalies observed.
    • Questions:

      • What could cause occasional wrong reading
      • Are there any specific configuration registers or diagnostic features in the ADC that I should check to identify potential issues?
      • Could this be related to SPI communication errors or noise, and how can I mitigate such issues?
      • Are there any recommended filtering techniques or error-handling mechanisms to deal with unexpected low values?

    Any insights or suggestions on how to address this issue would be greatly appreciated.