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

这篇具有很好参考价值的文章主要介绍了PyVISA使用——用python控制TEK示波器源码实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目要求

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

实现方案

使用PyVISA 方案实现。
VISA (Virtual Instrument Software Architecture) 是一个用于访问测量仪器和控制计算机之间的接口标准,由美国国家仪器公司(National Instruments)推出,用于实现仪器之间的通信和控制。VISA提供了一组标准API函数,可以实现多种通信协议和连接方式的仪器控制。VISA相比于VXI11更加灵活,支持多种接口(底层协议),比如GPIB,RS232,USB, VXIBus等,对于仪器控制有更强大的功能。pyvisa,python脚本,python,开发语言
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 time
import pyvisa as visa
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from datetime import datetime
from pyvisa.errors import VisaIOError
from 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) + xzero                
            with 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://www.toymoban.com/news/detail-687851.html

到了这里,关于PyVISA使用——用python控制TEK示波器源码实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • keil仿真和使用示波器调波形

    Debug的设置,点击魔法棒进行配置 一般情况下,设置后就可以调试出波形,但是报错: error 65: access violation at 0x40023800 : no \\\'read\\\' permission 根本原因是:map地址空间权限映射有问题。部分地址空间没有读写的权限,造成程序不能自动运行。有两个解决办法: 1.方法一 1.1 工程文件

    2024年02月15日
    浏览(44)
  • 【仪器使用操作笔记】 TDS1012示波器基础原理与使用

    今日要学习使用的是一台实验室 老旧战损版 TDS1012示波器 ,它长这样:  本文会从以下目录的几个方面全方位介绍示波器的一些基础运用: 目录  一、面板按键旋钮介绍:  整体面板介绍: 示波器探头接线与校准接线: VOLTS/DIV旋钮调整Y轴电压分度:  VERTICAL区域的POSITION旋

    2024年02月08日
    浏览(43)
  • C# 使用 ScottPlot.WinForms 实现示波器的波形显示

    灵活使用C# 的部分图表组件,可以快速搭建一个【示波器】波形显示的界面 这里使用: ScottPlot.WinForms ,通过官方描述是开源的 下载地址:https://github.com/ScottPlot/ScottPlot.git visual studio 可以使用: NuGet 安装管理 ScottPlot.WinForms ScottPlot 支持:WPF 与 WinForms等多种实现方法 官方介绍

    2023年04月08日
    浏览(148)
  • HNU-电子测试平台与工具-示波器+信号发生器的使用

    该报告最后的得分为 100分/ 100分 。 作者认为可以将它发出来,为有需要的同学,特别是该大学该门科目的后继者提供帮助与解答。 如果喜欢可以点个赞哦,感谢。 班级:计XXXXXX 学号:2021XXXXXXXX 姓名:wolf 目录 1实验要求 2实验内容 2.1示波器的使用部分 2.1.1阐述数字示波器的

    2024年02月07日
    浏览(38)
  • 【数字示波器设计】——基于FPGA的数字示波器实现

    【数字示波器设计】——基于FPGA的数字示波器实现 数字示波器是电子技术领域中非常重要的仪器之一,可以用来观察电信号的波形,是电子工程师必备的工具。而基于FPGA的数字示波器则具有高速、高精度和可编程性强等优势,成为了现代电子工程师常用的示波器。 本文将介

    2024年01月20日
    浏览(42)
  • 【Multisim 14.0】信号发生器和示波器的使用---方波、三角波、正弦波

    目录 Multisim 14.0仿真要求: 仿真 信号发生器产生正弦波 信号发生器产生方波 信号发生器产生三角波 单相交流电源(电压220V,频率50赫兹) 三相交流电源(相电压220V,频率50赫兹) 要求1: 用示波器测交流电源和信号发生器产生的各种波形 。 观察波形形式,查看三相交流电

    2024年02月03日
    浏览(87)
  • ThunderScope开源示波器

    4CH,1GSa/S 开源示波器。前端很简洁,BUF802+LMH6518,ADC是HMCAD1511,用Xilinx A7 FPGA进行控制,数据通过PCIE总线传输到上位机处理。目前这个项目已经被挂到了Xilinx官网,强。 设计日志:https://hackaday.io/project/180090-thunderscope 开源地址:https://github.com/EEVengers/ThunderScope discord讨论组:

    2024年02月16日
    浏览(49)
  • 示波器带宽

    示波器有很多不同规格,确定了可捕获和测量信号的准确度。但是示波器的主要规格是其带宽。 所有示波器都具有以较高频率展示的低通频率响应,如下图所示。大多数带宽规格为 1 GHz 以及更低的示波器通常具有高斯频率响应。示波器高斯频率响应近似于单极点低通滤波器

    2024年02月13日
    浏览(43)
  • 电脑连接示波器读取数据

    示波器型号:北京普源的RIGOL MSO4034 首先连接示波器: 连接线与示波器相连的端口如上图USB DEVICE所示,是一个比较奇怪的方形接口。连接线的另一端是标准的USB typeA接口,可以直接插在电脑上,当示波器和电脑连接时,电脑会提示安装驱动。 该型号示波器端口是业界通用的

    2023年04月08日
    浏览(53)
  • LabVIEW虚拟数字示波器

    1、简易版 1.1、生成虚拟数据 1.2、 数据参数信息 1.3、 调节时间和幅度 1.4、 调节直流偏置和增益 1.5、 数据信号频域分析 1.6、数据信号滤波 1.7、 保存波形数据 1.8、加载波形数据 1.9、停止运行 2、复杂版 2.1、调节数据信号频率、幅度、相位、偏移量和占空比 2.2、调节时

    2024年02月03日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包