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.

    Before You Switch


    Switching languages will make ADI Explorer unavailable. Resume your session by switching back to English and reopening ADI Explorer.