k8ik-stm/Control/rendered/STM_Sweep.md

6.1 KiB

Synchronised one-pulse signal generation and acquisition

Now that we are familiar with generating and acquiring signals with Red Pitaya, we can finally learn a few tricks for combining both and use them in practice. In this example, the acquisition is triggered together with the generation, which is used for measuring cable length and other applications where signal propagation delay is important.

Note:
The voltage range of fast analog inputs on the Red Pitaya depends on the input jumper position. HV sets the input range to ±20 V, while LV sets the input range to ±1 V. For more information, please read the following chapter.

As previously, create a loop-back from fast analog outputs to fast analog inputs, as shown in the picture below.
Please make sure the jumpers are set to ±1 V (LV).

Fast loop back

Libraries and FPGA image

import time
import numpy as np
from matplotlib import pyplot as plt
from rp_overlay import overlay
import rp

fpga = overlay()
rp.rp_Init()
Check FPGA [OK].





0

Marcos

Throughout this tutorial we will mention macros multiple times. Here is a complete list of macros that will come in handy when customising this notebook. The marcos are a part of the rp library.

GENERATION

  • Waveforms - RP_WAVEFORM_SINE, RP_WAVEFORM_SQUARE, RP_WAVEFORM_TRIANGLE, RP_WAVEFORM_RAMP_UP, RP_WAVEFORM_RAMP_DOWN, RP_WAVEFORM_DC, RP_WAVEFORM_PWM, RP_WAVEFORM_ARBITRARY, RP_WAVEFORM_DC_NEG, RP_WAVEFORM_SWEEP
  • Generator modes - RP_GEN_MODE_CONTINUOUS, RP_GEN_MODE_BURST
  • Sweep direction - RP_GEN_SWEEP_DIR_NORMAL, RP_GEN_SWEEP_DIR_UP_DOWN
  • Sweep mode - RP_GEN_SWEEP_MODE_LINEAR, RP_GEN_SWEEP_MODE_LOG
  • Generator trigger source - RP_GEN_TRIG_SRC_INTERNAL, RP_GEN_TRIG_SRC_EXT_PE, RP_GEN_TRIG_SRC_EXT_NE
  • Generator triggers - RP_T_CH_1, RP_T_CH_2, RP_T_CH_EXT
  • Rise and fall times - RISE_FALL_MIN_RATIO, RISE_FALL_MAX_RATIO

ACQUISITION

  • Decimation - RP_DEC_1, RP_DEC_2, RP_DEC_4, RP_DEC_8, RP_DEC_16, RP_DEC_32, RP_DEC_64, RP_DEC_128, RP_DEC_256, RP_DEC_512, RP_DEC_1024, RP_DEC_2048, RP_DEC_4096, RP_DEC_8192, RP_DEC_16384, RP_DEC_32768, RP_DEC_65536
  • Acquisition trigger - RP_TRIG_SRC_DISABLED, RP_TRIG_SRC_NOW, RP_TRIG_SRC_CHA_PE, RP_TRIG_SRC_CHA_NE, RP_TRIG_SRC_CHB_PE, RP_TRIG_SRC_CHB_NE, RP_TRIG_SRC_EXT_PE, RP_TRIG_SRC_EXT_NE, RP_TRIG_SRC_AWG_PE, RP_TRIG_SRC_AWG_NE
  • Acquisition trigger state - RP_TRIG_STATE_TRIGGERED, RP_TRIG_STATE_WAITING
  • Buffer size - ADC_BUFFER_SIZE, DAC_BUFFER_SIZE
  • Fast analog channels - RP_CH_1, RP_CH_2

SIGNALlab 250-12 only:

  • Input coupling - RP_DC, RP_AC
  • Generator gain - RP_GAIN_1X, RP_GAIN_5X

STEMlab 125-14 4-Input only:

  • Fast analog channels - RP_CH_3, RP_CH_4
  • Acquisition trigger - RP_TRIG_SRC_CHC_PE, RP_TRIG_SRC_CHC_NE, RP_TRIG_SRC_CHD_PE, RP_TRIG_SRC_CHD_NE

Synchronising generation and acquisition

The example itself is relatively trivial in comparison to others already presented during the tutorials. The only practical change is the RP_TRIG_SOUR_AWG_PE.

Parameters:

###### Generation #####
channel = rp.RP_CH_1        # rp.RP_CH_2
waveform = rp.RP_WAVEFORM_RAMP_UP
freq = 0.1164153218269348 * 2
ampl = 1.0

ncyc = 1
nor = 1
period = 10

gen_trig_sour = rp.RP_GEN_TRIG_SRC_INTERNAL

##### Acquisition #####
trig_lvl = 0.5
trig_dly = 0
dec = rp.RP_DEC_65536

acq_trig_sour = rp.RP_TRIG_SRC_AWG_PE

N = 32768 // 2

# Reset Generation and Acquisition
rp.rp_GenReset()
rp.rp_AcqReset()
0

Setting up both the generation and acquisition.

###### Generation #####
print("Gen_start")
rp.rp_GenWaveform(channel, waveform)
rp.rp_GenFreqDirect(channel, freq)
rp.rp_GenAmp(channel, ampl)

# Change to burst mode
rp.rp_GenMode(channel, rp.RP_GEN_MODE_BURST)
rp.rp_GenBurstCount(channel, ncyc)                  # Ncyc
rp.rp_GenBurstRepetitions(channel, nor)             # Nor
rp.rp_GenBurstPeriod(channel, period)               # Period


# Specify generator trigger source
rp.rp_GenTriggerSource(channel, gen_trig_sour)

# Enable output synchronisation
rp.rp_GenOutEnableSync(True)


##### Acquisition #####
# Set Decimation
rp.rp_AcqSetDecimation(dec)
rp.rp_AcqSetAveraging(True)
rp.rp_AcqSetGain(rp.RP_CH_1, rp.RP_HIGH)

# Set trigger level and delay
rp.rp_AcqSetTriggerLevel(rp.RP_T_CH_1, trig_lvl)
rp.rp_AcqSetTriggerDelay(trig_dly)

Gen_start





0

Starting acquisition and capturing data.

# Start Acquisition
print("Acq_start")
rp.rp_AcqStart()

# Specify trigger - input 1 positive edge
rp.rp_AcqSetTriggerSrc(acq_trig_sour)

time.sleep(5)

rp.rp_GenTriggerOnly(channel)       # Trigger generator

print(f"Trigger state: {rp.rp_AcqGetTriggerState()[1]}")

# Trigger state
while 1:
    trig_state = rp.rp_AcqGetTriggerState()[1]
    if trig_state == rp.RP_TRIG_STATE_TRIGGERED:
        break

# Fill state
print(f"Fill state: {rp.rp_AcqGetBufferFillState()[1]}")

while 1:
    if rp.rp_AcqGetBufferFillState()[1]:
        break


### Get data ###
# Volts
fbuff = rp.fBuffer(N)
res = rp.rp_AcqGetOldestDataV(rp.RP_CH_1, N, fbuff)[1]

data_V = np.zeros(N // 2, dtype = float)

for i in range(0, N // 2, 1):
    data_V[i] = fbuff[i + N // 2]

plt.plot(data_V)
plt.show()
Acq_start
Trigger state: 0
Fill state: False

png

# Release resources
rp.rp_Release()
0

One of the applications for this example is to measure how many samples are taken from the triggering moment to the start of the captured pulse, which corresponds to propagation delay on the transmission line.

Note

There are a lot of different commands for the Acquisition. The list of available functions is quite an achievement to read through, so from now on, please refer to the C and Python API section of the SCPI & API command list for all available commands.