1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
import pyvisa
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import time
from qolab.hardware import BasicInstrument
from qolab.hardware.scope import SDS1104X
from qolab.hardware.rf_generator import AgilentE8257D
from qolab.feedback import PID
from qolab.data import TraceSetSameX, TraceXY, Trace
def adjustRF(pid, scope, rfgen, nsteps=1000, fname=None):
pid.reset()
errorTrace = Trace("error")
errorTrace.config['unit']='V'
timeTrace = Trace("time")
timeTrace.config['unit']='S'
errorLog = TraceXY("error")
errorLog.x = timeTrace
errorLog.y = errorTrace
freqTrace = Trace("frequency")
freqTrace.config['unit']='Hz'
freqLog = TraceXY("frequency")
freqLog.x = timeTrace
freqLog.y = freqTrace
feedbackTrace = Trace("feedback")
feedbackTrace.config['unit']='Hz'
feedbackLog = TraceXY("feedback")
feedbackLog.x = timeTrace
feedbackLog.y = feedbackTrace
log = TraceSetSameX("timelog")
log.addTrace(errorLog)
log.addTrace(freqLog)
log.addTrace(feedbackLog)
# while True:
for i in range(0,nsteps):
timenow = time.time()
ch1=scope.getTrace(1, decimate=False)
err = np.mean(ch1.y.values)
fdbck = pid.feedback(err)
freq0 = rfgen.getFreqFixed()
freq = freq0 + fdbck
rfgen.setFreqFixed(freq)
print(f'error = {err}, feedback = {fdbck}, request freq = {freq}')
log.addPointToTrace(timenow)
log.addPointToTrace(err, "error")
log.addPointToTrace(freq0, "frequency")
log.addPointToTrace(fdbck, "feedback")
if fname is not None:
log.save(fname, item_format='.15e')
plt.clf()
log.plot()
return log
if __name__ == '__main__':
apparatus = BasicInstrument()
apparatus.config['Device type'] = 'QOL VAMPIRE HighPower magnetometer'
apparatus.config['Device model'] = 'v0.1'
apparatus.config['FnamePrefix'] = 'locked_magnetometer'
apparatus.config['SavePath'] = './data'
print("testing")
rm = pyvisa.ResourceManager()
instr_scope=rm.open_resource('TCPIP::192.168.0.61::INSTR')
scope = SDS1104X(instr_scope)
instr_rfgen=rm.open_resource('TCPIP::192.168.0.114::INSTR')
rfgen = AgilentE8257D(instr_rfgen)
print('------ Header start -------------')
print(str.join('\n', scope.getHeader()))
print(str.join('\n', rfgen.getHeader()))
print('------ Header ends -------------')
ch1 = scope.getTrace(1)
traces = scope.getAllTraces()
freqZero = 6834687190
freqDeltaM2 = 6835387164
SweepSpan = 10000
rfgen.stopFrequencySweep()
rfgen.setFreqFixed(freqDeltaM2+100)
pid = PID(100,400,0, sign=-1)
# initial lock
log=adjustRF(pid, scope, rfgen, nsteps=100)
# long term lock
fname = apparatus.getNextDataFile()
print(fname)
log=adjustRF(pid, scope, rfgen, nsteps=10000, fname=fname)
log.save(fname, item_format='.15e')
|