Skip to main content
Control programmable power supplies to set voltage, current, and protection thresholds for your DUT.

Import

There are two ways to control power supplies:
# Option 1: Net-based API
from lager import Net, NetType

# Option 2: Module-level functions
from lager.supply import voltage, current, enable, disable, state, set_mode, clear_ocp, clear_ovp

Methods

MethodDescription
set_voltage()Set output voltage
set_current()Set output current limit
voltage()Read measured voltage
current()Read measured current
power()Read measured power
enable()Enable power output
disable()Disable power output
set_ovp()Set over-voltage protection threshold
set_ocp()Set over-current protection threshold
get_ovp_limit()Get over-voltage protection limit
get_ocp_limit()Get over-current protection limit
is_ovp()Check if OVP fault is active
is_ocp()Check if OCP fault is active
clear_ovp()Clear over-voltage protection fault
clear_ocp()Clear over-current protection fault

Method Reference

Net.get(name, type=NetType.PowerSupply)

Get a power supply net by name.
from lager import Net, NetType

psu = Net.get('VDD', type=NetType.PowerSupply)
Parameters:
ParameterTypeDescription
namestrName of the power supply net
typeNetTypeMust be NetType.PowerSupply
Returns: Power supply Net instance

set_voltage(value)

Set the output voltage.
psu.set_voltage(3.3)  # Set to 3.3V
ParameterTypeDescription
valuefloatTarget voltage in volts

set_current(value)

Set the output current limit.
psu.set_current(0.5)  # Set limit to 0.5A
ParameterTypeDescription
valuefloatCurrent limit in amps

voltage()

Read the measured output voltage.
v = psu.voltage()
print(f"Voltage: {v}V")
Returns: float - Measured voltage in volts

current()

Read the measured output current.
i = psu.current()
print(f"Current: {i}A")
Returns: float - Measured current in amps

power()

Read the measured output power.
p = psu.power()
print(f"Power: {p}W")
Returns: float - Measured power in watts

enable()

Enable the power output.
psu.enable()

disable()

Disable the power output.
psu.disable()

set_ovp(limit)

Set over-voltage protection threshold.
psu.set_ovp(3.6)  # Trip at 3.6V
ParameterTypeDescription
limitfloatOVP threshold in volts

set_ocp(limit)

Set over-current protection threshold.
psu.set_ocp(1.0)  # Trip at 1.0A
ParameterTypeDescription
limitfloatOCP threshold in amps

get_ovp_limit()

Get the configured OVP limit.
ovp = psu.get_ovp_limit()
print(f"OVP limit: {ovp}V")
Returns: float - OVP threshold in volts

get_ocp_limit()

Get the configured OCP limit.
ocp = psu.get_ocp_limit()
print(f"OCP limit: {ocp}A")
Returns: float - OCP threshold in amps

is_ovp()

Check if an over-voltage fault is active.
if psu.is_ovp():
    print("OVP fault detected!")
Returns: bool - True if OVP fault is active

is_ocp()

Check if an over-current fault is active.
if psu.is_ocp():
    print("OCP fault detected!")
Returns: bool - True if OCP fault is active

clear_ovp()

Clear over-voltage protection fault.
psu.clear_ovp()

clear_ocp()

Clear over-current protection fault.
psu.clear_ocp()

Examples

Basic Power Control

from lager import Net, NetType

# Get power supply net
psu = Net.get('VDD', type=NetType.PowerSupply)

# Configure output
psu.set_voltage(3.3)
psu.set_current(0.5)

# Enable output
psu.enable()

# Read measurements
print(f"Voltage: {psu.voltage():.2f}V")
print(f"Current: {psu.current():.3f}A")
print(f"Power: {psu.power():.3f}W")

# Disable when done
psu.disable()

With Protection Thresholds

from lager import Net, NetType
import time

psu = Net.get('VDD', type=NetType.PowerSupply)

# Configure voltage/current
psu.set_voltage(5.0)
psu.set_current(0.5)

# Set protection thresholds
psu.set_ovp(5.5)  # Trip at 5.5V
psu.set_ocp(0.6)  # Trip at 0.6A

# Enable output
psu.enable()
print("Power enabled")

