PyVISA
PyVISADocs

Oscilloscope Control Example

Control a Tektronix TBS1072B-EDU oscilloscope using PyVISA to set triggers, capture measurements, and read signal parameters.

This example connects to a Tektronix TBS1072B-EDU oscilloscope over USB. It sets a trigger, waits for the trigger event, takes measurements and then prints the peak-to-peak amplitude and frequency of the signal with 3 significant figures.

import pyvisa
import time

# Connect to the oscilloscope
resource_manager = pyvisa.ResourceManager()
oscope = resource_manager.open_resource("USB0::1689::872::C011501::0::INSTR")

try:
    # Set time and voltage scales
    oscope.write("HORizontal:SCAle 500e-6")  # 500us/div
    oscope.write("CH1:SCAle 2.0")  # 2V/div

    # Set trigger level and mode
    oscope.write("TRIGger:MAIN:LEVel 2.5")  # Set trigger to 2.5V
    oscope.write("TRIGger:A:MODe NORMAL")  # Normal trigger mode
    oscope.write("TRIGger:A:EDGE:SOURce CH1")  # Trigger on CH1
    oscope.write("ACQuire:STOPafter SEQuence")  # Set one-shot mode
    oscope.write("ACQuire:STATE ON")  # Arm trigger

    # Wait for trigger event with timeout
    timeout = 5  # seconds
    start_time = time.time()

    while True:
        status = oscope.query("TRIGger:STATE?").strip()
        if status == "SAVE":
            break
        if time.time() - start_time > timeout:
            print("Trigger timeout")
            break
        time.sleep(0.1)

    # Configure and retrieve frequency measurement
    oscope.write("MEASUrement:IMMed:SOURce CH1")
    oscope.write("MEASUrement:IMMed:TYPe FREQuency")
    frequency = oscope.query("MEASUrement:IMMed:VALue?").strip()

    # Configure and retrieve peak-to-peak voltage measurement
    oscope.write("MEASUrement:IMMed:SOURce CH1")
    oscope.write("MEASUrement:IMMed:TYPe PK2PK")
    peak_to_peak = oscope.query("MEASUrement:IMMed:VALue?").strip()

    # Format the measurements to 3 significant figures
    try:
        frequency = f"{float(frequency):.3g}"
        peak_to_peak = f"{float(peak_to_peak):.3g}"
    except ValueError:
        frequency = "Invalid"
        peak_to_peak = "Invalid"

    print(f"Frequency: {frequency} Hz")
    print(f"Peak-to-Peak: {peak_to_peak} V")

finally:
    # Close connection
    oscope.close()
    resource_manager.close()

How is this guide?