当前位置: 首页 > web >正文

Python与矢量网络分析仪3671E:通道插损自动化校准(Vscode)

一、背景介绍

        DUT集成了多个可调衰减的射频通道,可调衰减由高精度DAC和VVA构成,使用中电思仪的3671E矢量网络分析仪测试DUT的S参数,并自动化调整VVA的控制电压,以自动化获取指定衰减值对应的控制电平。

二、前期准备

        Python环境:3.11.5(版本过高需要安装ipykernel)

        Vscode版本:version 1.98

        R&S visa:Version 5.12.3(最新版本7.2.5)

        确保本地上位机与矢网以太网通信正常:
如何使用VISA通过以太网(Ethernet)和罗德施瓦茨设备通信_rohde&schwarz频谱仪如何联网-CSDN博客

三、代码实现


3.1 连接仪表
 

import pyvisa 
import time
import numpy as np
# 导入 create_serial_command 函数
from serial_command_XYcal import create_serial_command# 初始化VISA资源管理器
rm = pyvisa.ResourceManager()# 连接到仪器
instrument = rm.open_resource('TCPIP0::10.0.0.102::inst0::INSTR')  # 通过LAN连接的例子ID=instrument.query('*IDN?')  # 查询仪器信息
print("ID: ", ID)instrument.write("*CLS")  # 复位状态寄存器
instrument.write("*RST")  # 复位仪器
instrument.write("CALC:PAR:DEL:ALL")    # 删除所有测量
time.sleep(1)

此处矢网的IP地址为:10.0.0.102,根据需要进行修改。运行代码,通信正常情况下,输出:ID: Ceyear Technologies,3671E,QZNK000625,2.2.0

3.2 仪表设置

        设置内容:起始频率、功率、扫描点数、中频带宽、平均因子、光标等

# -----------DUT参数设置-------------------
test_kind = 'XY' #表征待测试内容的类别
SET_aver_num=5  #平均次数match test_kind=='XY':case 1: #校准矢网,以测试XY通道# # 测量项目和窗口曲线显示:delay_IL=6IL_indicator=5ISO_indicator=40# delay_ISO=2instrument.write("CALC:PAR:DEF:EXT 'Trace1', 'S21'") # 设置Trace1为S21# instrument.write("CALC:PAR:DEF:EXT 'Trace2', 'S11'") # 设置Trace2为S11# instrument.write("CALC:PAR:DEF:EXT 'Trace3', 'S22'") # 设置Trace3为S22instrument.write("DISPlay:WINDow1:STATE ON")         # 显示第一窗口instrument.write("DISP:WIND1:TRACE1:FEED 'Trace1'")  # Trace1显示在第一窗口内# instrument.write("DISP:WIND1:TRACE2:FEED 'Trace2'")  # Trace2显示在第一窗口内# instrument.write("DISP:WIND1:TRACE3:FEED 'Trace3'")  # Trace3显示在第一窗口内#---------------设置起始频率,功率,扫描点数----------instrument.write("SENSe1:FREQ:STAR 3e9")      # 设置起始频率instrument.write("SENSe1:FREQ:STOP 6e9")      # 设置终止频率instrument.write("SOURce1:POWer1 0dBm")       # 设置功率instrument.write("SENSe1:SWEep:POINts 1501")  # 设置扫描点数1501instrument.write("SENSe1:BANDwidth 10000")    # 设置中频带宽instrument.write("SENSe1:AVER:STATe OFF")      # 打开轨迹平均功能instrument.write("SENSe1:AVER:Count "+str(SET_aver_num))       # 设置平均因子为5instrument.write("CALC:PAR:SEL 'Trace1'")     # 选择测量S21instrument.write("CALCulate1:MARKer:AOFF")    # 关闭所有光标 time.sleep(0.1)instrument.write("CALCulate1:MARKer1:STATe ON")    # 打开光标1     instrument.write("CALCulate1:MARKer1:X 6e9")    # 设置光标1的X坐标为6GHz # XYEcal() #XY通道电子校准print("XY通道校准完毕")case _: #校准矢网,以测试Z通道# # 测量项目和窗口曲线显示:delay_IL=1.5IL_indicator=4ISO_indicator=55# delay_ISO=1instrument.write("CALC:PAR:DEF:EXT 'Trace1', 'S21'") #设置Trace1为S11instrument.write("DISPlay:WINDow1:STATE ON")         #显示第一窗口instrument.write("DISP:WIND1:TRACE1:FEED 'Trace1'")  #Trace1显示在第一窗口内#---------------设置起始频率,功率,扫描点数----------instrument.write("SENSe1:FREQ:STAR 2e6")    # 设置起始频率instrument.write("SENSe1:FREQ:STOP 1e9")    # 设置终止频率instrument.write("SOURce1:POWer1 0dBm")    # 设置功率instrument.write("SENSe1:SWEep:POINts 500")    # 设置扫描点数500instrument.write("SENSe1:BANDwidth 10000")    # 设置中频带宽instrument.write("SENSe1:AVER:STATe OFF")      # 打开轨迹平均功能instrument.write("SENSe1:AVER:Count "+str(SET_aver_num))       # 设置平均因子为5instrument.write("CALC:PAR:SEL 'Trace1'")     # 选择测量S21instrument.write("CALCulate1:MARKer:AOFF")    # 关闭所有光标 instrument.write("CALCulate1:MARKer1:STATe ON")    # 打开光标1     instrument.write("CALCulate1:MARKer1:X 1e9")    # 设置光标1的X坐标为1GHz  
#         ZEcal() #Z通道电子校准print("Z通道校准完毕")

