0. 实验准备
泰克 AWG70001
一台电脑
一根网线
使用网线连接 AWG70001 和电脑,并且配置 IP 在同一网段下
1. 环境要求
vxi11
numpy
struct
matplotlib
没有的库可以使用下面的命令安装
pip install vxi11
pip install numpy
pip install struct
pip install matplotlib
2.Python代码
首先导入库
import numpy as np
from matplotlib import pyplot as plt
import vxi11
import struct
from time import sleep
2.1 打开连接
ip = "192.168.0.1" # 这里设置为 AWG的 IP,AWG 自带 Windows,可以直接查看 IP 地址
session = vxi11.Instrument('TCPIP::{}::INSTR'.format(ip))
session.timeout = 500
session.clear()
idn_str = session.ask("*idn?")
print(idn_str)
能收到类似下面的回复说明连接成功
TEKTRONIX,AWG70001A,B030508,FV:5.3.0128.0
2.2 开始/停止输出(相当于按下 AWG 的 Run/Stop 按钮)
在 Trigger 模式下,会变成 Waiting
print("开始输出!")
session.write("AWGControl:RUN")
print("停止输出!")
session.write("AWGControl:STOP")
2.3 设置采样率
使用以下的命令设置采样率
sample_rate = 10e9 # 采样率为 10Gs/s
session.write( "CLOCK:SRATE {:e}".format(sample_rate))
2.4 生成并发送自定义波形
2.4.1 生成波形
下面的代码生成了一个起始频率为 5G,终止频率为 5.1G ,Chirp 时长为 20us 的 FMCW 波形
# 参数设置
f_start = 5e9 # 起始频率(Hz)
f_end = 5.1e9 # 终止频率(Hz)
T_chirp = 20e-6 # Chirp时间(秒)
Fs = 1e10 # 采样率(Hz)
# 生成时间轴
t = np.arange(0, T_chirp, 1/Fs)
# 生成线性调频信号
slope = (f_end - f_start) / T_chirp
chirp_signal = np.cos(2 * np.pi * (f_start * t + (1/2) * slope * t**2))
trace = 1
idle_val = 0
yscale = 1
xscale = 1
delay = 0e-9
sample_rate = Fs
invert = 0
period = T_chirp
xdata = np.array(t)
ydata = np.array(chirp_signal)
if(invert):
idle_val = -idle_val
ydata = -ydata
xdata = xdata*xscale + delay
width = xdata[-1]
ydata = ydata*yscale
plt.figure()
plt.plot(xdata,ydata)
plt.show()
下图为 Python 生成的 FMCW 波形
2.4.2 发送波形
下面为发送波形后并且选中波形,然后选中波形的代码。
waveformName = "ExtWaveformCh{:d}".format(trace)
MAX_MEM_SIZE = 262144
MIN_SAMPLE_LEN = 2400
mem_size = MAX_MEM_SIZE
session = vxi11.Instrument('TCPIP::{}::INSTR'.format(ip))
session.timeout = 500
session.clear()
idn_str = session.ask("*idn?")
print(idn_str)
local_objects["session"] = session
print("STOP!")
session.write("AWGControl:STOP")
session.write( "CLOCK:SRATE {:e}".format(sample_rate))
print("准备向通道 {:d}发送数据".format(trace))
n = int(len(xdata))
sample_len = 0
if(period == 0):
sample_len = np.max([MIN_SAMPLE_LEN,n])
else:
sample_len = int(period * sample_rate)
dataList = idle_val*np.ones(sample_len)
n_ = np.min([n,sample_len])
dataList[0:n_] = ydata[0:n_]
data = bytearray()
waveform_length = sample_len
print("波形长度(样本长度*个数): {:d}".format(waveform_length))
print("样本长度(总时间*采样率): {:d}".format(sample_len))
for i in range(sample_len):
value = dataList[i]
data += bytearray(struct.pack("f", value))
# 发送波形文件的命令
commandString = "WLIST:WAVEFORM:DATA \"{}\",0,{},#{}{}".format(waveformName, waveform_length, len(str(4*waveform_length)), str(4*waveform_length))
# 删除同名的波形文件
session.write("WLIST:WAVEFORM:DELETE \"{}\"".format(waveformName))
# 创建波形文件
session.write("WLIST:WAVEFORM:NEW \"{}\" ,{}".format(waveformName, waveform_length))
# 写入波形文件
session.write_raw( str.encode(commandString) + data)
# 选中刚刚发送的波形文件
session.write("SOURCE{:d}:CASSET:WAVEFORM \"{}\"".format(trace,waveformName))
下图为发送到 AWG 后展示的波形,可以发现与设置的一致。发送完成后可以使用 session.write("AWGControl:RUN")
来开始输出(连续模式下),或者是进入Waiting 状态(触发模式下)
2.5 设置 Run mode
使用以下的命令设置 Run mode
# 可选参数: CONTinuous TRIGgered GATed SEQuence
session.write("AWGCONTROL:RMODE TRIGgered") # 设置为触发模式
2.6 Trigger 模式下的一些命令
# 设置触发的电压
session.write("TRIGGER:SEQUENCE:LEVEL 200MV")
# 设置上升沿还是下降沿触发 POSitive NEGATIVE
session.write("TRIGGER:SEQUENCE:SLOPE POSitive")
# 立即触发一次
session.write("TRIGGER:SEQUENCE:IMMEDIATE")
# 设置Run模式 CONTinuous TRIGgered GATed SEQuence
2.7 关闭连接
print("关闭连接")
session.close()
3. 参考
更多的命令可以参考编程手册,github大佬的代码也很不错,但是相对比较冗杂,而且判断的条条框框很多,适合用来学习,自己控制还是参考编程手册比较好。
AWG7000编程手册
https://github.com/acidbourbon/AWG70002A_scripts