4. 控制可编程直流电源输出
任务说明
本案例实现通过Python控制可编程直流电源(以ITECH IT6322为例),完成电压/电流设定、输出使能与实际回读的完整闭环。代码使用PyVISA库通过USB或GPIB接口与电源通信,适用于大多数支持SCPI命令的直流电源。
SCPI命令映射
核心命令:
INST CH1 — 选择通道1VOLT 5.0 — 设定电压5VCURR 1.0 — 设定电流限制1AOUTP 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后端
验证方法
- 运行前先通过
python -c "import pyvisa; rm=pyvisa.ResourceManager(); print(rm.list_resources())"确认仪器地址; - 将代码中
RESOURCE替换为实际地址后运行脚本; - 观察输出:若显示
已连接且实测电压/电流与设定值偏差在仪器精度范围内(通常±0.1%),则判定通过; - 用万用表并联在电源输出端,确认实际电压与回读值一致;
- 程序结束后电源输出自动关闭,无异常报错。
判定标准
- 连接成功:能正确返回仪器ID字符串;
- 设定生效:回读电压与设定值误差小于0.1%+20mV;
- 输出控制:OUTP ON后输出端有电压,OFF后电压归零;
- 多通道独立:通道1和通道2的设定互不影响。
关键说明
- 代码中
RESOURCE地址需根据实际设备修改,不同厂商的USB地址格式可能不同; - 若电源为其他品牌(如Keysight、Rigol),SCPI命令基本兼容,但通道选择命令可能为
INSTrument:SELect,需微调; - 实际使用中建议增加异常处理(如try/except捕获VISA错误),本案例为清晰展示核心逻辑未做过多封装。