3.3 插损态测试

        测得的插损态S21数据作为校准的基准。

#------------------测试参数设置-----------------------
DUT_num='M_0000'  # 模块编号
chn=5   # 测试通道temp=25  #温度值
COM_port = 'COM3'  # 根据实际情况设置串口号
baudrate = 115200  # 波特率
ATT_stage=0 #衰减态
InputPower=0 #输入功率电平
# 初始调控电压
Vctrl_origin = np.array([0, 0.629, 0.684, 0.719, 0.778, 0.831, 0.871, 0.894, 0.92, 0.977, 1.044, 1.073, 1.101, 1.149, 1.192, 1.216, 1.248])if test_kind == 'XY':chn_IL=chn-4chn_ISO=chn-4
else:chn_IL=chnchn_ISO=chninstrument.write("DISP:WIND:TRAC1:Y:RLEVel 0")    # 设置Y轴参考电平0dB
create_serial_command(COM_port, baudrate, chn, Vctrl_origin[ATT_stage]) #串口下发插损态
time.sleep(2)instrument.write("CALC:PAR:SEL 'S21'")  # 选择S21参数
instrument.write("FORM:DATA ASCii")  # 设置为ASCII格式
readdata_0dB = instrument.query("CALC:DATA? FDATA")  # 获取测量数据
readdata_0dB_list = readdata_0dB.splitlines()  # 按行分割数据
data_0dB = np.array([list(map(float, row.split(','))) for row in readdata_0dB_list]) # 将每行数据转换为浮点数,并转换为numpy数组
print('data_0dB测试完成')

3.4 衰减态校准

for ATT_stage in range(1,17,1):CurretVctrl=Vctrl_origin[ATT_stage]print('当前衰减态初始调谐电压值:',CurretVctrl)while True:create_serial_command(COM_port, baudrate, chn, CurretVctrl) #串口下发衰减态time.sleep(1.5)instrument.write("CALC:PAR:SEL 'S21'")  # 选择S21参数instrument.write("FORM:DATA ASCii")  # 设置为ASCII格式data = instrument.query("CALC:DATA? FDATA")  # 获取测量数据data_list = data.splitlines()  # 按行分割数据data_array = np.array([list(map(float, row.split(','))) for row in data_list])  # 将每行数据转换为浮点数,并转换为numpy数组deviation_max=np.max(data_array-data_0dB+ATT_stage)  #取偏离值的最大值和最小值,无偏离时,理论为0deviation_min=np.min(data_array-data_0dB+ATT_stage)deviation_aver=(deviation_max+deviation_min)/2print('偏离平均值:',deviation_aver)   if np.abs(deviation_aver)<=0.05:Vctrl_origin[ATT_stage]=CurretVctrlprint('最终调谐电压为:',CurretVctrl)breakif np.abs(deviation_aver)>=0.1:k=1.1else:k=0.6CurretVctrl=CurretVctrl+0.02*deviation_aver*kprint('当前XY通道校准完成')rounded_Vctrl_origin=[round(num, 4) for num in Vctrl_origin] #取小数点后4位
print(rounded_Vctrl_origin)import os
folder_path = "D:\LBJ\project_files\\vscode_project\TwoSignalAdder_V1\\3671E_XYcal_files"   # 设置文件夹路径和文件名
file_path = os.path.join(folder_path, DUT_num)  
if os.path.exists(file_path):  # 检查文件是否已存在,若存在,则打开文件并读取行数with open(file_path, 'r') as file:lines = file.readlines()
else:lines = []if len(lines) >= 4:   # 判断文件的行数是否已达到限制print("本文件已写满,请检查是否为下一个模块的数据")
else:with open(file_path, 'a') as file:    # 打开文件进行写入file.write(f"ch{len(lines)+1},{','.join(map(str, rounded_Vctrl_origin))}\n")        # 写入数据print(f"数据已写入{file_path}")

