Giter Site home page Giter Site logo

awg70002a_scripts's Introduction

AWG70002A_scripts

Dependencies

  • python3
  • numpy
  • scipy
  • pyltspice
  • python-vxi11
# install all dependencies

sudo pip3 install numpy scipy pyltspice python-vxi11

The clients on either Windows/Linux

The below scripts have been written and tested on a Linux machine which is in the same network as the AWG. The scripts have also been proven to work on a windows machine with the IDLE Python3 release for Windows.

For the scripts to properly communicate with the server they need to be called with with the "ip" argument. The given ip is the ip of the AWG:

./pulser.py       ip=192.168.0.123 <further arguments>
./send_csv.py     ip=192.168.0.123 <further arguments>
./send_ltspice.py ip=192.168.0.123 <further arguments>

If you don't want to type the ip argument all the time, you can export the ip as an environment variable once:

export AWG70002A_IP=192.168.0.123

You can also use the AWG70002 module directly in python3. The syntax is the same as the command line scripts. Or you can directly send numpy data vectors to the AWG (see below for more detailed example).

import AWG70002A as awg
# the python functions behind the individual utility .py scripts
awg.pulser(ip="192.168.0.123", trace=1, width="20n", delay="100n")
awg.send_csv(ip="192.168.0.123", trace=2, file="waveform.csv")
awg.send_ltspice(ip="192.168.0.123", trace=3, file="example.raw", signal="V(output)")

# directly send numpy vectors
awg.send_data(xdata, ydata, ip="192.168.0.123", trace=4)

you get the idea ...


LTspice, a Windows application, runs perfectly fine on Linux via WINE. (http://ltspice.analog.com/software/LTspiceXVII.exe)


pulser.py

  • generate square pulses with arbitrary "idle" and "on" levels (-0.25 to 0.25V)

example usage:

Photo

./pulser.py width=50e-9 trace=1 on_val=0.25 idle_val=0
./pulser.py width=30n trace=2 on_val=-150m idle_val=50m delay=10n

Photo

./pulser.py trace=2 width=10n leading_edge=2n trailing_edge=10n delay=5n on_val=250m
./pulser.py trace=3 width=10n leading_edge=2.5n trailing_edge=1n delay=15n on_val=-200m

Photo

./pulser.py trace=1 width=10n period=50n

example usage (python module):

#!/usr/bin/env python3

from AWG70002A import pulser

pulser(
    ip="192.168.0.208",
    trace=1,
    period="2u",
    width="20n",
    leading_edge="1n",
    trailing_edge="5n",
    on_val="150m",
    idle_val="-20m",
    delay="10n",
    invert=0
)

optional parameters/standard values:

sample_rate=8e9
period=0
invert=0
on_val=0.5
idle_val=0
trace=1
width=50n
delay=0n
ip=192.168.0.198
xscale=1
yscale=1
  • if leading and trailing edge are set to macroscopic values, the width is defined between the 50% points
  • time and voltage definitions can be given with numeric postfixes, i.e. n=1e-9 p=1e-12 m=1e-3, etc ...

send_csv.py

  • read in two column csv file and send it to the AWG
  • first column is time in seconds
  • second column is voltage in volts
  • standard delimiter is "," but can be adjusted (see below)
  • waveform is resampled/interpolated, so time steps can be arbitrary

example usage:

Photo

./send_csv.py file=waveform.csv trace=1 
./send_csv.py file=waveform.csv trace=2 delay=10n invert=1 yscale=0.5 xscale=0.3

Photo

./send_csv.py file=waveform.csv trace=1 period=80n
# get trace data from another column of CSV file
./send_csv.py file=waveform.csv trace=1 tcol=2 ycol=5

# program multiple channels from different columns in same CSV file, watch csv file for changes
./send_csv.py file=waveform.csv \
  tcol=0 \
  ch1col=1 \
  ch2col=2 \
  ch3col=3 \
  ch4col=4 \
  watch_changes=1

optional parameters/standard values:

file=<none>
delimiter=","
sample_rate=8e9
period=0
invert=0
idle_val=0
trace=1
delay=0
xscale=1
yscale=1
ip=192.168.0.198
watch_changes=0
tcol=0
ycol=1
ch1col=""
ch2col=""
ch3col=""
ch4col=""
  • If watch_changes is set to 1, then script will not terminate but continue watching the CSV file for changes. If a change is detected, the AWG will be re-programmed automatically.

send_ltspice.py

single channel example

  • read in LTSpice .raw file (binary simulation output file, containing all voltages and currents)
  • waveform is resampled/interpolated and then sent to AWG

example circuit - models a typical PMT signal

Photo

example circuit - simulated waveform

Photo

measured waveform from AWG

Photo

example usage:

./send_ltspice.py trace=1 file=ltspice_example/example.raw signal="V(output)"

optional parameters/standard values:

file=<none>
sample_rate=8e9
period=0
signal="V(output)"
invert=0
idle_val=0
trace=1
delay=0e-9
xscale=1
yscale=1
ip=192.168.0.198
watch_changes=0

multi channel example

example circuit - four different uses of the LTSpice voltage source

Photo

example circuit simulated waveforms

Photo

measured waveforms from AWG

Photo

example usage:

./send_ltspice.py file=ltspice_example/example_multichan.raw \
  signal1="V(out1)" \
  signal2="V(out2)" \
  signal3="V(out3)" \
  signal4="V(out4)" \
  watch_changes=1
  • If watch_changes is set to 1, then script will not terminate but continue watching the .raw file for changes. If a change is detected, the AWG will be re-programmed automatically.

Photo

send python/numpy data directly

Photo

Recorded waveform was generated with the following python code:

#!/usr/bin/env python3

import numpy as np
from matplotlib import pyplot as plt

import AWG20007A as awg
awg_ip = "192.168.0.208"

##################################################
##                 gauss pulse                  ##
##################################################


def gauss(x, **kwargs):
  mu = kwargs.get("mu",0)
  sigma = kwargs.get("sigma",1)
  ## default amplitude A generates bell curve with area = 1
  A = kwargs.get("A",1./(sigma*(2.*np.pi)**0.5)) 
  return A*np.exp(-(x-mu)**2/(2.*sigma**2))



period = 1e-6

x=np.arange(0,period,0.1e-9)

y=gauss(x,sigma=20e-9,mu=300e-9,A=200e-3)

plt.plot(x*1e9,y)
plt.xlabel("time (ns)")
plt.ylabel("voltage (V)")
plt.show()

awg.send_data(x,y,
              trace=1,
              ip=awg_ip,
              period=period)

Photo

Acknowledgements

Thanks to Nuno Brum for the beautiful LTSpice RawReader module! https://pypi.org/project/PyLTSpice/

awg70002a_scripts's People

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.