CN / EN
CN / EN

写技术文章

PyVISA:使用 Python 控制您的仪器(二):控制信号发生器的输出波形

无敌浩克

2023-09-07 15:49:37

第一章节学习如何使用PyVISA连接仪器之后,我们继续以一个Agilent 33500B信号发生器控制为例程讲解仪器控制。

每个仪器都有不同的属性和功能,建议为每个仪器单独创建一个类,这样后续在控制多台同样类型但地址不同的仪器时候操作更为方便。

1, 1,导入必须的Python模块,比如PyVISA,这里我们多导入一个time模块,使用此模块记录系统操作时间还有延时功能,若还需要其他模块请自行导入;

import pyvisa
import time

2,2,为此仪器单独创建一个专属类,类的属性有该仪器地址和名称;

class waveform_generator:
    def __init__(self,instrument_address):
        self.instrument_address = instrument_address
        self.waveform=0

3,3, 为上述专属类创建方法;

#信号源初始化函数,在此方法里面创建仪器VISA资源连接,并且可配置是否需要复位仪器

def wave_init(self,instrument_rst=1):

#信号源配置函数

#channel_idx 配置仪器的输出通道,这里我们默认配置正弦波
# waveform_type 配置信号源的类型,这里我们默认配置正弦波
# amp_vpp 配置信号源幅度
# apm_offset 配置信号源输出偏置
# phase 配置信号源输出初始相位
# out_load 配置信号源输出阻抗
# freq 配置信号源输出频率
def wave_set(self,channel_idx=1,waveform_type='SIN',amp_vpp=200,apm_offset=100,
                     phase = 0,out_load=50,freq=5000):

#信号源输出状态控制,打开或者关闭信号输出

def wave_output_state(self,output_state=0):

4, 4,类的属性和方法均定义成功后,接下来调用此类来控制信号发生器

#首先配置需要控制的仪器地址,该地址信息可以在‘NI-MAX’或者pyvisa resource manager中查看

waveform_generator_address = 'USB0::0x0957::0x2B07::MY52700860::INSTR' 

#创建一个变量来实例化该类

wave1=waveform_generator(waveform_generator_address)

#接下来以一个输出幅度变化的正弦波为例讲解调用该类的方法

wave1.wave_init(instrument_rst=1) #init instrument
wave1.wave_output_state(output_state=1)  # turn on the output
amp_vpp = 100;
while 1:
    if amp_vpp == 1000:
        break
    amp_vpp += 20;
    wave1.wave_set(waveform_type='SIN',amp_vpp=amp_vpp,apm_offset=0,
                 phase = 0,out_load=50,freq=5000) #set the parameters of channel1
    time.sleep(1)
wave1.wave_output_state(output_state=0)  # turn off the output

详细的指令信息请参考《Agilent 33500 Series Waveform Generator Operating and Service Guide》

完整的类定义参考如下:

class waveform_generator:
    def __init__(self,instrument_address):
        self.instrument_address = instrument_address
        self.waveform=0
 
    def wave_init(self,instrument_rst=0):
        rm=pyvisa.ResourceManager()
        wave_address=rm.list_resources()
        print(wave_address,type(wave_address))
        self.waveform = rm.open_resource(self.instrument_address)
        print(self.waveform.query('*IDN?'))
        print('waveform SCPI version:',self.waveform.query(':SYSTem:VERSion?'))   #return the SCPI version level
        print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), 'waveform connect success')
        if instrument_rst==1:
            self.waveform.write('*RST')   #reset waveform
            print('waveform reset success')
        self.waveform.write('*CLS')  #clear the status data structures
 
    def wave_set(self,channel_idx=1,waveform_type='SIN',amp_vpp=200,apm_offset=100,
                     phase = 0,out_load=50,freq=5000):
        # waveform_type='SIN'  # SCPI: FUNCtion {SIN|SQU|RAMP|PULSe|NOIS|DC|PRBS|ARB}
        self.waveform.write(f'FUNCtion {waveform_type}')
        self.waveform.write(f'FREQ {freq}')
        self.waveform.write(f'VOLTage {amp_vpp} mV')
        self.waveform.write(f'VOLT:OFFS {apm_offset} mV')
        self.waveform.write(f'PHASe {phase}')
        self.waveform.write(f'OUTPut:LOAD {out_load}')  #'50' or 'INF'
        # print(f'CHANnel{channel_idx} OUTPut[1|2]:LOAD =', self.waveform.query('OUTPut:LOAD?'))
 
    def wave_output_state(self,output_state=0):
        self.waveform.write(f'OUTPut:STATe {output_state}')
        print('waveform output state= ',self.waveform.query(':OUTPut:STATe?'))


1收藏

3赞成

1条评论
您的评论
我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注