【无标题】py控制泰克示波器,
python 操作TK示波器(NI-VISA)
NI-VISA这是一种美国的一家公司的协议,主要用来和仪器通信,当然这只是一种通信的格式,具体的操作我们还是要参照示波器的说明书。
我们直接采用Python里面自带的NI—VISA库文件。pip install pyvisa,然后安装好NI-VISA的驱动,百度到官网即可下载安装。
通过VISA发送相应命令(示波器编程文档有命令集)即可完成对示波器的控制,并且通过VISA可以接收返回值,比如波形数据等。
这里是通过USB来与示波器通信
1 rm = visa.ResourceManager() 2 # res = rm.list_resources() 3 # print(rm) 4 # print(res) 5 self.inst = rm.open_resource('USB0::0x0699::0x0528::C019161::INSTR')
第一行是得到visa资源管理器,第二行的res会是返回当前与电脑连接的端口地址,采用print()将其打印出来即可看到你的示波器地址。然后就可以注释掉了,然后使用第五行的代码即可打开示波器通信通道。
源码如下:
1 import matplotlib.pyplot as plt2 import visa3 import time4 from datetime import datetime # std library5 6 class Tektronix_MSO64:7 def __init__(self):8 visa_dll = 'c:/windows/system32/visa32.dll'9 self.rm = visa.ResourceManager()10 # res = rm.list_resources()11 # print(rm)12 # print(res)13 self.inst = self.rm.open_resource('USB0::0x0699::0x0528::C019161::INSTR')14 ##############################################15 self.inst.write("*IDN?")16 print(self.inst.read())17 self.inst.write('CLEAR')18 self.inst.write('ACQuire:MODe?')19 print(self.inst.read())20 self.inst.timeout = 2500021 self.inst.write('ACQUIRE:STOPAFTER RUNSTOP')22 self.inst.write('ACQuire:STATE RUN')23 24 25 def set_HORIZONTAL(self,POSITION,SCALE):#HORIZONTAL position,HORIZONTAL scale /us26 self.inst.write('HORIZONTAL:POSITION %s'%POSITION)27 self.inst.write('HORIZONTAL:SCALE %se-6'%SCALE)28 29 def open_ch(self,ch):#关闭相应通道30 self.inst.write('DISplay:GLObal:CH%s:STATE ON'%ch)31 32 def close_ch(self,ch):#打开相应通道33 self.inst.write('DISplay:GLObal:CH%s:STATE OFF'%ch)34 35 def vertical_ch(self,ch,scale,position):#通道,ch scale/mv,ch POSition,36 self.inst.write('CH%s:BANDWIDTH FULl'%ch)#at its maximum bandwidth37 self.inst.write('CH%s:SCAle %sE-3'%(ch,scale))38 self.inst.write('CH%s:POSition %s'%(ch,position))39 self.inst.write('CH%s:COUPLING DC'%ch)#直流40 self.inst.write('CH%s:TERMINATION 10.0E+5'%ch)#1兆欧41 42 def trigger_set(self,ch,level):#通道,触发电压43 self.inst.write('TRIGGER:A:EDGE:COUPLING DC')#边沿触发44 self.inst.write('TRIGGER:A:EDGE:SOURCE CH%s'%ch)45 self.inst.write('TRIGGER:A:EDGE:SLOPE RISE')#上升沿触发46 self.inst.write('TRIGGER:A:LEVEL:CH4 %s'%level)47 48 def begin_trigger(self):#开启一次触发49 self.inst.write('ACQuire:STOPAfter SEQuence')50 while 1:#等触发了才借宿51 time.sleep(1)52 self.inst.write('TRIGGER:STATE?')53 TRIGGER_STATE =self.inst.read()54 if TRIGGER_STATE[0] == "S":55 print('have triggered')56 break57 58 def data_caul(self,ch):#通道59 self.inst.write('DATA:SOURCE CH%s'%ch)60 self.inst.write('DATa:ENCdg ASCIi')61 self.inst.write('WFMOUTPRE:BYT_NR 4')62 self.inst.write('DATA:START 1')63 self.inst.write('DATA:STOP 250e6')64 self.inst.write('WFMOUTPRE?')65 preamble= self.inst.read()66 #获取HORIZONTAL:POSITION67 self.inst.write('HORIZONTAL:POSITION?')68 HORIZONTAL_p=self.inst.read()69 HORIZONTAL_pfloat=float(HORIZONTAL_p)70 #获取HORIZONTAL:SCALE71 self.inst.write('HORIZONTAL:SCALE?')72 HORIZONTAL_S=self.inst.read()73 HORIZONTAL_Sfloat=float(HORIZONTAL_S)74 #获取ch POSition75 self.inst.write('CH%s:POSition?'%ch)76 divus_str = self.inst.read()77 divus_float = float(divus_str)78 #获取ch SCAle79 self.inst.write('CH%s:SCAle?'%ch)80 div_str = self.inst.read()81 div_float = float(div_str)82 #########################################################获取采样点数目83 j=084 point_str=' '85 for i in range(0,len(preamble)):86 if preamble[i]==',':87 j+=188 elif j==4:89 point_str=point_str+preamble[i]90 elif j==5:91 point_len=len(point_str)92 point_str=point_str[2:(point_len-6)]93 break94 point_int=int(point_str)95 print('point_num:%d'%point_int)96 ######################################################数据处理97 data = self.inst.query('CURVE?')98 x = []99 dat = [' '] 100 dat1 = [] 101 j = 0 102 for i in range(0, len(data)): 103 if data[i] == ',': 104 dat1.append(float(dat[j])/32000*div_float*5-div_float*divus_float) 105 x.append((int(j)/point_int*HORIZONTAL_Sfloat*10-HORIZONTAL_Sfloat*10*HORIZONTAL_pfloat/100)) 106 j += 1 107 dat.append(' ') 108 else: 109 dat[j] = dat[j] + data[i] 110 plt.plot(x, dat1) 111 112 def close(self): 113 self.inst.close() 114 self.rm.close() 115 116 def get_screen(self): 117 self.inst.write('SAVE:IMAGE "E:/waveform_screen.bmp"') 118 time.sleep(1) 119 self.inst.write('FILESYSTEM:READFILE "E:/waveform_screen.bmp"') 120 img = self.inst.read_raw() 121 dt = datetime.now() 122 fileName = dt.strftime("%Y%m%d_%H%M%S.bmp") # 以当前时间建立文件名 123 imgFile = open('./waveform/' + fileName, "wb") # 打开图片文件,如果没有就会新建一个 124 imgFile.write(img) 125 imgFile.close() 126 self.inst.write('FILESYSTEM:DELETE "E:/waveform_screen.bmp"') 127 128 129 130 131 132 if __name__ == "__main__": 133 fig = plt.figure() 134 my=Tektronix_MSO64() 135 my.set_HORIZONTAL(10,200) 136 my.open_ch(4) 137 my.open_ch(3) 138 my.open_ch(2) 139 my.open_ch(1) 140 my.vertical_ch(4,2000,1) 141 my.vertical_ch(3,2000,2) 142 my.vertical_ch(2,2000,2) 143 my.vertical_ch(1,2000,2) 144 my.trigger_set(4,2) 145 my.begin_trigger() 146 my.data_caul(4) 147 my.data_caul(3) 148 my.data_caul(2) 149 my.data_caul(1) 150 my.get_screen() 151 plt.show() 152 my.close()
根据示波器编程文档,通过visa发送相应命令,接收相应返回值即可完成对示波器的控制,获取数据等,具体命令可以参考相应的编程文档。
此代码具有以下功能:
设置水平轴相关设置;
设置通道相关设置;
打开,关闭相应通道;
设置触发;
开启一次触发;
获取波形数据,并处理数据,然后通过plot()显示出来;
获取截屏图片,保存到pc本地;
下面是其他控制代码。可以设置测量方式,读取泰克示波器的上升沿等
# coding=utf-8
from datetime import datetime
import pyvisa
import timeclass Tektronix_MSO64:def __init__(self):rm = pyvisa.ResourceManager("C:/Windows/System32/visa32.dll")self.inst = rm.open_resource('USB0::0x0699::0x0368::C031376::INSTR')self.inst.write("*IDN?") # 返回示波器识别码# print(self.inst.read())self.inst.write('*CLS') # 清除示波器状态self.inst.write('*ESR?') # 查询标准状态寄存器的内容# print(self.inst.read())self.inst.write('ALLEV?') # 使示波器返回所有事件及其消息# print(self.inst.read())# self.inst.write('FACTORY') # 恢复出厂设置self.inst.timeout = 50000def close(self):self.inst.write('*CLS') # 清除示波器状态self.inst.write('*ESR?') # 查询标准状态寄存器的内容# print(self.inst.read())# self.inst.write('FACTORY') # 恢复出厂设置self.inst.close()def set_horizontal(self, VOLTS, SCALE):self.inst.write('CH1:VOLTS %s' % VOLTS) # 设置示波器的垂直刻度self.inst.write('HOR:MAIN:SCALE %se-3' % SCALE) # 设置示波器的水平刻度self.inst.write('TRIG:MAIN:LEVEL 2.4') # 触发装置设置为2.4Vdef operate_set(self):self.inst.write('AUTORANGE:STATE ON') # 启动自动量程功能self.inst.write('ACQUIRE:STOPAFTER SEQUENCE') # 按下RUN/STOP按钮将示波器设置为停止采集self.inst.write('ACQuire:STATE ON') # 开始采集数据,将采集次数重置为0# self.inst.write('*OPC?') # 查询OPC操作是否已完成# print(self.inst.read())def period_measure(self):self.inst.write('MEASU:IMMED:TYPE PERIOD') # 设置为测量周期self.inst.write('MEASU:IMMED:VALUE?') # 执行前面命令指定的立即示波器测量global reperiodstr_rperiod = self.inst.read()str_rperiod = str_rperiod[str_rperiod.rfind(' '):]rperiod = float(str_rperiod) * 1000rperiod = '%.2f' % rperiodreperiod = float(rperiod)print('实测周期:', reperiod)def frequency_measure(self):self.inst.write('MEASU:IMMED:TYPE FREQ') # 设置为测量频率self.inst.write('MEASU:IMMED:VALUE?') # 执行前面命令指定的立即示波器测量global rfrequentstr_frequency = self.inst.read()str_frequency = str_frequency[str_frequency.rfind(' '):]rfrequency = float(str_frequency)rfrequency = '%.2f' % rfrequencyrfrequent = float(rfrequency)print('实测频率:', rfrequent)def duty_measure(self):self.inst.write('MEASU:IMMED:TYPE PDUTY') # 设置为测量占空比self.inst.write('MEASU:IMMED:VALUE?') # 执行前面命令指定的立即示波器测量global redutystr_duty = self.inst.read()str_duty = str_duty[str_duty.rfind(' '):]rduty = float(str_duty)rduty = '%.2f' % rdutyreduty = float(rduty)print('实测占空比:', reduty)def rise_time_measure(self):self.inst.write('MEASU:IMMED:TYPE RISE') # 设置为测量上升时间self.inst.write('MEASU:IMMED:VALUE?') # 执行前面命令指定的立即示波器测量str_rise = self.inst.read()str_rise = str_rise[str_rise.rfind(' '):]rise = float(str_rise)rise = '%.2f' % riseriser = float(rise)print('实测上升时间:', riser)def positive_pulse_width_measure(self):self.inst.write('MEASU:IMMED:TYPE PWIDTH') # 设置为测量正脉冲宽度self.inst.write('MEASU:IMMED:VALUE?') # 执行前面命令指定的立即示波器测量str_positive_pulse_width = self.inst.read()str_positive_pulse_width = str_positive_pulse_width[str_positive_pulse_width.rfind(' ')]positive_pulse_width = float(str_positive_pulse_width)positive_pulse_width = '%.2f' % positive_pulse_widthprint('实测正脉冲宽度为:', positive_pulse_width)def negative_pulse_width_measure(self):self.inst.write('MEASU:IMMED:TYPE NWIDTH') # 设置为测量负脉冲宽度self.inst.write('MEASU:IMMED:VALUE?') # 执行前面命令指定的立即示波器测量str_negative_pulse_width = self.inst.read()str_negative_pulse_width = str_negative_pulse_width[str_negative_pulse_width.rfind(' ')]negative_pulse_width = float(str_negative_pulse_width)negative_pulse_width = '%.2f' % negative_pulse_widthprint('实测负脉冲宽度:', negative_pulse_width)def basic_set(self):self.inst.write('*ESR?') # 查询标准状态寄存器的内容# print(self.inst.read())self.inst.write('ALLEV?') # 使示波器返回所有事件及其消息# print(self.inst.read())self.inst.write('WFMPRE?') # 查询波形数据的编码类型# print(self.inst.read())def waveform_save(self):self.inst.write('RECALL:WAVEFORM' 'D:\TST-PRD\TST-01.CSV')self.inst.write('SELECT:REFC')def get_screen(self):self.inst.write('SAVE:IMAGE "D:/waveform_screen.bmp"')time.sleep(1)self.inst.write('FILESYSTEM:READFILE "D:/waveform_screen.bmp"')img = self.inst.read_raw()dt = datetime.now()fileName = dt.strftime("%Y%m%d_%H%M%S.bmp") # 以当前时间建立文件名imgFile = open('./waveform/' + fileName, "wb") # 打开图片文件,如果没有就会新建一个imgFile.write(img)imgFile.close()self.inst.write('FILESYSTEM:DELETE "D:/waveform_screen.bmp"')def oscilloscoper():rm = Tektronix_MSO64()rm.set_horizontal(2.0, 10)# rm.operate_set()rm.period_measure()rm.frequency_measure()rm.duty_measure()rm.basic_set()rm.close()if __name__ == "__main__":oscill = Tektronix_MSO64()oscill.set_horizontal(2.0, 1)# oscill.operate_set()oscill.period_measure()oscill.frequency_measure()oscill.duty_measure()# oscill.waveform_save()oscill.basic_set()# oscill.get_screen()
【无标题】py控制泰克示波器,相关推荐
- python控制泰克示波器捕捉触发波形
对于一些针对开关机出现偶发启动异常的问题需要捕获下异常情况的波形,但是异常情况并不是每次都能触发到,所以需要自动化去捕捉波形然后进行分析,这里就介绍下使用python控制泰克示波器进行设置单次触发获取 ...
- 泰克示波器控制scpi,程序读取波形数据并显示
泰克示波器控制scpi,程序读取波形数据并显示,py程序 """ tektronix MDO3000 series oscilloscope test "&qu ...
- 泰克示波器校准显示无校准文件怎么办?
泰克示波器应用于汽车电子,无线信号,高速信号不同行业中调试,验证,纠错,认证等100余种高级应用测试中,今天安泰测试给大家具体分析一下泰克数字示波器的校准调整方法到底有几种? 一.进入调整模式 为了防 ...
- 泰克示波器查眼图_泰克示波器
示波器是设备维修中必不可少的一种仪器.有了它技术人员就能快速.准确的找到故障所在,所以正确.熟练使用示波器是维修人员的的必修课程.同时,也是电子工程师不可或缺的工具,被称为电子工程师的"眼睛 ...
- tek示波器软件_Tektronix(泰克示波器)
美国泰克DPO4000/MSO4000系列数字/混合信号示波器 常用用型号:TDS3054B TDS3052C OPO4554 TDS1012B DPO 3032 TDS 1012B-SC TDS30 ...
- 语言 泰克示波器程序_泰克Tektronix 任意波函数发生器AFG2000系列AFG2021
一.概述 通常,生成多种信号需要投资购买高端的信号发生器.AFG2021 任意波形/函数发生器具有 20 MHz 的带宽,14 位分辨率和 250 MS/s 采样率,可创建简单和复杂波形. 最令人印象 ...
- 泰克mdo3014使用手册_泰克示波器MDO3014故障维修案例分享
近期有客户送修一台泰克示波器MDO3014,反馈示波器通道3有故障,希望我们能够尽快维修.具体维修过程如下: 一.仪器型号: 泰克示波器MDO3014 二.仪器主要参数: 混合域示波器,4个模拟通道( ...
- 泰克示波器查眼图_如何用泰克示波器测量眼图
原标题:如何用泰克示波器测量眼图 示波器作为电子工程师常用的仪器,主要用来观察电信号,现在的数字示波器还加入了频谱分析功能.平常用到的主要是测量电信号波形,抓取快速变化信号.现今示波器的功能越来越强大 ...
- 泰克示波器TDS210更换IPS彩色屏幕
本文将介绍如何为泰克示波器TDS210更换当前流行的IPS彩色屏幕,甚至在以后准备将屏幕图像转换为HDMI输出,彻底对以往的老旧屏幕说拜拜. 文章如有侵权请联系我删除. 目录 一.缘起 1.与TDS2 ...
最新文章
- C++中自定义比较函数和重载运算符总结
- How to mannuly configure vmtools in VM-Ware?
- Linux文件系统的组成部分
- linux deepin换源:换成国内镜像源(上海交大镜像源)
- 十二 Cent OS下 tomcat启动项目响应速度很慢
- 小朋友学数据结构(3):二叉树的建立和遍历
- win10 Java JDK环境变量配置
- Linux+Apache+PHP+MySQL服务器环境(CentOS篇)
- 【接口测试】接口测试用例设计
- 泊松分布,指数分布与排队论模型
- 奇点云数据中台技术汇 | 数据治理——企业数字化转型的基石
- 【MOOC手写体】王文敏教授.《人工智能原理》 第10章 机器学习的任务 Part5 C10.1...
- 【容器】Podman容器快速上手
- 逻辑回归实现数字手写识别
- zblog主题,zblog主题制作,zblog网站模板主题
- Deep Learning(深度学习)
- Python学习笔记1-内置数据结构
- Python中pupl的基础操作
- 2021年最新UI/UE设计软件全家桶
- 远程连接工具radmin2.2