Skip to content

Commit eb84cee

Browse files
committed
adi:ad7768-1: Add support for ad7768-1/adaq776x-1
Signed-off-by: Reymond Olmedo <[email protected]>
1 parent b89168a commit eb84cee

File tree

12 files changed

+302
-0
lines changed

12 files changed

+302
-0
lines changed

adi/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
from adi.ad7689 import ad7689
3737
from adi.ad7746 import ad7746
3838
from adi.ad7768 import ad7768, ad7768_4
39+
from adi.ad7768_1 import ad7768_1
3940
from adi.ad7799 import ad7799
4041
from adi.ad9081 import ad9081
4142
from adi.ad9081_mc import QuadMxFE, ad9081_mc

adi/ad7768_1.py

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# Copyright (C) 2025 Analog Devices, Inc.
2+
#
3+
# SPDX short identifier: ADIBSD
4+
from decimal import Decimal
5+
6+
import numpy as np
7+
8+
from adi.attribute import attribute
9+
from adi.context_manager import context_manager
10+
from adi.rx_tx import rx
11+
12+
13+
class ad7768_1(rx, context_manager):
14+
15+
""" AD7768-1 1-channel, Dynamic Signal Analysis Sigma-Delta ADC """
16+
17+
_device_name = " "
18+
_rx_data_type = np.int32
19+
20+
def __init__(self, uri="ip:analog.local", device_name=""):
21+
"""Initialize."""
22+
context_manager.__init__(self, uri, self._device_name)
23+
24+
compatible_parts = ["ad7768-1", "adaq7767-1", "adaq7768-1", "adaq7769-1"]
25+
26+
self._ctrl = None
27+
28+
if not device_name:
29+
device_name = compatible_parts[0]
30+
else:
31+
if device_name not in compatible_parts:
32+
raise Exception(f"Not a compatible device: {device_name}")
33+
34+
# Select the device matching device_name as working device
35+
for device in self._ctx.devices:
36+
if device.name == device_name:
37+
self._ctrl = device
38+
self._rxadc = device
39+
break
40+
41+
if not self._ctrl:
42+
raise Exception("Error in selecting matching device")
43+
44+
if not self._rxadc:
45+
raise Exception("Error in selecting matching device")
46+
47+
self._rx_channel_names = []
48+
self.channel = []
49+
for ch in self._ctrl.channels:
50+
name = ch._id
51+
self._rx_channel_names.append(name)
52+
self.channel.append(self._channel(self._ctrl, name))
53+
54+
rx.__init__(self)
55+
56+
@property
57+
def sampling_frequency_available(self):
58+
"""Get available sampling frequencies."""
59+
return self._get_iio_dev_attr("sampling_frequency_available")
60+
61+
@property
62+
def sampling_frequency(self):
63+
"""Get sampling frequency."""
64+
return self._get_iio_dev_attr("sampling_frequency")
65+
66+
@sampling_frequency.setter
67+
def sampling_frequency(self, rate):
68+
"""Set sampling frequency."""
69+
if rate in self.sampling_frequency_available:
70+
self._set_iio_dev_attr("sampling_frequency", rate)
71+
else:
72+
raise ValueError(
73+
"Error: Sampling frequency not supported \nUse one of: "
74+
+ str(self.sampling_frequency_available)
75+
)
76+
77+
@property
78+
def common_mode_voltage_available(self):
79+
"""Get common mode voltage available."""
80+
return self._get_iio_dev_attr_str("common_mode_voltage_available")
81+
82+
@property
83+
def common_mode_voltage(self):
84+
"""Get common mode voltage."""
85+
return self._get_iio_dev_attr_str("common_mode_voltage")
86+
87+
@common_mode_voltage.setter
88+
def common_mode_voltage(self, rate):
89+
"""Set sampling frequency."""
90+
if rate in self.common_mode_voltage_available:
91+
self._set_iio_dev_attr_str("common_mode_voltage", rate)
92+
else:
93+
raise ValueError(
94+
"Error: Common mode voltage not supported \nUse one of: "
95+
+ str(self.common_mode_voltage_available)
96+
)
97+
98+
class _channel(attribute):
99+
"""AD7768-1 channel"""
100+
101+
def __init__(self, ctrl, channel_name):
102+
self.name = channel_name
103+
self._ctrl = ctrl
104+
105+
@property
106+
def value(self):
107+
"""AD7768-1 channel raw value"""
108+
return self._get_iio_attr(self.name, "raw", False)
109+
110+
@property
111+
def scale(self):
112+
"""AD7768-1 channel scale."""
113+
return float(self._get_iio_attr_str(self.name, "scale", False))
114+
115+
@scale.setter
116+
def scale(self, value):
117+
self._set_iio_attr(self.name, "scale", False, str(Decimal(value).real))
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
ad7768_1
2+
=================
3+
4+
.. automodule:: adi.ad7768_1
5+
:members:
6+
:undoc-members:
7+
:show-inheritance:

