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()
运行与验证方法
- 将代码中
VISA_ADDR替换为实际设备地址(可通过python -m pyvisa info查看) - 在电源输出端连接合适的负载(如100Ω电阻,5V时电流约50mA)
- 运行脚本:
python dc_power_control.py - 观察输出:若显示“电压验证: 通过”且“电流验证: 通过”,则判定测试成功
预期输出示例
检测到资源: ['USB0::0xFFFF::0x1E00::P0001234::INSTR']
连接设备: USB0::0xFFFF::0x1E00::P0001234::INSTR
已设置: CH1 电压=5.0V, 电流限制=0.5A
输出已启用
回读电压: 5.002 V
回读电流: 0.049 A
电压验证: 通过
电流验证: 通过
输出已关闭
测试完成
注意事项
- 若电源为单通道设备,代码中的通道选择命令会自动忽略
- 确保负载功率在电源额定范围内,避免过载
- 不同品牌电源的SCPI命令略有差异,若命令不兼容请查阅对应编程手册
- 脚本执行完毕后自动关闭输出,防止意外上电