Skip to content

IV_SWEEP_2450

Download Flojoy Studio to try this app
Sweeps current or voltage and measures the opposite for the 2450. Requires a CONNECT_2450 block to create the connection. Params: connection : VisaConnection The VISA address (requires the CONNECTION_2450 block). sweep : select, default=voltage Select the sweep mode, the opposite unit is measured. sense : select, default=2-wire Use 2 or 4 wire sense/measurement mode. start : float, default=0 The first x value of the sweep. stop : float, default=1 The last x value of the sweep. points : float, default=100 The number of points between start and stop. measurement_time : float, default=1 How long to measure a single point, in seconds. measurement_delay : float, default=0.05 How long to delay between two points, in seconds. y_limit : float, default=1 The limit of the measured value. source_range : float, default=1 The range of the x value. Returns: out : OrderedPair Sweep values
Python Code
from typing import Optional, Literal
from flojoy import VisaConnection, flojoy, DataContainer, OrderedPair
from time import sleep


@flojoy(deps={"tm_devices": "1.0"}, inject_connection=True)
def IV_SWEEP_2450(
    connection: VisaConnection,
    input: Optional[DataContainer] = None,
    sweep: Literal["voltage", "current"] = "voltage",
    sense: Literal["2-wire", "4-wire"] = "2-wire",
    start: float = 0,
    stop: float = 1,
    points: float = 100,
    measurement_time: float = 1,
    measurement_delay: float = 0.05,
    y_limit: float = 1,
    source_range: float = 1,
) -> OrderedPair:
    """Sweeps current or voltage and measures the opposite for the 2450.

    Requires a CONNECT_2450 block to create the connection.

    Parameters
    ----------
    connection : VisaConnection
        The VISA address (requires the CONNECTION_2450 block).
    sweep : select, default=voltage
        Select the sweep mode, the opposite unit is measured.
    sense : select, default=2-wire
        Use 2 or 4 wire sense/measurement mode.
    start : float, default=0
        The first x value of the sweep.
    stop : float, default=1
        The last x value of the sweep.
    points : float, default=100
        The number of points between start and stop.
    measurement_time : float, default=1
        How long to measure a single point, in seconds.
    measurement_delay : float, default=0.05
        How long to delay between two points, in seconds.
    y_limit : float, default=1
        The limit of the measured value.
    source_range : float, default=1
        The range of the x value.

    Returns
    -------
    OrderedPair
        Sweep values
    """

    # Retrieve oscilloscope instrument connection
    smu = connection.get_handle()
    smu.commands.reset()

    # Set the source and measure functions.
    if sweep == "current":
        smu.commands.smu.measure.func = smu.commands.smu.FUNC_DC_VOLTAGE
        smu.commands.smu.source.func = smu.commands.smu.FUNC_DC_CURRENT
    else:
        smu.commands.smu.measure.func = smu.commands.smu.FUNC_DC_CURRENT
        smu.commands.smu.source.func = smu.commands.smu.FUNC_DC_VOLTAGE

    # Configure measurement settings.
    smu.commands.smu.terminals = smu.commands.smu.TERMINALS_FRONT
    if sense == "2-wire":
        smu.commands.smu.measure.sense = smu.commands.smu.SENSE_2WIRE
    else:
        smu.commands.smu.measure.sense = smu.commands.smu.SENSE_4WIRE
    smu.commands.smu.measure.autorange = smu.commands.smu.ON
    smu.commands.smu.measure.nplc = measurement_time

    # Configure source settings.
    smu.commands.smu.source.highc = smu.commands.smu.OFF
    smu.commands.smu.source.range = source_range
    smu.commands.smu.source.readback = smu.commands.smu.ON
    if sweep == "current":
        smu.commands.smu.source.vlimit.level = y_limit
    else:
        smu.commands.smu.source.ilimit.level = y_limit
    smu.commands.smu.source.sweeplinear(
        "IVSweep",
        start,
        stop,
        points,
        measurement_delay,
    )

    # Set the operation status bit 0 to high when the trigger model is active.
    # See Event Numbers in 2450 reference manual.
    smu.commands.status.operation.setmap(0, 2731, 2732)
    smu.commands.trigger.model.initiate()

    while True:  # This is needed to wait for the trigger model to complete
        sleep(0.5)
        if not int(smu.commands.status.operation.condition):
            break

    # Get the data from the buffers:
    buffer_data = smu.get_buffers("defbuffer1.sourcevalues", "defbuffer1")
    x = buffer_data["defbuffer1.sourcevalues"]
    y = buffer_data["defbuffer1"]

    return OrderedPair(x=x, y=y)

Find this Flojoy Block on GitHub

Videos

Control the Sourcemeter 2450 with Flojoy

Example App

Having problems with this example app? Join our Discord community and we will help you out!
React Flow mini map

In this example, a Keithley 2450 to generate 1V and then sweep between 0 and 1V.

First the necessary blocks were added:

  • CONNECT_2450
  • BEEP_2450
  • RESET_2450
  • SOURCE_2450
  • MEASURE_SETTINGS_2450
  • MEASUREMENT_READ_2450
  • IV_SWEEP_2450
  • BIG_NUMBER
  • LINE

The instrument address was set for each 2450 block. The SOURCE_2450 block was changed in order to source 1V. The parameters in the MEASURE_SETTINGS_2450 block were changed as necessary. The MEASUREMENT_READ_2450 block was connected to the BIG_NUMBER block in order to view the reading.

The IV_SWEEP_2450 block output was connected to the LINE plot to show the output of the sweep.

The blocks were connected as shown and the app was run.