doc/source/devices/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ Supported Devices
3939
adi.ad7689
4040
adi.ad7746
4141
adi.ad7768
42+
adi.ad7768_1
4243
adi.ad777x
4344
adi.ad7799
4445
adi.ad9081

examples/ad7768_1_example.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# Copyright (C) 2023 Analog Devices, Inc.
2+
#
3+
# SPDX short identifier: ADIBSD
4+
5+
import sys
6+
from time import sleep
7+
8+
import matplotlib.pyplot as plt
9+
10+
import adi
11+
12+
13+
def display_settings(sampling_frequency, rx_enabled_channels, common_mode_voltage):
14+
# def display_settings(sampling_frequency, rx_enabled_channels):
15+
print("Sampling Frequency: ", sampling_frequency)
16+
print("Enabled Channels: ", rx_enabled_channels)
17+
print("Common mode voltage: ", common_mode_voltage)
18+
19+
20+
# Optionally pass URI as command line argument,
21+
22+
my_uri = sys.argv[1] if len(sys.argv) >= 2 else "ip:analog.local"
23+
part_name = sys.argv[2].lower() if len(sys.argv) >= 3 else "adaq7768-1"
24+
25+
print(f"URI: {my_uri}")
26+
print(f"Selected device: {part_name}")
27+
28+
# Initialize ADC depending on device name
29+
if part_name == "ad7768-1":
30+
my_adc = adi.ad7768_1(uri=my_uri)
31+
elif part_name == "adaq7767-1":
32+
my_adc = adi.adaq7767_1(uri=my_uri)
33+
elif part_name == "adaq7768-1":
34+
my_adc = adi.adaq7768_1(uri=my_uri)
35+
elif part_name == "adaq7769-1":
36+
my_adc = adi.adaq7769_1(uri=my_uri)
37+
else:
38+
raise ValueError(f"Unsupported device: {part_name}")
39+
40+
my_adc = adi.ad7768_1(uri=my_uri)
41+
my_adc.rx_buffer_size = 1024
42+
43+
my_adc.sampling_frequency = 8000 # Set Sample Rate
44+
45+
my_adc.rx_output_type = "SI" # Choose output format: "SI" or "RAW"
46+
47+
my_adc.common_mode_voltage = "(AVDD1-AVSS)/2" # mV # Set common mode voltage: (AVDD1-AVSS)/2 2V5 2V05 1V9 1V65 1V1 0V9 OFF
48+
49+
# Verify settings:
50+
display_settings(
51+
my_adc.sampling_frequency, my_adc.rx_enabled_channels, my_adc.common_mode_voltage,
52+
)
53+
54+
# --- Live Plot Setup ---
55+
plt.ion() # turn on interactive mode
56+
fig, ax = plt.subplots(figsize=(10, 6)) # reasonable size for most monitors
57+
(line,) = ax.plot([], [], label="voltage")
58+
ax.set_xlabel("Data Point")
59+
ax.set_ylabel("Millivolts" if my_adc.rx_output_type == "SI" else "ADC counts")
60+
ax.legend(loc="upper right")
61+
plt.show()
62+
63+
# --- Live Update Loop ---
64+
try:
65+
while True:
66+
data = my_adc.rx()
67+
data = data[1:] # skip first sample
68+
69+
line.set_xdata(range(len(data)))
70+
line.set_ydata(data)
71+
72+
ax.relim()
73+
ax.autoscale_view()
74+
75+
plt.pause(0.01)
76+
77+
except KeyboardInterrupt:
78+
print("Stopped by user.")
79+
80+
del my_adc

supported_parts.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@
9696
- AD7291
9797
- AD7490
9898
- AD7768
99+
- AD7768-1
99100
- AD7768-4
100101
- AD7770
101102
- AD7771
@@ -127,6 +128,9 @@
127128
- ADAQ4216
128129
- ADAQ4220
129130
- ADAQ4224
131+
- ADAQ7767-1
132+
- ADAQ7768-1
133+
- ADAQ7769-1
130134
- ADAQ8092
131135
- ADAR1000
132136
- ADF4030

