Skip to content

Pulsed EPR

Assume that we have built a pulsed EPR spectrometer and now would like to run pulse experiments — a Hahn echo, inversion recovery, ESEEM, and so on. The heart of such a setup is the pulse programmer, which produces the precisely timed digital pulses that drive the microwave switches, the high-power amplifier, the receiver protection, the phase switches, the AWG/DAC, and the detection (ADC) window. In Atomize this hardware is controlled through a pulse-programmer module such as Insys FPGA.

A pulse experiment differs from the CW EPR example in one important respect: instead of stepping a single parameter and reading a lock-in, we have to lay out a whole pulse sequence in time and make sure every supporting signal is switched on and off at exactly the right moment relative to the microwave pulses. Doing this by hand for every channel would be tedious and error-prone — so Atomize does most of it automatically.

Automatic pulse generation

The key idea is that the user only defines the spectroscopically meaningful pulses — the microwave excitation (MW or AWG) and the detection window (DETECTION). Every supporting pulse needed to protect the hardware and to switch the microwave phase is generated automatically around those pulses, using a set of fixed delays stored in the device configuration file.

This behaviour is controlled by the auto_defense option in the config (auto_defense = True by default). With it enabled, the module refuses manual AMP_ON / LNA_PROTECT pulses and instead derives them itself:

  • AMP_ON — the gate for the high-power microwave amplifier. It has to open before the microwave pulse so the amplifier is settled when the pulse arrives.
  • LNA_PROTECT — the blanking signal that protects the receiver's low-noise amplifier. It has to bracket the microwave pulse with a safety margin so no high power reaches the receiver.
  • phase pulses (-X, +Y) — the fast phase switches used for phase cycling. They are set slightly before and released slightly after the microwave pulse.

For a single rectangular MW pulse the generated picture looks as follows. Each auto-generated channel simply takes the start/end of the MW pulse and shifts its leading and trailing edges by the configured delays:

Automatic pulse generation from a rectangular MW pulse

The delays that define these edges are all listed in the pulse-programmer config file (PB_Insys_pulser_config.ini, section [SPECIFIC]):

Config key Default Channel Edge Meaning
switch_amp_delay 170 AMP_ON leading how long AMP_ON opens before the MW pulse start
amp_delay -60 AMP_ON trailing how long AMP_ON closes after the MW pulse end (negative → before the end)
switch_protect_delay 170 LNA_PROTECT leading how long LNA_PROTECT opens before the MW pulse start
protect_delay 40 LNA_PROTECT trailing how long LNA_PROTECT closes after the MW pulse end
switch_phase_delay 30 -X, +Y leading how long the phase switch is set before the MW pulse start
phase_delay 0 -X, +Y trailing how long the phase switch is released after the MW pulse end

Note

All delays are given in nanoseconds and are specific to a particular spectrometer — they compensate for the different cable lengths and switching times of the real hardware. A negative value (e.g. amp_delay = -60) simply pulls that edge inward, so the gate closes slightly before the nominal pulse end. The values above are the defaults shipped in the config and should be re-calibrated for every setup.

AWG (shaped) pulses

Besides plain rectangular MW pulses, the spectrometer can play shaped pulses generated by the AWG/DAC. In that case the user defines an AWG pulse, and the module internally derives a rectangular gate called RECT_AWG from it — shifted by rect_awg_switch_delay and rect_awg_delay to line the gate up with the actual waveform coming out of the DAC. The amplifier and receiver-protection pulses are then built from this RECT_AWG gate, exactly as they are built from MW for rectangular pulses:

Automatic pulse generation for an AWG pulse

Config key Default Channel Meaning
rect_awg_switch_delay -114 RECT_AWG leading edge of the RECT_AWG gate relative to the AWG pulse start
rect_awg_delay 134 RECT_AWG trailing edge of the RECT_AWG gate relative to the AWG pulse end
protect_awg_delay 184 LNA_PROTECT together with rect_awg_delay, sets the LNA_PROTECT trailing edge for AWG pulses

Note

AMP_ON and LNA_PROTECT for AWG pulses are derived from the RECT_AWG gate, not from the user-defined AWG pulse. Triggering of the DAC itself is handled by a separate TRIGGER_AWG pulse.

Channels

The mapping between channel names and physical outputs is also defined in the config (ch0ch9). The user works only with the names, not the numbers:

Channel Role Defined by
TRIGGER_AWG trigger for the AWG/DAC user
DETECTION ADC acquisition window user
MW rectangular microwave pulse user
AMP_ON high-power amplifier gate auto-generated
LNA_PROTECT receiver (LNA) protection auto-generated
-X, +Y fast microwave phase switches auto-generated (phase cycling)
AWG shaped microwave pulse user
LASER laser trigger (e.g. for LASER/light experiments) user
SYNT2 second synthesizer gate user

Because of all this, defining a microwave pulse in a script is short — the supporting channels never appear:

import atomize.device_modules.Insys_FPGA as pb_pulse

pb = pb_pulse.Insys_FPGA()

# A single 16 ns microwave pulse with two-step phase cycling.
# AMP_ON, LNA_PROTECT and the phase pulses are added automatically.
pb.pulser_pulse(name='P0', channel='MW',
                start='100 ns', length='16 ns',
                phase_list=['+x', '-x'])

# The detection (ADC) window is the only other pulse we declare.
pb.pulser_pulse(name='P1', channel='DETECTION',
                start='300 ns', length='100 ns')

To be continued — the next part will assemble these pulses into a complete pulse sequence and run a full pulsed-EPR experiment.