Skip to content

Instantly share code, notes, and snippets.

@pklaus pklaus/balzerspkg020.py
Last active Apr 15, 2019

Embed
What would you like to do?
Balzers PKG 020 Vacuum Gauge Controller : Analog Out
#!/usr/bin/env python
tables = {
'ikr': [
[0.09, 5.00E-008],
[0.24, 1.00E-007],
[0.34, 1.50E-007],
[0.45, 2.00E-007],
[0.67, 3.00E-007],
[0.86, 4.00E-007],
[1.05, 5.00E-007],
[1.25, 6.00E-007],
[1.44, 7.00E-007],
[1.63, 8.00E-007],
[1.82, 9.00E-007],
[2.01, 1.00E-006],
[2.61, 1.50E-006],
[2.74, 2.00E-006],
[3.01, 3.00E-006],
[3.22, 4.00E-006],
[3.44, 5.00E-006],
[3.67, 6.00E-006],
[3.87, 7.00E-006],
[4.09, 8.00E-006],
[4.31, 9.00E-006],
[4.53, 1.00E-005],
[5.07, 1.50E-005],
[5.26, 2.00E-005],
[5.64, 3.00E-005],
[5.92, 4.00E-005],
[6.23, 5.00E-005],
[6.45, 6.00E-005],
[6.65, 7.00E-005],
[6.86, 8.00E-005],
[7.03, 9.00E-005],
[7.21, 1.00E-004],
[7.72, 1.50E-004],
[8.11, 2.00E-004],
[8.51, 3.00E-004],
[8.72, 4.00E-004],
[8.95, 5.00E-004],
[9.17, 6.00E-004],
[9.29, 8.00E-004],
[9.40, 1.00E-003],
[9.52, 1.50E-003],
[9.61, 2.00E-003],
[9.75, 3.00E-003],
[9.81, 4.00E-003],
[9.88, 5.00E-003]
],
'tpr2': [
[ 0.00, 1E-4],
[ 0.10, 2E-4],
[ 0.22, 1.5E-3],
[ 0.30, 2E-3],
[ 0.44, 3E-3],
[ 0.60, 4E-3],
[ 0.75, 5E-3],
[ 0.90, 6E-3],
[ 1.04, 7E-3],
[ 1.19, 8E-3],
[ 1.36, 9E-3],
[ 1.52, 1E-2],
[ 1.94, 1.5E-2],
[ 2.09, 2E-2],
[ 2.38, 3E-2],
[ 2.58, 4E-2],
[ 2.72, 5E-2],
[ 2.97, 6E-2],
[ 3.12, 7E-2],
[ 3.29, 8E-2],
[ 3.44, 9E-2],
[ 3.60, 1E-1],
[ 3.96, 1.5E-1],
[ 4.14, 2E-1],
[ 4.50, 3E-1],
[ 4.72, 4E-1],
[ 4.96, 5E-1],
[ 5.17, 6E-1],
[ 5.32, 7E-1],
[ 5.50, 8E-1],
[ 5.62, 9E-1],
[ 5.72, 1],
[ 5.96, 1.5],
[ 6.26, 2],
[ 6.58, 3],
[ 6.74, 4],
[ 6.92, 5],
[ 7.07, 6],
[ 7.21, 7],
[ 7.34, 8],
[ 7.51, 9],
[ 7.68, 10],
[ 8.25, 15],
[ 8.58, 20],
[ 8.99, 30],
[ 9.20, 40],
[ 9.37, 50],
[ 9.49, 60],
[ 9.56, 70],
[ 9.63, 80],
[ 9.70, 100],
[10.00, 1000]
]
}
#!/usr/bin/env python
def interpolate_numpy(value, value_table, exp=True):
"""
Convert from voltage to pressure using value_table.
Doing a vectorized conversion if value is an array of values.
Uses the interpolation function from numpy.
If exp = True the interpolation will be done on exponentiated
voltages (slightly more precise and correct).
"""
import numpy as np
#return np.interp(value, [row[0] for row in value_table], [row[1] for row in value_table])
value_table = np.array(value_table)
xp = value_table[:,0]
fp = value_table[:,1]
if exp:
value = np.exp(value)
xp = np.exp(xp)
return np.interp(value, xp, fp)
def interpolate_naive(value, value_table):
"""
Interpolate a function using a value_table.
In between the reference data points,
a simple linear interpolation is done.
"""
for x, y in value_table:
if value > x:
start_x, start_y = x, y
continue
else:
try:
dx = x - start_x
dy = y - start_y
return start_y + (value - start_x) * dy/dx
except:
return y
return value_table[-1][1]
# default interpolate function: The numpy version:
interpolate = interpolate_numpy
def main():
from balzerspkg020 import tables
import sys
while True:
line = sys.stdin.readline()
if not line: break
try:
num = float(line)
except:
sys.stderr.write("Couln't interpret this as a number: " + line)
continue
tpr2 = interpolate(num, tables['tpr2'])
ikr = interpolate(num, tables['ikr'])
print("As TPR2 value: %s" % tpr2)
print("As IKR value: %s" % ikr)
if __name__ == "__main__": main()
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
#!/usr/bin/env python
import numpy as np
from matplotlib import pyplot as plt
from balzerspkg020_helpers import interpolate, interpolate_naive, interpolate_numpy
from balzerspkg020 import tables
x = np.linspace(0,10, 1000000, endpoint=True)
#vect_ikr = np.vectorize(lambda x: interpolate_naive(x, tables['ikr']))
#vect_tpr2 = np.vectorize(lambda x: interpolate_naive(x, tables['tpr2']))
vect_ikr = lambda x: interpolate_numpy(x, tables['ikr'])
vect_tpr2 = lambda x: interpolate_numpy(x, tables['tpr2'])
y_ikr = vect_ikr(x)
y_tpr2 = vect_tpr2(x)
plt.plot(x, y_ikr, label='IKR')
plt.plot(x, y_tpr2, label='TPR2')
plt.yscale('log')
plt.title('Balzers PKG 020 Vacuum Gauge Controller : Analog Out')
plt.ylabel('Pressure [mbar]')
plt.xlabel('Analog Output Voltage [V]')
plt.legend(loc='upper left')
plt.grid()
plt.savefig('conversion_curve.pdf')
plt.show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.