# Monitor for faults
time.sleep(1)
if psu.is_ocp():
    print("OCP fault! Clearing...")
    psu.clear_ocp()

if psu.is_ovp():
    print("OVP fault! Clearing...")
    psu.clear_ovp()

# Clean up
psu.disable()

Monitor Power Consumption

from lager import Net, NetType
import time

psu = Net.get('VDD', type=NetType.PowerSupply)
psu.set_voltage(3.3)
psu.set_current(1.0)
psu.enable()

# Log power consumption
for i in range(10):
    v = psu.voltage()
    i = psu.current()
    p = psu.power()
    print(f"V={v:.2f}V, I={i:.3f}A, P={p:.3f}W")
    time.sleep(1)

psu.disable()

Supported Hardware

ManufacturerModel SeriesFeatures
RigolDP800 seriesMulti-channel, OVP/OCP
Keithley2200/2280 seriesHigh precision
KeysightE36200 seriesMulti-channel
KeysightE36300 seriesMulti-channel, high power
EAPSI seriesTwo-quadrant operation

Module-Level Functions

For simple scripts, you can use module-level functions that take net names directly:

voltage(net_name, value=None, ocp=None, ovp=None)

Set or read voltage for a power supply net.
from lager.supply import voltage

# Set voltage to 24V
voltage('MAIN_BOARD', 24.0)

# Set voltage with protection limits
voltage('MAIN_BOARD', 24.0, ovp=24.5)

# Read current voltage (value=None)
voltage('MAIN_BOARD')
Parameters:
ParameterTypeDescription
net_namestrName of the power supply net
valuefloatVoltage to set (V). If None, reads and prints current voltage
ocpfloatOptional over-current protection limit (A)
ovpfloatOptional over-voltage protection limit (V)

current(net_name, value=None, ocp=None, ovp=None)

Set or read current limit for a power supply net.
from lager.supply import current

# Set current limit to 1A
current('MAIN_BOARD', 1.0)

# Set current with OCP at 3A
current('MOTOR', 3.0, ocp=3.0)

# Read current (value=None)
current('MAIN_BOARD')
Parameters:
ParameterTypeDescription
net_namestrName of the power supply net
valuefloatCurrent limit to set (A). If None, reads and prints current
ocpfloatOptional over-current protection limit (A)
ovpfloatOptional over-voltage protection limit (V)

enable(net_name) / disable(net_name)

Enable or disable a power supply net.
from lager.supply import enable, disable

enable('MAIN_BOARD')   # Turn on output
disable('MAIN_BOARD')  # Turn off output

state(net_name)

Print comprehensive state for a power supply net.
from lager.supply import state

state('MAIN_BOARD')
# Output shows: channel, enabled, mode, voltage, current, power, OCP/OVP limits and status

set_mode(net_name)

Set the instrument mode to DC power supply (for multi-function instruments).
from lager.supply import set_mode

set_mode('MAIN_BOARD')

clear_ocp(net_name) / clear_ovp(net_name)

Clear over-current or over-voltage protection faults.
from lager.supply import clear_ocp, clear_ovp

clear_ocp('MAIN_BOARD')  # Clear OCP trip
clear_ovp('MAIN_BOARD')  # Clear OVP trip

Module Functions vs Net API

# Module-level functions (simpler, uses net name directly)
from lager.supply import voltage, enable, disable

voltage('VDD', 3.3)
enable('VDD')
# ... do work ...
disable('VDD')

# Net API (object-oriented, more methods available)
from lager import Net, NetType

psu = Net.get('VDD', type=NetType.PowerSupply)
psu.set_voltage(3.3)
psu.enable()
# ... do work ...
print(f"Current draw: {psu.current():.3f}A")
psu.disable()
The Net API provides more measurement methods (voltage(), current(), power()) and protection status queries (is_ocp(), is_ovp()).

Notes

  • Net must be configured as NetType.PowerSupply
  • Call enable() to turn on the output after setting voltage/current
  • Always call disable() when finished
  • Protection faults may automatically disable output
  • Use clear_ovp() or clear_ocp() after addressing fault conditions
  • Voltage and current limits depend on hardware capabilities
  • Module-level functions are simpler but provide less functionality than the Net API