diff options
author | Eugeniy E. Mikhailov <evgmik@gmail.com> | 2021-11-30 12:01:43 -0500 |
---|---|---|
committer | Eugeniy E. Mikhailov <evgmik@gmail.com> | 2021-11-30 12:01:43 -0500 |
commit | 61e423ca015eec75aa1113028852cad660f163bc (patch) | |
tree | 988b97e3902c62e680b8dc297a95b97ba0ccfd44 | |
parent | 8b49ddd1df224cd260259596b7e5c40eb3693560 (diff) | |
download | qolab-61e423ca015eec75aa1113028852cad660f163bc.tar.gz qolab-61e423ca015eec75aa1113028852cad660f163bc.zip |
added trace return
-rw-r--r-- | scope.py | 72 |
1 files changed, 47 insertions, 25 deletions
@@ -16,9 +16,15 @@ class Scope(scpi.SCPIinstr): """ def __init__(self, resource): super().__init__(resource) + +class Trace: + x = None + y = None class SDS1104x(Scope): """ Siglent SDS1104x scope """ + vertDivOnScreen = 10 + horizDivOnScreen = 14 def __init__(self, resource): super().__init__(resource) self.resource.read_termination='\n' @@ -62,20 +68,29 @@ class SDS1104x(Scope): prefix, numberString, unit = self.response2numStr(rstr, firstSeparator=' ', unit='Sa/s') return(int(float(numberString))) - def getRawWaveform(self, chNum, availableNpnts=None, maxRequiredPoints=None): + def calcSparcingAndNumPoints(self, availableNpnts=None, maxRequiredPoints=None): if availableNpnts == None: - availableNpnts = self.getAvailableNumberOfPoints(chNum) + # using channel 1 to get availableNpnts + availableNpnts = self.getAvailableNumberOfPoints(1) if maxRequiredPoints == None: maxRequiredPoints = self.maxRequiredPoints - + if availableNpnts <= maxRequiredPoints*2: Npnts = availableNpnts sparsing = 1 - cstr = f'WAVEFORM_SETUP NP,0,FP,0,SP,{sparsing}' - self.write(cstr) else: sparsing = int(np.floor(availableNpnts/maxRequiredPoints)) Npnts = int(np.floor(availableNpnts/sparsing)) + return(sparsing, Npnts, availableNpnts, maxRequiredPoints) + + def getRawWaveform(self, chNum, availableNpnts=None, maxRequiredPoints=None): + (sparsing, Npnts, availableNpnts, maxRequiredPoints) = self.calcSparcingAndNumPoints(availableNpnts, maxRequiredPoints) + if sparsing == 1 and Npnts == availableNpnts: + # we are getting all of it + cstr = f'WAVEFORM_SETUP NP,0,FP,0,SP,{sparsing}' + # technically when we know Npnts and sparsing + # we can use command from the follow up 'else' clause + else: cstr = f'WAVEFORM_SETUP SP,{sparsing},NP,{Npnts},FP,0' # Note: it is not enough to provide sparsing (SP), # number of points (NP) needed to be calculated properly too! @@ -94,11 +109,12 @@ class SDS1104x(Scope): # For example: # FP = 0 corresponds to the first data point. # FP = 1 corresponds to the second data point + self.write(cstr) qstr = f'C{chNum}:WAVEFORM? DAT2' - wfRaw=self.query_binary_values(qstr, datatype='b', header_fmt='ieee', container=np.array) + wfRaw=self.query_binary_values(qstr, datatype='b', header_fmt='ieee', container=np.array, chunk_size=(Npnts+100)) # expected full reply: 'C1:WF DAT2,#9000000140.........' - return(wfRaw, availableNpnts, sparsing) + return(wfRaw, availableNpnts, Npnts, sparsing) def getChanVoltsPerDiv(self, chNum): qstr = f'C{chNum}:VDIV?' @@ -130,24 +146,31 @@ class SDS1104x(Scope): def getWaveform(self, chNum, availableNpnts=None, maxRequiredPoints=None): - wfRaw, availableNpnts, sparsing = self.getRawWaveform(chNum, availableNpnts=availableNpnts, maxRequiredPoints=maxRequiredPoints) - vertDivOnScreen = 10 + wfRaw, availableNpnts, Npnts, sparsing = self.getRawWaveform(chNum, availableNpnts=availableNpnts, maxRequiredPoints=maxRequiredPoints) VoltageOffset = self.getChanOffset(chNum) VoltsPerDiv = self.getChanVoltsPerDiv(chNum) - return( wfRaw * VoltsPerDiv * vertDivOnScreen/250 -VoltageOffset, availableNpnts, sparsing) + return( wfRaw * VoltsPerDiv * self.vertDivOnScreen/250 -VoltageOffset, availableNpnts, sparsing) - def getTimeTrace(self, sparsing=1, Npnts=None): + def getTimeTrace(self, availableNpnts=None, maxRequiredPoints=None): + (sparsing, Npnts, availableNpnts, maxRequiredPoints) = self.calcSparcingAndNumPoints(availableNpnts, maxRequiredPoints) sampleRate = self.getSampleRate() timePerDiv = self.getTimePerDiv() trigDelay = self.getTrigDelay() - if Npnts == None: + if Npnts == None and sparsing == None: # using channel 1 as reference Npnts = self.getAvailableNumberOfPoints(1) - time = np.arange(Npnts) / sampleRate * sparsing; - horizDivOnScreen = 14 - time = time - timePerDiv * horizDivOnScreen/2 - trigDelay - return(time) + t = np.arange(Npnts) / sampleRate * sparsing; + t = t - timePerDiv * self.horizDivOnScreen/2 - trigDelay + return(t) + def getTrace(self, chNum, availableNpnts=None, maxRequiredPoints=None): + wfVoltage, availableNpnts, sparsing = self.getWaveform( chNum, availableNpnts=availableNpnts, maxRequiredPoints=maxRequiredPoints) + t = self.getTimeTrace(availableNpnts=availableNpnts, maxRequiredPoints=maxRequiredPoints) + tr = Trace() + tr.x = t + tr.y = wfVoltage + return( tr ) + if __name__ == '__main__': print("testing") @@ -155,15 +178,14 @@ if __name__ == '__main__': print(rm.list_resources()) instr=rm.open_resource('TCPIP::192.168.0.61::INSTR') scope = SDS1104x(instr) - print(scope.idn) - print(scope.mean(1)) - print(scope.getAvailableNumberOfPoints(1)) - print(scope.getSampleRate()) - print(scope.getTimePerDiv()) - print(scope.getChanVoltsPerDiv(1)) - print(scope.getChanOffset(1)) - wf = scope.getWaveform(4) - time = scope.getTimeTrace() + print(f'ID: {scope.idn}') + print(f'Ch1 mean: {scope.mean(1)}') + print(f'Ch1 available points: {scope.getAvailableNumberOfPoints(1)}') + print(f'Sample Rate: {scope.getSampleRate()}') + print(f'Time per Div: {scope.getTimePerDiv()}') + print(f'Ch1 Volts per Div: {scope.getChanVoltsPerDiv(1)}') + print(f'Ch1 Voltage Offset: {scope.getChanOffset(1)}') + ch1 = scope.getTrace(1) |