通过 Python 控制 AWG70001 发送任意波

news2024/11/23 12:25:08

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 生成并发送自定义波形

下面的代码生成了一个起始频率为 5G,终止频率为 5.1G ,Chirp 时长为 20us 的 FMCW 波形,并且发送给 AWG

# 参数设置
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
waveformName = "ExtWaveformCh{:d}".format(trace)

xdata = np.array(t)
ydata = np.array(chirp_signal)

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")

MAX_MEM_SIZE = 262144 # this might not actually be true for the TEK device
MIN_SAMPLE_LEN = 2400
mem_size     = MAX_MEM_SIZE
session.write( "CLOCK:SRATE {:e}".format(sample_rate))
print("准备向通道 {:d}发送数据".format(trace))
xdata = xdata*xscale + delay
width = xdata[-1]
ydata = ydata*yscale

plt.figure()
plt.plot(xdata,ydata)
plt.show()

if(invert):
    idle_val = -idle_val
    ydata = -ydata

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_]

#send data
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))# + datastring

print(commandString)
len(data)

# Open socket, create waveform, send data, read back, start playing waveform and close socket
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))

下图为 Python 生成的 FMCW 波形
在这里插入图片描述
下图为发送到 AWG 后展示的波形,可以发现与设置的一致

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苹果iphone如何备份整个手机 苹果怎么查备份的照片

手机上的数据变得越来越重要,大家也越来越注重数据安全。如果手机设备丢失的话,不仅是设备的丢失,还是数据的丢失。因此,备份数据就显得很重要。那么,iphone如何备份整个手机,苹果怎么查备份的照片&#xf…

C++day4

2、 #include <iostream>using namespace std;class Person { private:int age;int *p; public://无参构造Person():p(new int(89)){age 18;}//有参构造Person (int age,int num){this->age age;this-> p new int(num);}//拷贝构造函数(深度拷贝)Person(Person …

NTP时钟服务器推荐-国内时间服务器顶尖设备

电子钟时间服务器在物联网应用中起到了关键的作用&#xff0c;它能够为各种智能设备提供准确的时间参考&#xff0c;确保设备之间的协同工作和数据的准确传输。无论是智能家居、智能工厂还是智慧城市&#xff0c;电子钟时间服务器都是不可或缺的一部分。 一、产品卖点 时间服…

启动spring boot项目时加载配置文件报错的问题

最近把电脑重置了一下&#xff0c;然后重新安装各种软件&#xff0c;从gitee拉去项目到本地运行时居然启动报错了 Failed to load property source from file:/D:/program/IdeaProjects/layui/target/classes/application.yml 这是加载配置文件的时候失败了&#xff0c;提示一堆…

Multiple HTTP implementations were found on the classpath错误的解决方法

当我们的项目中集成了多个AWS相关Jar包时,有可能就会遇到这个错误: 错误信息: There is an issue with the connector Code: InvalidInput.InvalidConnectorConfiguration Message: The connector configuration is invalid. Message: Multiple HTTP implementations were f…

自定义MVC架构【上】

目录 一、前言 1.什么是MVC架构 2.使用MVC架构的好处 3.MVC架构与三层架构的区别 4.MVC架构的思路 二、自定义MVC 1.最初版本 2.进阶版 3.反射优化版 4.反射增强版 一、前言 1.什么是MVC架构 MVC架构&#xff08;Model-View-Controller&#xff09;&#xff0c;即模…

【MSP432电机驱动设计—下篇】霍尔编码器测车轮运行距离与M/T综合公式法测速概念

开发板型号为MSP432P401r 今日得以继续我的MSP432电赛速通之路&#xff0c;本篇使用MSP432编程学习霍尔编码器M/T公式法测速概念&#xff0c;最终实现用外部中断方式测得小车行走路程&#xff0c;文章学习讲解原理、附上实例实践、附上关键代码、附上…

微信月活破10亿,安全性靠谁来支撑?

&#x1f449;腾小云导读 微信作为月活过10亿的国民级应用&#xff0c;其安全能力备受关注。值得注意的是&#xff0c;没有足够的特征数据&#xff0c;安全策略将是"无根之木&#xff0c;无源之水"。微信安全数据仓库作为安全业务的特征数据存储中心&#xff0c;每天…

