我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PyVISA使用——用python控制TEK示波器源码实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PyVISA使用——用python控制TEK示波器源码实现

项目要求

项目上提出自动化测试需求,要求能够对板级信号使用示波器等仪器做自动化测量

实现方案

使用PyVISA 方案实现。
VISA (Virtual Instrument Software Architecture) 是一个用于访问测量仪器和控制计算机之间的接口标准,由美国国家仪器公司(National Instruments)推出,用于实现仪器之间的通信和控制。VISA提供了一组标准API函数,可以实现多种通信协议和连接方式的仪器控制。VISA相比于VXI11更加灵活,支持多种接口(底层协议),比如GPIB,RS232,USB, VXIBus等,对于仪器控制有更强大的功能。在这里插入图片描述
Pyvisa是一个基于Python语言开发的访问VISA资源的工具包。通过调用VISA标准API函数来实现与仪器的通信和控制。Pyvisa提供了一组Python的API函数,可以方便地访问VISA库中的函数和方法,从而实现与仪器的数据读取、写入、控制等操作。Pyvisa相比于LabVIEW,Pyvisa是一种跨平台的软件,可以在Linux,Windows和Mac OS上运行,且其拥有更灵活的用户界面,可以自行定制。

如果该脚本运行在服务器上,建议使用Pycharm Professional 或者VSCode + Remote-SSH 插件进行开发,即本地开发,远程部署或调试。

本例使用SCPI命令访问示波器的VISA库,SCPI命令的格式见示波器软件编程手册

脚本实现功能

(1)连接示波器
注意:电脑并没有使用NI-VISA后台,而是使用纯python代码实现的Pyvisa-py, 因此需要提前安装下 pip install -U pyvisa-py
(2)简单设置示波器参数,包括channal 选择,横轴窗口设置,纵轴电压窗口设置,Trigger触发方式选择
(3)波形数据以csv 和图片格式保存到本地
(4)保存示波器的截图到本地

脚本与注释

