【Python】通过 Python 控制 AWG70001 发送任意波

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天地神仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值