Suservo exampleΒΆ

Note

The suservo must be initialized manually once after power cycling by running:

self.laser_suservo_test.modulator.rfsource.suservo.suservo_device.init()

or by directly adding the suservo (here: suservo0) to the components and running:

self.suservo0.init()

Since initialization is very time-consuming, we recommend a separate init experiment that can be run after power cycling to handle these tasks.

Experiment

"""
SUServo Laser Example
#####################

Scenario
========

We want to control a laser that is intensity stabilized by a Sinara SUServo (Sampler + 2x Urukul with special gateware)

"""
from atomiq import AtomiqExperiment
from artiq.experiment import kernel, parallel, sequential, delay


class SuServoTest(AtomiqExperiment):
    components = ["laser_suservo_test", "ttl_test", "pd_aom_test_cal"]

    arguments = {
        "pulse_power": {"default": 0.5},
        "pulsetime": {"default": 3e-3, "unit": "ms", "scale": 1e-3},
        "off_time": {"default": 0.5, "unit": "s"},
    }

    @kernel
    def step(self, point):

        # Optional: If the PI parameter set in the components definition is not what you need
        # you can set a different value like so:
        self.laser_suservo_test.set_servo_parameter(0, -1.0, -1.0e4, 0.0)

        # Set the detuning of the laser. Depending on the `fmmod` parameter either the modulator
        # or the laser source will be used for detuning
        self.laser_suservo_test.set_detuning(400e6)

        # Activate servo loops for our laser
        self.laser_suservo_test.stabilize(True)

        # Set the power level we want to stabilize on. Since the photodiode is calibrated
        # we give the desired power in mW
        self.laser_suservo_test.set_power(point.pulse_power)

        with parallel:
            # Output a test tll for triggering our instrumentation
            self.ttl_test.pulse(point.pulsetime)

            # Pulse on the laser
            self.laser_suservo_test.pulse(point.pulsetime)

            # Ramp down the intensity of the laser to half its power in half the pulsetime
            self.laser_suservo_test.ramp(point.pulsetime/2, power_start=point.pulse_power,
                                         power_end=point.pulse_power/2)

            with sequential:
                delay(point.pulsetime/2)

                # Switch off the servo loop and hold the output power
                self.laser_suservo_test.stabilize(False)

                # Measure the power on the photodiode
                power = self.pd_aom_test_cal.get_power()
                self.log.info("Measured PD output: {0}", [power])

        delay(point.off_time)

Components

# Basics
components = {
    "log": {
        "classname": "atomiq.components.basics.log.KernelLogger"
    }
}

# Calibrations
components = {
    "cal_pd_test": {
        "classname": "atomiq.components.basics.LinearCalibration",
        "arguments": {
            "input_unit": "V",
            "output_unit": "mW",
            "a": 30.0,
            "b": 0.0
        }
    }
}

# Sinara modules
components = {
    "kasli0": {
        "classname": "atomiq.components.sinara.Kasli",
        "arguments": {}
    },
    "suservo0": {
        "classname": "atomiq.components.sinara.suservo.SUServo",
        "arguments": {
            "suservo_device": "@suservo0",
        }
    }
}

# TTL Out
components = {
    "ttl_test": {
        "classname": "atomiq.components.sinara.DioOutput",
        "arguments": {
            "kasli": "&kasli0",
            "ttl": "@ttl8"
        }
    }
}

# Analog in
components = {
    "input_suservo_test": {
        "classname": "atomiq.components.sinara.suservo.SUServoADCChannel",
        "arguments": {
            "suservo": "&suservo0",
            "channel": 0,
            "default_gain": 0
        }
    }
}

# Photodiodes
components = {
    "pd_aom_test_cal": {
        "classname": "atomiq.components.optoelectronics.photodiode.CalibratedPhotodiode",
        "arguments": {
            "adc_channel": "&input_suservo_test",
            "calibration": "&cal_pd_test"
        }
    }
}

# RF Sources
components = {
    "rfsource_aom_test": {
            "classname": "atomiq.components.sinara.suservo.SUServoChannel",
            "arguments": {
                "suservo": "&suservo0",
                "suservo_channel": "@suservo0_ch0",
                "default_amplitude": 0.75,
                "default_frequency": 220e6,
                "freq_limit": (15e6, 400e6),
                "blind": True
            }
    }
}

components = {
    "aom_test": {
        "classname": "atomiq.components.optoelectronics.lightmodulator.AOM",
        "arguments": {
            "rfsource": "&rfsource_aom_test",
            "switch": "&rfsource_aom_test",
            "center_freq": 200e6,
            "bandwidth": 60e6,
            "switching_delay": 30e-9,
            "order": 1,
            "passes": 2
        }
    }
}

# Lock
components = {
    "lock_test": {
        "classname": "atomiq.components.lock.SpectroscopyLock",
        "arguments": {
            "reference_frequency": 539e12,
            "lock_offset": -60.0e6,
        }
    }
}

# Lasersources
components = {
    "ls_test": {
        "classname": "atomiq.components.laser.LockedLaserSource",
        "arguments": {
            "lock": "&lock_test",
            "power": 900e-3
        }
    }
}

# Lasers
components = {
    "laser_suservo_test": {
        "classname": "atomiq.components.sinara.suservo.SUServoModulatedLaser",
        "arguments": {
            "laser_source": "&ls_test",
            "photodiode": "&pd_aom_test_cal",
            "modulator": "&aom_test",
            "default_ki": -1.0e4,
            "default_kp": -1.0
        }
    }
}