96 lines
3.1 KiB
Python
96 lines
3.1 KiB
Python
"""Owon PSU quick demo (optimized to use ecu_framework.power.owon_psu).
|
|
|
|
This script reads configuration from OWON_PSU_CONFIG (YAML) or ./config/owon_psu.yaml,
|
|
prints discovered ports responding to *IDN?, then connects to the configured port
|
|
and performs a small sequence (IDN, optional V/I set, toggle output, measure V/I).
|
|
|
|
No CLI flags; edit YAML to change behavior.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import time
|
|
from pathlib import Path
|
|
|
|
import yaml
|
|
|
|
try:
|
|
from ecu_framework.power import OwonPSU, SerialParams, scan_ports
|
|
except ModuleNotFoundError:
|
|
# Ensure repository root is on sys.path when running this file directly
|
|
import sys
|
|
repo_root = Path(__file__).resolve().parents[2]
|
|
if str(repo_root) not in sys.path:
|
|
sys.path.insert(0, str(repo_root))
|
|
from ecu_framework.power import OwonPSU, SerialParams, scan_ports
|
|
|
|
|
|
def _load_yaml_config() -> dict:
|
|
cfg_path = str(Path("config") / "owon_psu.yaml")
|
|
p = Path(cfg_path).resolve()
|
|
print("Using config path:", str(p))
|
|
if not p.is_file():
|
|
return {}
|
|
with p.open("r", encoding="utf-8") as f:
|
|
data = yaml.safe_load(f) or {}
|
|
return data if isinstance(data, dict) else {}
|
|
|
|
|
|
def run_demo() -> int:
|
|
cfg = _load_yaml_config()
|
|
if not cfg or "port" not in cfg:
|
|
print("Config not found or missing 'port'. Set OWON_PSU_CONFIG or create ./config/owon_psu.yaml")
|
|
return 2
|
|
|
|
print("Scanning ports (responding to *IDN?):")
|
|
for dev, idn in scan_ports(SerialParams(baudrate=int(cfg.get("baudrate", 115200)), timeout=float(cfg.get("timeout", 1.0)))):
|
|
print(f" {dev} -> {idn}")
|
|
|
|
# Serial params
|
|
baud = int(cfg.get("baudrate", 115200))
|
|
timeout = float(cfg.get("timeout", 1.0))
|
|
eol = cfg.get("eol", "\n")
|
|
from serial import PARITY_NONE, PARITY_EVEN, PARITY_ODD, STOPBITS_ONE, STOPBITS_TWO
|
|
parity = {"N": PARITY_NONE, "E": PARITY_EVEN, "O": PARITY_ODD}.get(str(cfg.get("parity", "N")).upper(), PARITY_NONE)
|
|
stopbits = {1: STOPBITS_ONE, 2: STOPBITS_TWO}.get(int(float(cfg.get("stopbits", 1))), STOPBITS_ONE)
|
|
xonxoff = bool(cfg.get("xonxoff", False))
|
|
rtscts = bool(cfg.get("rtscts", False))
|
|
dsrdtr = bool(cfg.get("dsrdtr", False))
|
|
|
|
ps = SerialParams(
|
|
baudrate=baud,
|
|
timeout=timeout,
|
|
parity=parity,
|
|
stopbits=stopbits,
|
|
xonxoff=xonxoff,
|
|
rtscts=rtscts,
|
|
dsrdtr=dsrdtr,
|
|
)
|
|
|
|
port = str(cfg["port"]).strip()
|
|
|
|
do_set = bool(cfg.get("do_set", False))
|
|
set_v = float(cfg.get("set_voltage", 1.0))
|
|
set_i = float(cfg.get("set_current", 0.1))
|
|
|
|
with OwonPSU(port, ps, eol=eol) as psu:
|
|
idn = psu.idn()
|
|
print(f"IDN: {idn}")
|
|
print(f"Output status: {psu.output_status()}")
|
|
if do_set:
|
|
psu.set_output(True)
|
|
time.sleep(0.5)
|
|
psu.set_voltage(1, set_v)
|
|
psu.set_current(1, set_i)
|
|
time.sleep(1.0)
|
|
print(f"Measured V: {psu.measure_voltage()} V")
|
|
print(f"Measured I: {psu.measure_current()} A")
|
|
time.sleep(0.5)
|
|
psu.set_output(False)
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(run_demo())
|