Python控制仪器 【1,控制直流电源】
时间:2022-11-24 15:30:00
仪器连接
计算机与仪器连接有四种方式: USB、LAN、RS232 和 GPIB接口 ,仪器和计算机之间的远程通信可以通过这些接口建立,通常使用LAN口连接。
推荐使用keysight的IO Library该软件支持各种接口通信,可检测仪器与计算机连接是否成功,连接成功后可通过visa与仪器建立地址通信。
出于隐私保护,以下代码省去了仪器visa地址。测试时应自行添加。
导入库函数
Python首先需要导入控制仪器pyvisa有关控制命令可参考pyvisa官方网站和仪器用户手册 。推荐使用编辑器Pycharm
import pyvisa as visa import time rm = visa.ResourceManager()
以下是对两种类型电源的控制
1. 普源(RIGOL)DP800系列电源
该系列电源有List无需导入功能time循环输出电压可直接设置为函数。
代码功能
起始电压0V ,终止电压28V,电流200mA,循环输出40组,时间间隔5s 。
# ----------------------------------------------------------- # rigol 电源控制 # ----------------------------------------------------------- DCrigol = rm.open_resource("visa地址") print(DCrigol.query("*IDN?")) # /*查询电源ID检测远程通信是否正常*/ DCrigol.write('*RST;*CLS') # 仪器复位 # 定时输出 扫描电压0-28V 电流200mA DCrigol.write(':DELAY:GROUP 40') # /*输出组数:40*/ DCrigol
.
write
(
':DELAY:CYCLE N,20'
) #
/*设置循环数:20*/ DCrigol
.
write
(
':DELAY:ENDS LAST '
) #
/*设置终止状态:最终状态*/ DCrigol
.
write
(
':TIME:TEMP:SEL SINE'
) #
/*选择模板:Sine*/ DCrigol
.
write
(
':TIME:TEMP:OBJ V, 200mA'
) #
/*选择编辑对象为电压,并将电流设置为 200A*/ DCrigol
.
write
(
':TIME:TEMP:MAXV 28.000'
) #
/*设置最大值:28V*/ DCrigol
.
write
(
':TIME:TEMP:MINV 0.000'
) #
/*设置最小值:0V*/ DCrigol
.
write
(
':TIME:TEMP:POINT 20'
) #
/*设置总点数:20*/ DCrigol
.
write
(
':TIME:TEMP:INTE 5'
) #
/*设置时间间隔:5s*/ DCrigol
.
write
(
':TIME:TEMP:INVE ON '
) #
/*打开反相*/ DCrigol
.
write
(
':TIME:TEMP:CONST '
) #
/*构建定时参数*/ DCrigol
.
write
(
':MEM:STOR RTF,1 '
) #
/*将已编辑的定时参数保存在内部存储器中*/ DCrigol
.
write
(
':OUTP CH1,ON '
) #
/*打开 CH1 的输出*/ DCrigol
.
write
(
':TIME ON'
) #
/*打开定时输出*/
2. 艾德克斯(IT6500系列)电源
首先发送一个简单的电压电流指令:
# DCIT6500.write(':APPL 2,0.1' ) # 输出电压电流
# DCIT6500.write(':OUTPut ON')
电源配有蜂鸣器,每次按键会哔哔哔哔一直响,怪烦的~~ 通过代码可以使蜂鸣器关闭。
该电源无List功能 , 且目前本人水平有限只能堆砌代码写进电压值,具体思路为:先发送一个电压值VOLT1,延时3S再发送VOLT2,依次类推~
理想方案是自定义封装一个有起始、终止、步长的循环函数再调用,老爷们期待后续更新~
代码功能
起始电压0V,终止电压5V,步进0.5V,电流500mA ,时间间隔3s。
# -----------------------------------------------------------
# IT6500电源控制
# -----------------------------------------------------------
DCIT6500 = rm.open_resource("USB0::0xFFFF::0x6500::800530020737420002::0::INSTR")
print(DCIT6500.query("*IDN?"))
DCIT6500.write('*RST;*CLS')
DCIT6500.write('SYSTem:ERRor?') # 读取电源的错误代码及错误讯息。
DCIT6500.write('*TST?') # 自检,成功为0,失败则为1.
DCIT6500.write(':SYSTem:REMote') # 远程控制
DCIT6500.write(':SYSTem:BEEPer 0') # 关闭或打开蜂鸣器 0关闭
# 循环电压输出
DCIT6500.write(':VOLTage 0;:PROTect 30;') # 过压过流保护
DCIT6500.write(':CURRent 500mA;:PROTect 5')
time.sleep(3)
DCIT6500.write(':VOLTage 1;:PROTect 30;') # 过压过流保护
DCIT6500.write(':CURRent 500mA;:PROTect 5')
time.sleep(3)
DCIT6500.write(':VOLTage 1.5;:PROTect 30;') # 过压过流保护
DCIT6500.write(':CURRent 500mA;:PROTect 5')
time.sleep(3)
DCIT6500.write(':VOLTage 2.5;:PROTect 30;') # 过压过流保护
DCIT6500.write(':CURRent 500mA;:PROTect 5')
time.sleep(3)
DCIT6500.write(':VOLTage 3.5;:PROTect 30;') # 过压过流保护
DCIT6500.write(':CURRent 500mA;:PROTect 5')
time.sleep(3)
.
.
.
DCIT6500.write(':OUTPut ON')
以上代码亲测有效,欢迎交流、转载、点赞~