4. 函数发生器输出正弦波并验证频率

任务说明

本案例使用Python通过SCPI命令控制可编程直流电源(以ITECH IT6322或Keysight E3631A等支持标准SCPI的电源为例),实现以下目标:设置输出电压与电流限制、启用输出通道、回读实际输出电压与电流,并验证设置值与回读值的一致性。

硬件连接与前置条件

  • 可编程直流电源一台(支持SCPI命令,具备USB/GPIB/LAN接口)
  • 使用PyVISA库与电源通信,需安装:pip install pyvisa pyvisa-py
  • 电源已通过USB或LAN连接至电脑,并安装对应驱动(NI-VISA或pyvisa-py后端)
  • 电源输出端接有电子负载或电阻,以便读取到非零电流

SCPI命令说明

功能SCPI命令
设置电压VOLT <值>
设置电流限制CURR <值>
启用输出OUTP ON
读取实际电压MEAS:VOLT?
读取实际电流MEAS:CURR?

Python实现代码

import pyvisa
import time

# 配置参数
VISA_ADDR = "USB0::0xFFFF::0x1E00::P0001234::INSTR"  # 替换为实际地址
SET_VOLTAGE = 5.0    # 目标电压 (V)
SET_CURRENT = 0.5    # 电流限制 (A)
CHANNEL = 1          # 通道号(单通道电源可忽略)

def find_instrument():
    """自动查找可用电源地址(若未指定)"""
    rm = pyvisa.ResourceManager()
    resources = rm.list_resources()
    print("检测到资源:", resources)
    if not resources:
        raise RuntimeError("未找到任何VISA设备")
    return resources[0] if not VISA_ADDR else VISA_ADDR

def configure_power(inst, voltage, current, ch=1):
    """设置电压和电流限制"""
    if ch > 1:
        inst.write(f"INST:SEL CH{ch}")  # 多通道电源选择通道
    inst.write(f"VOLT {voltage}")
    inst.write(f"CURR {current}")
    print(f"已设置: CH{ch} 电压={voltage}V, 电流限制={current}A")

def enable_output(inst, state=True, ch=1):
    """启用或关闭输出"""
    if ch > 1:
        inst.write(f"INST:SEL CH{ch}")
    inst.write(f"OUTP {'ON' if state else 'OFF'}")
    print(f"输出已{'启用' if state else '关闭'}")

def read_measurements(inst, ch=1):
    """读取实际输出电压和电流"""
    if ch > 1:
        inst.write(f"INST:SEL CH{ch}")
    actual_v = float(inst.query("MEAS:VOLT?"))
    actual_i = float(inst.query("MEAS:CURR?"))
    return actual_v, actual_i

def main():
    # 1. 建立连接
    rm = pyvisa.ResourceManager()
    addr = find_instrument()
    print(f"连接设备: {addr}")
    inst = rm.open_resource(addr)
    inst.timeout = 5000  # 5秒超时
    inst.write("*RST")   # 复位到默认状态
    time.sleep(0.5)

    # 2. 配置并启用输出
    configure_power(inst, SET_VOLTAGE, SET_CURRENT, CHANNEL)
    enable_output(inst, True, CHANNEL)
    time.sleep(1)  # 等待输出稳定

    # 3. 回读验证
    actual_v, actual_i = read_measurements(inst, CHANNEL)
    print(f"回读电压: {actual_v:.3f} V")
    print(f"回读电流: {actual_i:.3f} A")

    # 4. 验证判定
    v_ok = abs(actual_v - SET_VOLTAGE) < 0.05   # 允许±50mV误差
    i_ok = actual_i > 0 and actual_i <= SET_CURRENT * 1.1  # 电流在0~限制值+10%内
    print(f"电压验证: {'通过' if v_ok else '失败'}")
    print(f"电流验证: {'通过' if i_ok else '失败'}")

    # 5. 关闭输出并断开
    enable_output(inst, False, CHANNEL)
    inst.close()
    rm.close()
    print("测试完成")

if __name__ == "__main__":
    main()

运行与验证方法

  1. 将代码中VISA_ADDR替换为实际设备地址(可通过python -m pyvisa info查看)
  2. 在电源输出端连接合适的负载(如100Ω电阻,5V时电流约50mA)
  3. 运行脚本:python dc_power_control.py
  4. 观察输出:若显示“电压验证: 通过”且“电流验证: 通过”,则判定测试成功

预期输出示例

检测到资源: ['USB0::0xFFFF::0x1E00::P0001234::INSTR']
连接设备: USB0::0xFFFF::0x1E00::P0001234::INSTR
已设置: CH1 电压=5.0V, 电流限制=0.5A
输出已启用
回读电压: 5.002 V
回读电流: 0.049 A
电压验证: 通过
电流验证: 通过
输出已关闭
测试完成
直流电源控制验证流程 Python脚本 PyVISA + SCPI 设置/回读/验证 USB/LAN 可编程直流电源 VOLT 5.0 CURR 0.5 OUTP ON + 输出 负载 100Ω 或电子负载 MEAS:VOLT? / MEAS:CURR? 验证判定标准 电压验证 |回读电压 - 设定电压| ≤ 50mV 例: |5.002 - 5.0| = 0.002 → 通过 电流验证 0 < 回读电流 ≤ 设定限制 × 1.1 例: 0.049A 在 (0, 0.55A] → 通过

注意事项

  • 若电源为单通道设备,代码中的通道选择命令会自动忽略
  • 确保负载功率在电源额定范围内,避免过载
  • 不同品牌电源的SCPI命令略有差异,若命令不兼容请查阅对应编程手册
  • 脚本执行完毕后自动关闭输出,防止意外上电