Skip to content

Commit

Permalink
Some old changes?
Browse files Browse the repository at this point in the history
  • Loading branch information
hadmack committed Aug 5, 2011
1 parent 8ea2fed commit 0f9274e
Show file tree
Hide file tree
Showing 4 changed files with 155 additions and 11 deletions.
5 changes: 5 additions & 0 deletions README
Expand Up @@ -29,3 +29,8 @@ NOTES
On my DS1102E the WAVE:POINT:MODE options seem to have no effect. Maybe the firmware is out of date.

udev can add more symlinks with SYMLINK+="usbtmc-newname"

new udev rules
ACTION=="add", BUS=="usb", SYSFS{idVendor}=="164e", SYSFS{idProduct}=="0fa2", GROUP:="adm", SYMLINK+="usbtmc-bnc645"
ACTION=="add", BUS=="usb", SYSFS{idVendor}=="1ab1", SYSFS{idProduct}=="0588", GROUP:="adm", SYMLINK+="usbtmc-rigol"

65 changes: 55 additions & 10 deletions bnc645.py 100644 → 100755
Expand Up @@ -42,25 +42,70 @@ def setupExtTrigger(self):
self.write("TRIGger:SOURce EXTernal")
self.write("BURSt:MODE TRIGgered")
self.write("BURSt:STATe ON")

def sendWaveformData(self, data, duration, voltageMin, voltageMax):

def setFrequency(self, freq):
self.write("FREQuency %.3f"%freq)

def setAmplitude(self, volts):
self.write("VOLTage %.3f"%volts)

def setOffset(self, volts):
self.write("VOLTage:OFFSet %.3f"%volts)

def setVoltageLow(self,low):
self.write("VOLTage:LOW %.3f"%low)

def setVoltageHigh(self,high):
self.write("VOLTage:HIGH %.3f"%high)

def setVoltageRange(self, vMin, vMax):
self.setVoltageLow(vMin);
self.setVoltageHigh(vMax);

def sendWaveformData(self, data, duration, vMin, vMax):
'''Loads an array of voltage points into waveform generator.
duration in seconds is the length of the full data set
vMin, vMax limit the allowed range of data.
Any data out of range is clipped to these limits.'''
count = len(data)
buf = "DATA VOLATILE"
for x in data:
block = []
dMin = min(data)
dMax = max(data)
dRange = dMax - dMin
for v in data:
if v < vMin:
v = vMin
elif v > vMax:
v = vMax
x = 2.0*(v - dMin)/dRange - 1.0
b = int(8191*x)
#print b
block.append(b)

self.sendDataBlock(block)
self.setFrequency(1/duration)
self.setVoltageRange(dMin, dMax)

def sendDataBlock(self, block):
count = len(block)
buf = "DATA:DAC VOLATILE"
for x in block:
buf += ", " + str(x)
print buf
self.write(buf)


def main():
wg = WaveformGenerator("/dev/usbtmc0")
wg = WaveformGenerator("/dev/usbtmc-bnc645")
wg.outputOff()
wg.setupExtTrigger()
#wg.setupExtTrigger()

# Send data
data = numpy.array([1.0, -1.0, 0.5, -0.5, 0.25, -0.25])
wg.sendWaveformData(data, 10e-6,-1.0, 1.0)

#data = numpy.array([2.2,2.1,1.8, 1.6, 1.5, 1.4])
data = numpy.arange(-1.0, 3.0, 0.1)
wg.sendWaveformData(data, 100e-6, 0.0, 10.0)
#wg.setOffset(0.0)
#wg.setAmplitude(5.0)

wg.setFunction("USER")
wg.outputOn()

Expand Down
94 changes: 94 additions & 0 deletions bnc645.py~
@@ -0,0 +1,94 @@
#!/usr/bin/env python
#
# PyUSBtmc
#
# Berkely Nucleonics Model 645 Arbitrary Waveform Generator TMC interface
#
# Copyright (c) 2011 Mike Hadmack
# This code is distributed under the MIT license
from pyusbtmc import usbtmc
import numpy

false = 0; true = 1

class WaveformGenerator(usbtmc):
"""Class to control a BNC 645 Arbitrary Waveform Generator"""
def __init__(self, device):
usbtmc.__init__(self, device)
self.name = self.getName()
print "# Connected to: " + self.name

self.write("*RST;*CLS") # Reset instrument
self.set50OhmOutput(false) # Set output to high impedance
self.write("FORM:BORD SWAP") # Set for little endian byte order

def outputOn(self):
self.write("OUTPut ON");

def outputOff(self):
self.write("OUTPut OFF");

def set50OhmOutput(self,on):
if on : self.write("OUTPut:LOAD 50")
else : self.write("OUTPut:LOAD INF")

def setFunction(self, func):
if func == "SINE" : self.write("FUNCtion SINusoid")
elif func == "SQUARE" : self.write("FUNCtion SQUare")
elif func == "PULSE" : self.write("FUNCtion PULSe")
elif func == "USER" : self.write("FUNCtion USER"); self.write("FUNC:USER VOLATILE")

def setupExtTrigger(self):
self.write("TRIGger:SOURce EXTernal")
self.write("BURSt:MODE TRIGgered")
self.write("BURSt:STATe ON")

def setFrequency(self, freq):
self.write("FREQuency %.3f"%freq)

def setAmplitude(self, volts):
self.write("VOLTage %.3f"%volts)

def setOffset(self, volts):
self.write("VOLTage:OFFSet %.3f"%volts)

def setVoltageLow(self,low):
self.write("VOLTage:LOW %.3f"%low)

def setVoltageHigh(self,high):
self.write("VOLTage:HIGH %.3f"%high)

def setVoltageRange(self, vMin, vMax):
self.setVoltageLow(vMin);
self.setVoltageHigh(vMax);

def sendWaveformData(self, data, duration, voltageMin, voltageMax):
'''Loads a data set where values from -1.0 to 1.0 correspond to the voltage range given.
Duration is the time in seconds for the full data set'''
count = len(data)
buf = "DATA VOLATILE"
for x in data:
buf += ", " + str(x)
print buf
self.write(buf)
self.setFrequency(1/duration)
#self.setVoltageRange(voltageMin, voltageMax)
#self.setOffset(5.0)
#self.setAmplitude(3.0)

def main():
wg = WaveformGenerator("/dev/usbtmc-bnc645")
wg.outputOff()
#wg.setupExtTrigger()

# Send data
data = numpy.array([1.0, -1.0, 0.5, -0.5, 0.25, -0.25])
wg.sendWaveformData(data, 100e-6,-2.0, 3.0)
self.setOffset(0.0)
self.setAmplitude(1.0)

wg.setFunction("USER")
wg.outputOn()

if __name__ == "__main__":
main()
2 changes: 1 addition & 1 deletion pyusbtmc.py
Expand Up @@ -250,7 +250,7 @@ def grabData(self):
def main():
'''Module test code'''
print "# RigolScope Test #"
scope = RigolScope("/dev/usbtmc0")
scope = RigolScope("/dev/usbtmc-rigol")
scope.grabData()
scope.writeWaveformToFile("out.dat")
scope.close()
Expand Down

0 comments on commit 0f9274e

Please sign in to comment.