Hello all,
With the recent hardware problems mostly solved, I am trying out some fast experiment sequences.
What is a tried-tested-and-recommended way to do a "short" laser pulse (ideally with feedback on the plateaus), using AOM + photodiode controlled by a SuServo channel?
Just changing the set-point/offset voltage gives a rise time of at least 25us. I think that the AOM specs and PD bandwidth should not be the limiting factors here. Here is a measurement with optimized PI gains:

The code I used to generate the above plot is:
class suServoTestSetpoint(EnvExperiment):
def build(self):
self.setattr_device("core")
self.setattr_device("ttl4")
self.setattr_device("urukul0_cpld")
self.setattr_device("suservo0_ch0")
def prepare(self):
self.beam_370 = self.suservo0_ch0
self.experiment_trigger = self.ttl4
@kernel
def run(self):
# prepare core
self.core.reset()
self.core.break_realtime()
#init suservo
self.beam_370.servo.init()
self.beam_370.servo.set_config(enable = 1) # Enable to change this
self.beam_370.servo.cplds[0].set_att(channel = 0, att = 0.0)
# Define profile 0 (base intensity, here 0V)
self.beam_370.set_y(profile = 0, y=0.) #y = amplitude in artiq units
self.beam_370.set_dds(profile = 0, frequency = 110*MHz, offset = 0.0)
self.beam_370.set_iir(profile=0, adc=0, kp= -0.55, ki= -55000., g = 0.0)
# Define profile 1 (pulse intensity, set the required PD voltage here from a calibration table/curve)
self.beam_370.set_y(profile = 1, y=0.) # y = amplitude in artiq units
self.beam_370.set_dds(profile = 1, frequency = 110*MHz, offset = -1.5 /10.0) # No clue why the factor of 10 is there for the offset voltage!
self.beam_370.set_iir(profile=1, adc=0, kp= -0.55, ki= -55000., g = 0.0)
# Wait at 0V
self.beam_370.set(en_out = 0, en_iir = 0, profile = 0)
delay(100*us)
with parallel:
self.experiment_trigger.pulse(100*us) # Reference TTL for Osci
with sequential:
# Pulse ON 100us
self.beam_370.set(en_out = 1, en_iir = 1, profile = 1)
delay(100*us)
# Pulse OFF
self.beam_370.set(en_out = 1, en_iir = 1, profile = 0)
delay(100*us)
# wait at 0V
self.beam_370.set(en_out = 0, en_iir = 0, profile = 0)
delay(200*us)
Some more general questions about the above code:
- What is the reason behind the factor of 10 for the voltage offset in the SuServo?
- Do you recommend I move some parts of the
run()
to prepare()
?
Any inputs are appreciated... (:
Clear skies,
Santhosh