diff --git a/adi/__init__.py b/adi/__init__.py index f521b1292..5519f03ff 100644 --- a/adi/__init__.py +++ b/adi/__init__.py @@ -12,6 +12,7 @@ from adi.ad936x import Pluto, ad9361, ad9363, ad9364 from adi.ad937x import ad9371, ad9375 from adi.ad4020 import ad4000, ad4001, ad4002, ad4003, ad4020 +from adi.ad4080 import ad4080 from adi.ad4110 import ad4110 from adi.ad4130 import ad4130 from adi.ad4170 import ad4170 diff --git a/adi/ad4080.py b/adi/ad4080.py new file mode 100644 index 000000000..e871d2c86 --- /dev/null +++ b/adi/ad4080.py @@ -0,0 +1,80 @@ +# Copyright (C) 2022-2024 Analog Devices, Inc. +# +# SPDX short identifier: ADIBSD + +from adi.context_manager import context_manager +from adi.rx_tx import rx + + +class ad4080(rx, context_manager): + + """ AD4080 ADC """ + + _compatible_parts = ["ad4080"] + _complex_data = False + _rx_channel_names = ["voltage0"] + _device_name = "" + + def __init__(self, uri="", device_name="ad4080"): + + """Initialize.""" + context_manager.__init__(self, uri, self._device_name) + + if device_name not in self._compatible_parts: + raise Exception( + "Not a compatible device: " + + str(device_name) + + ". Please select from " + + str(self.self._compatible_parts) + ) + else: + self._ctrl = self._ctx.find_device(device_name) + self._rxadc = self._ctx.find_device(device_name) + + rx.__init__(self) + + + + @property + def scale(self): + """scale: Scale value""" + return self._get_iio_attr("voltage0", "scale", False) + + @property + def scale_available(self): + """scale_avaliable: Available scale value""" + return self._get_iio_attr("voltage0", "scale_available", False) + + @property + def sampling_frequency(self): + """sampling_frequency: Sampling frequency value""" + return self._get_iio_dev_attr("sampling_frequency") + + + @property + def sinc_dec_rate_available(self): + """""" + return self._get_iio_dev_attr("sinc_dec_rate_available", False) + + @property + def sinc_dec_rate(self): + """""" + return self._get_iio_dev_attr("sinc_dec_rate", False) + + @sinc_dec_rate.setter + def sinc_dec_rate(self, value): + self._set_iio_dev_attr("sinc_dec_rate", value) + + @property + def filter_sel_available(self): + """""" + return self._get_iio_dev_attr_str("filter_sel_available", False) + + @property + def filter_sel(self): + """""" + return self._get_iio_dev_attr_str("filter_sel", False) + + @filter_sel.setter + def filter_sel(self, value): + self._set_iio_dev_attr_str("filter_sel", value) diff --git a/doc/source/devices/adi.ad4080.rst b/doc/source/devices/adi.ad4080.rst new file mode 100644 index 000000000..56210f696 --- /dev/null +++ b/doc/source/devices/adi.ad4080.rst @@ -0,0 +1,7 @@ +ad4080 +================= + +.. automodule:: adi.ad4080 + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/devices/index.rst b/doc/source/devices/index.rst index 0401722cf..7d7e02e68 100644 --- a/doc/source/devices/index.rst +++ b/doc/source/devices/index.rst @@ -11,6 +11,7 @@ Supported Devices adi.ad2s1210 adi.ad4020 adi.ad405x + adi.ad4080 adi.ad4110 adi.ad4130 adi.ad4170 diff --git a/examples/ad4080_example.py b/examples/ad4080_example.py new file mode 100644 index 000000000..c6a44c072 --- /dev/null +++ b/examples/ad4080_example.py @@ -0,0 +1,67 @@ +# Copyright (C) 2022 Analog Devices, Inc. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# - Neither the name of Analog Devices, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# - The use of this software may or may not infringe the patent rights +# of one or more patent holders. This license does not release you +# from the requirement that you obtain separate licenses from these +# patent holders to use this software. +# - Use of the software either in source or binary form, must be run +# on or directly connected to an Analog Devices Inc. component. +# +# THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. +# +# IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY +# RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import sys + +import matplotlib.pyplot as plt +import numpy as np +from adi import ad4080 + +# Optionally pass URI as command line argument, +# else use default ip:analog.local +my_uri = sys.argv[1] if len(sys.argv) >= 2 else "ip:analog.local" +print("uri: " + str(my_uri)) + +my_adc = ad4080(uri=my_uri, device_name="ad4080") + +print("Sampling frequency: ", my_adc.sampling_frequency) +# print("Test mode: ", my_adc.test_mode) +print("Scale: ", my_adc.scale) + +plt.clf() +# Collect data +data = my_adc.rx() + +plt.plot(range(0, len(data)), data, label="channel0") +plt.xlabel("Data Point") +plt.ylabel("ADC counts") +plt.legend( + bbox_to_anchor=(0.0, 1.02, 1.0, 0.102), + loc="lower left", + ncol=4, + mode="expand", + borderaxespad=0.0, +) + +plt.show() +del my_adc diff --git a/supported_parts.md b/supported_parts.md index e20cb0d5e..8e45cceae 100644 --- a/supported_parts.md +++ b/supported_parts.md @@ -17,6 +17,7 @@ - AD4003 (AD4007, AD4011) - AD4020 - AD405x +- AD4080 - AD4130 - AD4110 - AD4111 diff --git a/test/test_ad4080.py b/test/test_ad4080.py new file mode 100644 index 000000000..a840428e4 --- /dev/null +++ b/test/test_ad4080.py @@ -0,0 +1,42 @@ +import pytest + +hardware = ["ad4080"] +classname = ["adi.ad4080"] + + +######################################### +@pytest.mark.iio_hardware(hardware, True) +@pytest.mark.parametrize("classname", [(classname)]) +@pytest.mark.parametrize("channel", [0]) +def test_ad4080_rx_data(test_dma_rx, iio_uri, classname, channel): + test_dma_rx(iio_uri, classname, channel) + + +# ######################################### +# @pytest.mark.iio_hardware(hardware) +# @pytest.mark.parametrize("classname", [(classname)]) +# @pytest.mark.parametrize( +# "attr, val", +# [ +# ( +# "test_mode", +# [ +# "off", +# "midscale_short", +# "pos_fullscale", +# "neg_fullscale", +# "checkerboard", +# "pn_long", +# "pn_short", +# "one_zero_toggle", +# "user", +# "bit_toggle", +# "sync", +# "one_bit_high", +# "mixed_bit_frequency", +# ], +# ), +# ], +# ) +# def test_ad4080_attr(test_attribute_multipe_values, iio_uri, classname, attr, val): +# test_attribute_multipe_values(iio_uri, classname, attr, val, 0)