import timeimport pyvisa as visaimport numpy as npimport matplotlib.pyplot as pltimport pandas as pdfrom datetime import datetimefrom pyvisa.errors import VisaIOErrorfrom PIL import Image# rm = visa.ResourceManager('@py')# rm.list_resources()# Tek = rm.open_resource('TCPIPO::10.163.xxx.xxx::INSTR')# Tek.timeout=10000# print(Tek.query('*IDN?'))# self.inst.write('*RST')# self.inst.write('AUTOSET EXECUTE')class Tektronix_DPO:        def __init__(self):            self.rm = visa.ResourceManager('@py')            self.rm.list_resources()            self.inst = self.rm.open_resource('TCPIPO::10.163.xxx.xxx::INSTR')            self.inst.timeout=10000            print(self.inst.query('*IDN?'))            self.inst.write('CLEAR')            self.inst.write('ACQuire:MODe?')            self.inst.write('ACQUIRE:STOPAFTER RUNSTOP')            self.inst.write('ACQuire:STATE RUN')            self.inst.write('autoset EXECUTE') # autoset                      def set_HORIZONTAL(self, POSITION, SCALE):         #horizontal settings            self.inst.write('HORIZONTAL:POSITION %s'%POSITION)  #position means trigger point on the screen /%            self.inst.write('HORIZONTAL:SCALE %se-6'%SCALE)     #scale means step /us          def open_ch(self,ch):   # open channal            self.inst.write('DISplay:GLObal:CH%s:STATE ON'%ch)          def close_ch(self,ch):  # close channal            self.inst.write('DISplay:GLObal:CH%s:STATE OFF'%ch)          def vertical_ch(self,ch,scale,position):     #channal settings,            self.inst.write('CH%s:BANDWIDTH FULl'%ch) # at its maximum bandwidth            self.inst.write('CH%s:SCAle %sE-3'%(ch,scale))     #channal scale/mv            self.inst.write('CH%s:POSition %s'%(ch,position))  #channal divisions above the center graticule            self.inst.write('CH%s:COUPLING DC'%ch)     # DC coupling            self.inst.write('CH%s:TERMINATION 10.0E+5'%ch) #channal input resistence is 1MΩ          def trigger_set(self,ch,level):        #trigger settings            self.inst.write('TRIGGER:A:EDGE:COUPLING DC')  # DC trigger coupling with input signal to the trigger circuitry            self.inst.write('TRIGGER:A:EDGE:SOURCE CH%s'%ch)            self.inst.write('TRIGGER:A:EDGE:SLOPE RISE')   #triggers on the rising edge of the signal            self.inst.write('TRIGGER:A:LEVEL:CH%s %s'%(ch,level))  # level specifies channal trigger level for seach 1, /V            def begin_trigger(self): #start once trigger action            self.inst.write('acquire:state 0') # stop            self.inst.write('acquire:stopafter SEQUENCE') # single            self.inst.write('acquire:state 1') # run            self.inst.query('*opc?') # sync                def data_caul(self,ch): #calculate the channal value            self.inst.write("HEADER 0")            self.inst.write('DATA:SOURCE CH%s'%ch)            self.inst.write("DAT:ENC SRI")   # Signed Binary Format, LSB order            self.inst.write("DAT:WIDTH 1")            self.inst.write("DAT:START 1")            recordLength = int(self.inst.query('horizontal:recordlength?'))            self.inst.write("DAT:STOP {0}".format(recordLength)) # Set data stop to match points available            # Fetch horizontal scaling factors            xinc = float(self.inst.query("WFMO:XINCR?"))            xzero = float(self.inst.query("WFMO:XZERO?"))            pt_off = int(self.inst.query("WFMO:PT_OFF?"))            # Fetch vertical scaling factors            ymult = float(self.inst.query("WFMO:YMULT?"))            yzero = float(self.inst.query("WFMO:YZERO?"))            yoff = float(self.inst.query("WFMO:YOFF?"))            # Fetch waveform data and save as csv file            rawData = self.inst.query_binary_values('curve?', datatype='b', container=np.array)                   dataLen = len(rawData)            t0 = (-pt_off * xinc) + xzerowith open('horizonal_vector.csv',mode='w') as file:                for i in range(0,dataLen):                    xvalues = t0 + xinc * i # Create timestamp for the data point                    file.write(str(xvalues))                    file.write(",")                     yvalues= float(rawData[i] - yoff) * ymult + yzero # Convert raw ADC value into a floating point value                    file.write(str(yvalues))                    file.write("\n")                    # plotting the measurement figure            data = pd.read_csv("horizonal_vector.csv")            data_x = data.iloc[:,0]            data_y = data.iloc[:,1]            plt.plot(data_x, data_y)            plt.title('channel 1') # plot label            plt.xlabel('time (seconds)') # x label            plt.ylabel('voltage (volts)') # y label            print("look for plot window...")            plt.savefig('test.png')     #save test picture            plt.show()                       def close(self):            self.inst.close()            self.rm.close()            def get_screen(self):            self.inst.write("HARDCopy:PORT FILE;")            self.inst.write("EXPort:FORMat PNG")            self.inst.write("HARDCopy:FILEName \"C:\\est_Temp\\Temp.png\"")            self.inst.write("HARDCopy STARt")            self.inst.write("FILESystem:READFile \"C:\\Low_Speed_Test_Temp\\Temp.png\"")            imgData = self.inst.read_raw()            dt = datetime.now()            fileName = dt.strftime("DPO70000_%Y%m%d_%H%M%S.png") # Generate a filename with date and time            file = open(fileName, "wb")            file.write(imgData)            file.close()            self.inst.write('FILESystem:DELEte \"C:\\Test_Temp\\Temp.png\"') # Delete image file from instrument's hard disk.            if __name__ == "__main__":        my=Tektronix_DPO()    my.set_HORIZONTAL(0,40E-3)    my.open_ch(1)    my.vertical_ch(1,200,0)    my.trigger_set(1,0)    my.begin_trigger()    my.data_caul(1)    my.get_screen()    my.close()

参考

【1】TEK DPO系列示波器编程手册
【2】PyVISA官方文档
【3】TEK 技术交流论坛

来源地址:https://blog.csdn.net/qq_27655845/article/details/129602483

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PyVISA使用——用python控制TEK示波器源码实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringMVC编程使用Controller接口实现控制器实例代码

Controller简介Controller控制器,是MVC中的部分C,为什么是部分呢?因为此处的控制器主要负责功能处理部分:1、收集、验证请求参数并绑定到命令对象;2、将命令对象交给业务对象,由业务对象处理并返回模型数据;3、返回Mode
2023-05-30

Python编程使用tkinter模块实现计算器软件完整代码示例

Python 提供了多个图形开发界面的库。Tkinter就是其中之一。 Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录