diff options
author | Eugeniy E. Mikhailov <evgmik@gmail.com> | 2024-07-22 15:38:20 -0400 |
---|---|---|
committer | Eugeniy E. Mikhailov <evgmik@gmail.com> | 2024-07-22 15:38:20 -0400 |
commit | 820cd4f2ab7480cab0e88c8aa9f3fce02e1dc581 (patch) | |
tree | 38c9b3f75e2a537d6b36638cdc2d6098060d5a17 /qolab | |
parent | 0634e9df8ba7be1818515b9930641206ed337f26 (diff) | |
download | qolab-820cd4f2ab7480cab0e88c8aa9f3fce02e1dc581.tar.gz qolab-820cd4f2ab7480cab0e88c8aa9f3fce02e1dc581.zip |
added draft of vertical autoscaler
Diffstat (limited to 'qolab')
-rw-r--r-- | qolab/hardware/scope/_basic.py | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/qolab/hardware/scope/_basic.py b/qolab/hardware/scope/_basic.py index fde7bfc..4e546ac 100644 --- a/qolab/hardware/scope/_basic.py +++ b/qolab/hardware/scope/_basic.py @@ -153,6 +153,55 @@ class Scope(BasicInstrument): self.setRun(old_run_status) # start running if it was old run state return allTraces + def chanAutoScale(self, chNum, margin=0.25, timeout=5): + """Auto scale channel to fit signal on screen. + + Tunes Volts per division and Channel offset to fit signal + on screen (vertically). + + Parameters + ---------- + chNum : int + Channel to auto scale + margin: float + How much extra space (margin) to have with respect to full screen. + Default is 0.25 (i.e. 25%), + i.e. 1 vertical division at top and bottom for 8 division scope. + """ + + starttime = time.time() + deadline = starttime+timeout + scaled_corectly = False + while (not scaled_corectly) and (time.time()<deadline): + tr = self.getTrace(chNum) + vPerDiv = self.getChanVoltsPerDiv(chNum) + offset = self.getChanVoltageOffset(chNum) + v_range = vPerDiv * self.vertDivOnScreen + v_max = v_range / 2 - offset + v_min = -v_range / 2 - offset + y = tr.y.values + tr_max = y.max() + tr_min = y.min() + screen_portion = (y.max - y.min) / vPerDiv / self.vertDivOnScreen + top_margin = (v_max - tr_max) / v_range + bottom_margin = (tr_min - v_min) / v_range + is_top_margin_good = (top_margin > margin / 2) and (top_margin < margin) + is_bottom_margin_good = (bottom_margin > margin / 2) and (bottom_margin < margin) + if (is_bottom_margin_good) and (is_top_margin_good): + scaled_corectly = True + break + offset = (tr_max+tr_min)/2 + vPerDiv = (tr_max -tr_min)/(self.vertDivOnScreen*(1-margin*1.5)) + + self.setChanVoltageOffset(chNum, offset) + self.setChanVoltsPerDiv(chNum, vPerDiv) + scaled_corectly = False + if (time.time()>deadline): + logger.warning( + f"Scope did not make proper channel {chNum} scaling within {timeout=} sec, try to increase it." + ) + + def plot(self, **kwargs): allTraces = self.getAllTraces(**kwargs) allTraces.plot() |