4. 控制可编程直流电源输出

任务说明

本案例实现通过Python控制可编程直流电源(以ITECH IT6322为例),完成电压/电流设定、输出使能与实际回读的完整闭环。代码使用PyVISA库通过USB或GPIB接口与电源通信,适用于大多数支持SCPI命令的直流电源。

SCPI命令映射

核心命令:
INST CH1 — 选择通道1
VOLT 5.0 — 设定电压5V
CURR 1.0 — 设定电流限制1A
OUTP ON — 打开输出
MEAS:VOLT? — 回读实际电压
MEAS:CURR? — 回读实际电流

代码实现

import pyvisa
import time

class DC_PowerSupply:
    """可编程直流电源控制类(SCPI协议)"""
    
    def __init__(self, resource_addr):
        """
        初始化连接
        :param resource_addr: VISA资源地址,如 'USB0::0x1234::0x5678::INSTR'
        """
        rm = pyvisa.ResourceManager()
        self.dev = rm.open_resource(resource_addr)
        self.dev.timeout = 3000  # 3秒超时
        self.dev.write_termination = '\n'
        self.dev.read_termination = '\n'
        # 查询仪器ID验证连接
        idn = self.dev.query('*IDN?')
        print(f"已连接: {idn.strip()}")
    
    def select_channel(self, ch):
        """选择通道 (1/2/3)"""
        self.dev.write(f'INST CH{ch}')
        time.sleep(0.1)
    
    def set_voltage(self, voltage):
        """设定电压值(伏特)"""
        self.dev.write(f'VOLT {voltage:.3f}')
    
    def set_current(self, current):
        """设定电流限制(安培)"""
        self.dev.write(f'CURR {current:.3f}')
    
    def output_on(self):
        """打开输出"""
        self.dev.write('OUTP ON')
    
    def output_off(self):
        """关闭输出"""
        self.dev.write('OUTP OFF')
    
    def measure_voltage(self):
        """回读实际输出电压(伏特)"""
        return float(self.dev.query('MEAS:VOLT?'))
    
    def measure_current(self):
        """回读实际输出电流(安培)"""
        return float(self.dev.query('MEAS:CURR?'))
    
    def close(self):
        """关闭连接"""
        self.dev.close()

# ===== 使用示例 =====
if __name__ == '__main__':
    # 请替换为实际仪器地址,可通过 pyvisa.ResourceManager().list_resources() 查询
    RESOURCE = 'USB0::0x1234::0x5678::INSTR'
    
    ps = DC_PowerSupply(RESOURCE)
    
    try:
        # 通道1设定5V/1A并打开输出
        ps.select_channel(1)
        ps.set_voltage(5.0)
        ps.set_current(1.0)
        ps.output_on()
        time.sleep(1)  # 等待输出稳定
        
        # 回读实际值
        v = ps.measure_voltage()
        i = ps.measure_current()
        print(f"通道1 设定5.000V/1.000A → 实测 {v:.3f}V / {i:.3f}A")
        
        # 通道2设定3.3V/0.5A
        ps.select_channel(2)
        ps.set_voltage(3.3)
        ps.set_current(0.5)
        ps.output_on()
        time.sleep(1)
        
        v2 = ps.measure_voltage()
        i2 = ps.measure_current()
        print(f"通道2 设定3.300V/0.500A → 实测 {v2:.3f}V / {i2:.3f}A")
        
    finally:
        # 关闭输出并断开连接
        ps.select_channel(1)
        ps.output_off()
        ps.select_channel(2)
        ps.output_off()
        ps.close()
        print("输出已关闭,连接已释放")

依赖安装

pip install pyvisa pyvisa-py

若使用USB接口,还需安装NI-VISA驱动或使用pyvisa-py作为后端:

import pyvisa
rm = pyvisa.ResourceManager('@py')  # 使用pyvisa-py后端

验证方法

  1. 运行前先通过 python -c "import pyvisa; rm=pyvisa.ResourceManager(); print(rm.list_resources())" 确认仪器地址;
  2. 将代码中RESOURCE替换为实际地址后运行脚本;
  3. 观察输出:若显示已连接且实测电压/电流与设定值偏差在仪器精度范围内(通常±0.1%),则判定通过;
  4. 用万用表并联在电源输出端,确认实际电压与回读值一致;
  5. 程序结束后电源输出自动关闭,无异常报错。

判定标准

  • 连接成功:能正确返回仪器ID字符串;
  • 设定生效:回读电压与设定值误差小于0.1%+20mV;
  • 输出控制:OUTP ON后输出端有电压,OFF后电压归零;
  • 多通道独立:通道1和通道2的设定互不影响。
Python控制直流电源 — 连接与数据流 Python脚本 PyVISA + SCPI DC_PowerSupply类 USB / GPIB VISA协议 IT6322 直流电源 CH1: 5V/1A CH2: 3.3V/0.5A CH3: 未使用 SCPI命令解析 负载 DUT MEAS:VOLT? / MEAS:CURR? 回读 控制命令 测量回读 功率输出

关键说明

  • 代码中RESOURCE地址需根据实际设备修改,不同厂商的USB地址格式可能不同;
  • 若电源为其他品牌(如Keysight、Rigol),SCPI命令基本兼容,但通道选择命令可能为INSTrument:SELect,需微调;
  • 实际使用中建议增加异常处理(如try/except捕获VISA错误),本案例为清晰展示核心逻辑未做过多封装。