3.5 测试校准结果是否准确

#test
for ATT_stage_test in range(0,17,1):CurretVctrl_test=rounded_Vctrl_origin[ATT_stage_test]create_serial_command(COM_port, baudrate, chn, CurretVctrl_test) #串口下发衰减态time.sleep(1.5)# 选择测量类型(此处以S21为例)instrument.write("CALC:PAR:SEL 'S21'")  # 选择S21参数# 选择数据格式(例如CSV)instrument.write("FORM:DATA ASCii")  # 设置为ASCII格式# 获取数据并保存到文件data_test = instrument.query("CALC:DATA? FDATA")  # 获取测量数据# 假设数据是以逗号分隔的多行文本data_list_test = data_test.splitlines()  # 按行分割数据# 将每行数据转换为浮点数,并转换为numpy数组data_array_test = np.array([list(map(float, row.split(','))) for row in data_list_test])deviation_max_test=np.max(data_array_test-data_0dB+ATT_stage_test)  #取偏离值的最大值和最小值,无偏离时,理论为0deviation_min_test=np.min(data_array_test-data_0dB+ATT_stage_test)deviation_aver_test=(deviation_max_test+deviation_min_test)/2print('偏离平均值:',deviation_aver_test)   

3.6 关闭连接

# 关闭连接
instrument.close()

四、资源下载

Python代码下载链接:Python与矢量网络分析仪3671E:通道插损自动化校准(Vscode)资源-CSDN文库

自动化校准所需串口下发函数下载链接:

Python通道插损自动化校准,串口下发指令函数资源-CSDN文库

http://www.xdnf.cn/news/5438.html

相关文章:

  • AI(学习笔记第三课) 使用langchain进行AI开发(2)
  • VSCode1.101.0便携版|中英文|编辑器|安装教程
  • 大模型项目:普通蓝牙音响接入DeepSeek,解锁语音交互新玩法
  • 【React中useRef钩子详解】
  • 《AI大模型应知应会100篇》第56篇:LangChain快速入门与应用示例
  • 【Leetcode 每日一题】1550. 存在连续三个奇数的数组
  • 【心海资源】【最新话费盗u】【未测】提币对方官方波场+没有任何加密+无后门+前端VUE
  • 元数据分类
  • 硬件中断请求号和lspci命令查看到的device id有关系吗?
  • 欧拉路与欧拉回路(模板)
  • LVGL简易计算器实战
  • TGV之LTX:《LTX-Video: Realtime Video Latent Diffusion》翻译与解读
  • RagFlow 完全指南(一):从零搭建开源大模型应用平台(Ollama、VLLM本地模型接入实战)
  • Flutter基础()
  • Qt 中 QWidget涉及的常用核心属性介绍
  • 《AI大模型应知应会100篇》第57篇:LlamaIndex使用指南:构建高效知识库
  • 5.11y打卡
  • 缓存(3):本地缓存作用 及 数据一致性 实现策略
  • upload-labs靶场通关详解:第五关
  • Linux基础(vim编辑器)
  • 自然语言处理与BI融合实战:ChatBI动态语义解析技术架构剖析
  • 基于去中心化与AI智能服务的web3钱包的应用开发的背景描述
  • 【Linux网络】HTTP
  • 【GESP真题解析】第 19 集 GESP 二级 2025 年 3 月编程题 1:等差矩阵
  • X.509证书详解
  • 蓝桥杯14届 数三角
  • 【每日一题 | 2025年5.5 ~ 5.11】搜索相关题
  • [Java实战]Spring Boot 解决跨域问题(十四)
  • 深入探索 RKNN 模型转换之旅
  • llama.cpp初识