【C/C++】解析 类成员属性

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

JVM类加载双亲委派-JVM(二)

上篇文章说了java类的加载&#xff0c;验证、准备、解析、初始化。类的初始化必须是类加载完才执行&#xff0c;所以类的构造方法初始化是在静态方法之后执行。 JVM类加载机制-JVM&#xff08;一&#xff09; 一、类加载和双亲委派机制 前面类加载主要通过类加载器实现&…

JavaWeb小记——登录、注册

目录 登录项目 步骤 1.首先写一个前台页面&#xff0c;一个form表单——login.jsp 2.后台获取前台输入的参数&#xff0c;并作校验 3.写一个JDBC工具类&#xff0c;用来连接数据库&#xff0c;本案例使用Druid连接池 4.写一个登录工具类&#xff0c;在数据库中查询数据&…

【云原生】k8s的pod基础(上)

1.pod的相关知识 1.1 pod的基础概念 pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是用绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管…

C++面试需求

一.auto 1.介绍&#xff1a; auto 是一个用于类型推导的关键字。它允许变量的类型在编译时根据其初始化值自动推断 例子&#xff1a; &#xff08;1&#xff09;自动类型推导变量 // C program to demonstrate working of auto // and type inference#include <bits/std…

shell正则入门

1.系统通配符 * #所有 . #当前目录 .. #当前目录的上一级目录 - #当前目录的上一次所在的目录 ~ #家目录 # #注释&#xff0c;超级管理员的命令行提示符 $ #引用变量&#xff0c;普通用户的命令行提示符 ? #匹配任意…

Spring Cloud Alibaba体系使用Nacos作为服务注册发现与配置中心

文章目录 Nacos介绍服务注册发现Nacos Discovery引入Nacos DiscoveryProvider和Consumer示例ProviderConsumer Nacos Discovery Starter其他配置选项 服务注册发现Nacos Config引入Nacos Config快速接入配置自动刷新profile粒度控制自定义namespace配置支持自定义Group支持自定…

UE5.2 LyraDemo源码阅读笔记(二)

UE5.2 LyraDemo源码阅读笔记&#xff08;二&#xff09; 创建了关卡中的体验玩家Actor和7个体验玩法入口之后。 接下来操作关卡中的玩家与玩法入口交互&#xff0c;进入玩法入口&#xff0c;选择进入B_LyraFrontEnd_Experience玩法入口&#xff0c;也就是第3个入口。触发以下请…

vue进阶-elementPlus

Element Plus官网 Element Plus 基于 Vue 3&#xff0c;面向设计师和开发者的组件库。减少开发者关注css&#xff0c;重心关注业务逻辑。 1. 入门 1.1 安装 npm install element-plus --save1.2 快速开始 1、main.js 引入并 use element-plus import { createApp } from …

C#,数值计算——灰色码(Gray Codes)的计算方法与源代码

一个 n位灰色码 序列&#xff0c;就是2的n次方 个 整数&#xff1b; 第一个数字为0&#xff1b; 相邻两个数字的二进制只有一位不一样&#xff1b; 第一个数字和最后一个数字的二进制也只有一位不一样。 using System; namespace Legalsoft.Truffer { /// <summary&…

ARM Exynos4412 硬件中断和GIC管理、PWM控制 6.28

day7 1.中断 硬件中断&#xff1a;直接让外部的硬件产生中断&#xff0c;CPU获取中断源并执行异常处理流程 1.需求&#xff1a;&#xff08;中断的原理一样&#xff0c;但外设是按键&#xff09;按键产生中断&#xff0c;并在中断处理中串口发送消息 2.原理图&#xff1a;U…

Mysql 5.6使用配置文件my.ini来设置长时间连接数据库

对于已经安装了mysql和未安装都是同样的步骤。在C:\Program Files (x86)\MySQL\MySQL Server 5.6下生成一个my.ini文件。然后删除或者修改my-default.ini的名字。 一、my.ini配置文件如下 [mysqld] basedirC:\Program Files (x86)\MySQL\MySQL Server 5.6 datadirC:\Program F…