datasheets/examples/dds.py

135 lines
4.1 KiB
Python

from artiq.experiment import *
from artiq.coredevice.ad9910 import *
class Sinusoid(EnvExperiment):
def build(self):
self.setattr_device("core")
self.cpld = self.get_device("urukul0_cpld")
self.dds0 = self.get_device("urukul0_ch0")
@kernel
def run(self):
self.core.reset()
self.cpld.init()
self.dds0.init()
self.dds0.cfg_sw(True)
self.dds0.set_att(6.*dB)
self.dds0.set(10*MHz)
class SynchronizedSinusoid(EnvExperiment):
def build(self):
self.setattr_device("core")
self.cpld = self.get_device("urukul0_cpld")
self.dds0 = self.get_device("urukul0_ch0")
self.dds1 = self.get_device("urukul0_ch1")
@kernel
def run(self):
self.core.reset()
self.cpld.init()
self.dds0.init()
self.dds0.cfg_sw(True)
self.dds0.set_phase_mode(PHASE_MODE_TRACKING)
self.dds0.set_att(6.*dB)
self.dds1.init()
self.dds1.cfg_sw(True)
self.dds1.set_phase_mode(PHASE_MODE_TRACKING)
self.dds1.set_att(6.*dB)
self.dds0.set(frequency=10*MHz, phase=0.0)
self.dds1.set(frequency=10*MHz, phase=0.25) # 0.25 turns phase offset
class PulseRAM(EnvExperiment):
def build(self):
self.setattr_device("core")
self.cpld = self.get_device("urukul0_cpld")
self.dds0 = self.get_device("urukul0_ch0")
self.dds1 = self.get_device("urukul0_ch1")
def prepare(self):
self.amp = [0.0, 0.0, 0.0, 0.7, 0.0, 0.7, 0.7] # Reversed Order
self.asf_ram = [0] * len(self.amp)
@kernel
def init_dds(self, dds):
self.core.break_realtime()
dds.init()
dds.set_att(6.*dB)
dds.cfg_sw(True)
@kernel
def configure_ram_mode(self, dds):
self.core.break_realtime()
dds.set_cfr1(ram_enable=0)
self.cpld.io_update.pulse_mu(8)
self.cpld.set_profile(0) # Enable the corresponding RAM profile
# Profile 0 is the default
dds.set_profile_ram(start=0, end=len(self.asf_ram)-1,
step=250, profile=0, mode=RAM_MODE_CONT_RAMPUP)
self.cpld.io_update.pulse_mu(8)
dds.amplitude_to_ram(self.amp, self.asf_ram)
dds.write_ram(self.asf_ram)
self.core.break_realtime()
dds.set(frequency=5*MHz, ram_destination=RAM_DEST_ASF)
# Pass osk_enable=1 to set_cfr1() if it is not an amplitude RAM
dds.set_cfr1(ram_enable=1, ram_destination=RAM_DEST_ASF)
self.cpld.io_update.pulse_mu(8)
@kernel
def run(self):
self.core.reset()
self.core.break_realtime()
self.cpld.init()
self.init_dds(self.dds0)
self.configure_ram_mode(self.dds0)
class AmpRAM(PulseRAM):
def prepare(self):
# Reversed Order
self.amp = [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0]
self.asf_ram = [0] * len(self.amp)
class SynchronizedPulseRAM(PulseRAM):
@kernel
def configure_ram_mode(self, dds):
self.core.break_realtime()
dds.set_cfr1(ram_enable=0)
self.cpld.io_update.pulse_mu(8)
self.cpld.set_profile(0) # Enable the corresponding RAM profile
# Profile 0 is the default
dds.set_profile_ram(start=0, end=len(self.asf_ram)-1,
step=250, profile=0, mode=RAM_MODE_CONT_RAMPUP)
self.cpld.io_update.pulse_mu(8)
dds.amplitude_to_ram(self.amp, self.asf_ram)
dds.write_ram(self.asf_ram)
self.core.break_realtime()
dds.set(frequency=5*MHz, phase=0.0, ram_destination=RAM_DEST_ASF)
# Pass osk_enable=1 to set_cfr1() if it is not an amplitude RAM
dds.set_cfr1(ram_enable=1, ram_destination=RAM_DEST_ASF)
self.cpld.io_update.pulse_mu(8)
@kernel
def run(self):
self.core.reset()
self.core.break_realtime()
self.cpld.init()
self.init_dds(self.dds0)
self.init_dds(self.dds1)
self.dds0.set_phase_mode(PHASE_MODE_TRACKING)
self.dds1.set_phase_mode(PHASE_MODE_TRACKING)
self.configure_ram_mode(self.dds0)
self.configure_ram_mode(self.dds1)