test/emu/devices/ad7768-1.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE context [<!ELEMENT context (device | context-attribute)*><!ELEMENT context-attribute EMPTY><!ELEMENT device (channel | attribute | debug-attribute | buffer-attribute)*><!ELEMENT channel (scan-element?, attribute*)><!ELEMENT attribute EMPTY><!ELEMENT scan-element EMPTY><!ELEMENT debug-attribute EMPTY><!ELEMENT buffer-attribute EMPTY><!ATTLIST context name CDATA #REQUIRED description CDATA #IMPLIED><!ATTLIST context-attribute name CDATA #REQUIRED value CDATA #REQUIRED><!ATTLIST device id CDATA #REQUIRED name CDATA #IMPLIED><!ATTLIST channel id CDATA #REQUIRED type (input|output) #REQUIRED name CDATA #IMPLIED><!ATTLIST scan-element index CDATA #REQUIRED format CDATA #REQUIRED scale CDATA #IMPLIED><!ATTLIST attribute name CDATA #REQUIRED filename CDATA #IMPLIED value CDATA #IMPLIED><!ATTLIST debug-attribute name CDATA #REQUIRED value CDATA #IMPLIED><!ATTLIST buffer-attribute name CDATA #REQUIRED value CDATA #IMPLIED>]><context name="network" description="192.168.3.2 Linux analog 5.15.0-175919-g427c94e8faa5 #823 SMP PREEMPT Tue Dec 12 10:08:06 EET 2023 armv7l" ><context-attribute name="hdl_system_id" value="[ad77681evb] on [zed] git branch [hdl_2022_r2] git [b31d4fbba87a96f329f858da3118771503c7c6b4] clean [2023-10-27 11:04:17] UTC" /><context-attribute name="hw_carrier" value="Xilinx Zynq ZED" /><context-attribute name="hw_model" value="EVAL-AD7768-1FMCZ on Xilinx Zynq ZED" /><context-attribute name="hw_mezzanine" value="EVAL-AD7768-1FMCZ" /><context-attribute name="hw_name" value="AD7768-1" /><context-attribute name="hw_vendor" value="Analog Devices" /><context-attribute name="hw_serial" value="Empty Field" /><context-attribute name="local,kernel" value="5.15.0-175919-g427c94e8faa5" /><context-attribute name="uri" value="ip:192.168.3.2" /><context-attribute name="ip,ip-addr" value="192.168.3.2" /><device id="hwmon0" name="e000b000ethernetffffffff00" ><channel id="temp1" type="input" ><attribute name="crit" filename="temp1_crit" value="100000" /><attribute name="input" filename="temp1_input" value="36000" /><attribute name="max_alarm" filename="temp1_max_alarm" value="0" /></channel></device><device id="iio:device0" name="ad7768-1" ><channel id="voltage0" type="input" ><scan-element index="0" format="le:s24/32&gt;&gt;8" scale="0.000488" /><attribute name="label" filename="in_voltage0_label" value="(null)" /><attribute name="raw" filename="in_voltage0_raw" value="-193" /><attribute name="scale" filename="in_voltage_scale" value="0.000488281" /></channel><attribute name="common_mode_voltage" value="(AVDD1-AVSS)/2" /><attribute name="common_mode_voltage_available" value="(AVDD1-AVSS)/2 2V5 2V05 1V9 1V65 1V1 0V9 OFF" /><attribute name="sampling_frequency" value="256000" /><attribute name="sampling_frequency_available" value="256000 128000 64000 32000 16000 8000 4000 2000 1000" /><buffer-attribute name="data_available" value="0" /><buffer-attribute name="length_align_bytes" value="8" /><debug-attribute name="direct_reg_access" value="0x0" /></device><device id="iio:device1" name="xadc" ><channel id="voltage5" name="vccoddr" type="input" ><attribute name="label" filename="in_voltage5_vccoddr_label" value="vccoddr" /><attribute name="raw" filename="in_voltage5_vccoddr_raw" value="2022" /><attribute name="scale" filename="in_voltage5_vccoddr_scale" value="0.732421875" /></channel><channel id="voltage0" name="vccint" type="input" ><attribute name="label" filename="in_voltage0_vccint_label" value="vccint" /><attribute name="raw" filename="in_voltage0_vccint_raw" value="1368" /><attribute name="scale" filename="in_voltage0_vccint_scale" value="0.732421875" /></channel><channel id="voltage4" name="vccpaux" type="input" ><attribute name="label" filename="in_voltage4_vccpaux_label" value="vccpaux" /><attribute name="raw" filename="in_voltage4_vccpaux_raw" value="2440" /><attribute name="scale" filename="in_voltage4_vccpaux_scale" value="0.732421875" /></channel><channel id="temp0" type="input" ><attribute name="offset" filename="in_temp0_offset" value="-2219" /><attribute name="raw" filename="in_temp0_raw" value="2533" /><attribute name="scale" filename="in_temp0_scale" value="123.040771484" /></channel><channel id="voltage7" name="vrefn" type="input" ><attribute name="label" filename="in_voltage7_vrefn_label" value="vrefn" /><attribute name="raw" filename="in_voltage7_vrefn_raw" value="-12" /><attribute name="scale" filename="in_voltage7_vrefn_scale" value="0.732421875" /></channel><channel id="voltage1" name="vccaux" type="input" ><attribute name="label" filename="in_voltage1_vccaux_label" value="vccaux" /><attribute name="raw" filename="in_voltage1_vccaux_raw" value="2437" /><attribute name="scale" filename="in_voltage1_vccaux_scale" value="0.732421875" /></channel><channel id="voltage2" name="vccbram" type="input" ><attribute name="label" filename="in_voltage2_vccbram_label" value="vccbram" /><attribute name="raw" filename="in_voltage2_vccbram_raw" value="1364" /><attribute name="scale" filename="in_voltage2_vccbram_scale" value="0.732421875" /></channel><channel id="voltage3" name="vccpint" type="input" ><attribute name="label" filename="in_voltage3_vccpint_label" value="vccpint" /><attribute name="raw" filename="in_voltage3_vccpint_raw" value="1367" /><attribute name="scale" filename="in_voltage3_vccpint_scale" value="0.732421875" /></channel><channel id="voltage6" name="vrefp" type="input" ><attribute name="label" filename="in_voltage6_vrefp_label" value="vrefp" /><attribute name="raw" filename="in_voltage6_vrefp_raw" value="1690" /><attribute name="scale" filename="in_voltage6_vrefp_scale" value="0.732421875" /></channel><attribute name="sampling_frequency" value="961538" /></device><device id="iio_sysfs_trigger" ><attribute name="add_trigger" value="ERROR" /><attribute name="remove_trigger" value="ERROR" /></device></context>

test/emu/devices/adaq7767-1.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE context [<!ELEMENT context (device | context-attribute)*><!ELEMENT context-attribute EMPTY><!ELEMENT device (channel | attribute | debug-attribute | buffer-attribute)*><!ELEMENT channel (scan-element?, attribute*)><!ELEMENT attribute EMPTY><!ELEMENT scan-element EMPTY><!ELEMENT debug-attribute EMPTY><!ELEMENT buffer-attribute EMPTY><!ATTLIST context name CDATA #REQUIRED description CDATA #IMPLIED><!ATTLIST context-attribute name CDATA #REQUIRED value CDATA #REQUIRED><!ATTLIST device id CDATA #REQUIRED name CDATA #IMPLIED><!ATTLIST channel id CDATA #REQUIRED type (input|output) #REQUIRED name CDATA #IMPLIED><!ATTLIST scan-element index CDATA #REQUIRED format CDATA #REQUIRED scale CDATA #IMPLIED><!ATTLIST attribute name CDATA #REQUIRED filename CDATA #IMPLIED value CDATA #IMPLIED><!ATTLIST debug-attribute name CDATA #REQUIRED value CDATA #IMPLIED><!ATTLIST buffer-attribute name CDATA #REQUIRED value CDATA #IMPLIED>]><context name="network" description="192.168.3.2 Linux analog 5.15.0-175919-g427c94e8faa5 #823 SMP PREEMPT Tue Dec 12 10:08:06 EET 2023 armv7l" ><context-attribute name="hdl_system_id" value="[ad77681evb] on [zed] git branch [hdl_2022_r2] git [b31d4fbba87a96f329f858da3118771503c7c6b4] clean [2023-10-27 11:04:17] UTC" /><context-attribute name="hw_carrier" value="Xilinx Zynq ZED" /><context-attribute name="hw_model" value="EV-ADAQ7767-1FMC1Z on Xilinx Zynq ZED" /><context-attribute name="hw_mezzanine" value="EV-ADAQ7767-1FMC1Z" /><context-attribute name="hw_name" value="ADAQ7767-1" /><context-attribute name="hw_vendor" value="Analog Devices" /><context-attribute name="hw_serial" value="Empty Field" /><context-attribute name="local,kernel" value="5.15.0-175919-g427c94e8faa5" /><context-attribute name="uri" value="ip:192.168.3.2" /><context-attribute name="ip,ip-addr" value="192.168.3.2" /><device id="hwmon0" name="e000b000ethernetffffffff00" ><channel id="temp1" type="input" ><attribute name="crit" filename="temp1_crit" value="100000" /><attribute name="input" filename="temp1_input" value="36000" /><attribute name="max_alarm" filename="temp1_max_alarm" value="0" /></channel></device><device id="iio:device0" name="ad7768-1" ><channel id="voltage0" type="input" ><scan-element index="0" format="le:s24/32&gt;&gt;8" scale="0.000488" /><attribute name="label" filename="in_voltage0_label" value="(null)" /><attribute name="raw" filename="in_voltage0_raw" value="-193" /><attribute name="scale" filename="in_voltage_scale" value="0.000488281" /></channel><attribute name="common_mode_voltage" value="(AVDD1-AVSS)/2" /><attribute name="common_mode_voltage_available" value="(AVDD1-AVSS)/2 2V5 2V05 1V9 1V65 1V1 0V9 OFF" /><attribute name="sampling_frequency" value="256000" /><attribute name="sampling_frequency_available" value="256000 128000 64000 32000 16000 8000 4000 2000 1000" /><buffer-attribute name="data_available" value="0" /><buffer-attribute name="length_align_bytes" value="8" /><debug-attribute name="direct_reg_access" value="0x0" /></device><device id="iio:device1" name="xadc" ><channel id="voltage5" name="vccoddr" type="input" ><attribute name="label" filename="in_voltage5_vccoddr_label" value="vccoddr" /><attribute name="raw" filename="in_voltage5_vccoddr_raw" value="2022" /><attribute name="scale" filename="in_voltage5_vccoddr_scale" value="0.732421875" /></channel><channel id="voltage0" name="vccint" type="input" ><attribute name="label" filename="in_voltage0_vccint_label" value="vccint" /><attribute name="raw" filename="in_voltage0_vccint_raw" value="1368" /><attribute name="scale" filename="in_voltage0_vccint_scale" value="0.732421875" /></channel><channel id="voltage4" name="vccpaux" type="input" ><attribute name="label" filename="in_voltage4_vccpaux_label" value="vccpaux" /><attribute name="raw" filename="in_voltage4_vccpaux_raw" value="2440" /><attribute name="scale" filename="in_voltage4_vccpaux_scale" value="0.732421875" /></channel><channel id="temp0" type="input" ><attribute name="offset" filename="in_temp0_offset" value="-2219" /><attribute name="raw" filename="in_temp0_raw" value="2533" /><attribute name="scale" filename="in_temp0_scale" value="123.040771484" /></channel><channel id="voltage7" name="vrefn" type="input" ><attribute name="label" filename="in_voltage7_vrefn_label" value="vrefn" /><attribute name="raw" filename="in_voltage7_vrefn_raw" value="-12" /><attribute name="scale" filename="in_voltage7_vrefn_scale" value="0.732421875" /></channel><channel id="voltage1" name="vccaux" type="input" ><attribute name="label" filename="in_voltage1_vccaux_label" value="vccaux" /><attribute name="raw" filename="in_voltage1_vccaux_raw" value="2437" /><attribute name="scale" filename="in_voltage1_vccaux_scale" value="0.732421875" /></channel><channel id="voltage2" name="vccbram" type="input" ><attribute name="label" filename="in_voltage2_vccbram_label" value="vccbram" /><attribute name="raw" filename="in_voltage2_vccbram_raw" value="1364" /><attribute name="scale" filename="in_voltage2_vccbram_scale" value="0.732421875" /></channel><channel id="voltage3" name="vccpint" type="input" ><attribute name="label" filename="in_voltage3_vccpint_label" value="vccpint" /><attribute name="raw" filename="in_voltage3_vccpint_raw" value="1367" /><attribute name="scale" filename="in_voltage3_vccpint_scale" value="0.732421875" /></channel><channel id="voltage6" name="vrefp" type="input" ><attribute name="label" filename="in_voltage6_vrefp_label" value="vrefp" /><attribute name="raw" filename="in_voltage6_vrefp_raw" value="1690" /><attribute name="scale" filename="in_voltage6_vrefp_scale" value="0.732421875" /></channel><attribute name="sampling_frequency" value="961538" /></device><device id="iio_sysfs_trigger" ><attribute name="add_trigger" value="ERROR" /><attribute name="remove_trigger" value="ERROR" /></device></context>

0 commit comments

Comments
 (0)