coredevice: adf5356: add enable/disable and power setting for outA

Signed-off-by: Etienne Wodey <wodey@iqo.uni-hannover.de>
This commit is contained in:
Etienne Wodey 2020-11-09 19:19:16 +01:00 committed by Sébastien Bourdeauducq
parent 61dc2b8b64
commit 3844123c13
2 changed files with 84 additions and 3 deletions

View File

@ -116,6 +116,43 @@ class ADF5356:
def read_muxout(self):
return bool(self.cpld.read_reg(0) & (1 << (self.channel + 8)))
@kernel
def set_output_power_mu(self, n):
"""
Set the power level at output A of the PLL chip in machine units.
This driver defaults to `n = 3` at init.
:param n: output power setting, 0, 1, 2, or 3 (see ADF5356 datasheet, fig. 44).
"""
if n not in [0, 1, 2, 3]:
raise ValueError("invalid power setting")
self.regs[6] = ADF5356_REG6_RF_OUTPUT_A_POWER_UPDATE(self.regs[6], n)
self.sync()
@portable
def output_power_mu(self):
"""
Return the power level at output A of the PLL chip in machine units.
"""
return ADF5356_REG6_RF_OUTPUT_A_POWER_GET(self.regs[6])
@kernel
def enable_output(self):
"""
Enable output A of the PLL chip. This is the default after init.
"""
self.regs[6] |= ADF5356_REG6_RF_OUTPUT_A_ENABLE(1)
self.sync()
@kernel
def disable_output(self):
"""
Disable output A of the PLL chip.
"""
self.regs[6] &= ~ADF5356_REG6_RF_OUTPUT_A_ENABLE(1)
self.sync()
@kernel
def set_frequency(self, f):
"""

View File

@ -1,4 +1,6 @@
import unittest
import numpy as np
from artiq.experiment import *
from artiq.test.hardware_testbench import ExperimentCase
from artiq.coredevice.adf5356 import (
@ -29,7 +31,7 @@ class ADF5356Exp(EnvExperiment):
self.dev.init()
@kernel
def set_get_simple(self):
def set_get_freq(self):
self.core.break_realtime()
self.dev.cpld.init()
self.dev.init()
@ -60,6 +62,35 @@ class ADF5356Exp(EnvExperiment):
delay(5 * ms)
self.set_dataset("muxout", self.dev.read_muxout())
@kernel
def set_get_output_power(self):
self.core.break_realtime()
self.dev.cpld.init()
self.dev.init()
self.dev.set_att_mu(0)
self.dev.set_frequency(100 * MHz)
self.set_dataset("get_power", np.full(4, np.nan))
for n in range(4):
delay(10 * ms)
self.dev.set_output_power_mu(n)
m = self.dev.output_power_mu()
self.mutate_dataset("get_power", n, m)
@kernel
def invalid_output_power_setting(self):
self.dev.set_output_power_mu(42)
@kernel
def enable_disable_output(self):
self.core.break_realtime()
self.dev.cpld.init()
self.dev.init()
self.dev.set_att_mu(0)
self.dev.set_frequency(100 * MHz)
self.dev.disable_output()
delay(100 * us)
self.dev.enable_output()
class TestCalculateParameters(unittest.TestCase):
def setUp(self):
@ -126,8 +157,8 @@ class ADF5356Test(ExperimentCase):
def test_init(self):
self.execute(ADF5356Exp, "init")
def test_set_get_simple(self):
self.execute(ADF5356Exp, "set_get_simple")
def test_set_get_freq(self):
self.execute(ADF5356Exp, "set_get_freq")
f_set = self.dataset_mgr.get("freq_set")
f_get = self.dataset_mgr.get("freq_get")
self.assertEqual(f_set, f_get)
@ -144,3 +175,16 @@ class ADF5356Test(ExperimentCase):
def test_set_too_low_frequency(self):
with self.assertRaises(ValueError):
self.execute(ADF5356Exp, "set_too_low_frequency")
def test_set_get_output_power(self):
self.execute(ADF5356Exp, "set_get_output_power")
get_power = self.dataset_mgr.get("get_power")
for n in range(4):
self.assertEqual(n, get_power[n])
def test_invalid_output_power_setting(self):
with self.assertRaises(ValueError):
self.execute(ADF5356Exp, "invalid_output_power_setting")
def test_enable_disable_output(self):
self.execute(ADF5356Exp, "enable_disable_output")