From 12f09e9b094036c4d1fef5e3d57df6e888e54f16 Mon Sep 17 00:00:00 2001 From: saad-aids Date: Sat, 28 Mar 2026 13:19:28 +0530 Subject: [PATCH 1/2] fix: clarify and document CTMU temperature calibration logic - Extract magic numbers into named module-level constants - Add _CTMU_CURRENT_RANGE_55UA constant for 0b11110 value - Add _TEMP_CALIB dict with documented calibration values - Expand temperature property docstring with full explanation Fixes #272 --- pslab/sciencelab.py | 67 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 11 deletions(-) diff --git a/pslab/sciencelab.py b/pslab/sciencelab.py index 1cbc81e..6847db7 100644 --- a/pslab/sciencelab.py +++ b/pslab/sciencelab.py @@ -19,6 +19,43 @@ from pslab.instrument.waveform_generator import PWMGenerator, WaveformGenerator +class ScienceLab: + """Aggregate interface for the PSLab's instruments. + + Attributes + ---------- + logic_analyzer : pslab.LogicAnalyzer + oscilloscope : pslab.Oscilloscope + waveform_generator : pslab.WaveformGenerator + pwm_generator : pslab.PWMGenerator + multimeter : pslab.Multimeter + power_supply : pslab.PowerSupply + i2c : pslab.I2CMaster + nrf : pslab.peripherals.NRF24L01 + """ + + def __init__(self, device: ConnectionHandler | None = None): + self.device = device if device is not None else autoconnect() + self.firmware = self.device.get_firmware_version() + self.logic_analyzer = LogicAnalyzer(device=self.device) + self.oscilloscope = Oscilloscope(device=self.device) + self.waveform_generator = WaveformGenerator(device=self.device) + self.pwm_generator = PWMGenerator(device=self.device) + self.multimeter = Multimeter(device=self.device) + self.power_supply = PowerSupply(device=self.device) + + # CTMU current range index for temperature measurement (0b11110 = 55 µA) +_CTMU_CURRENT_RANGE_55UA = 0b11110 + +# Temperature calibration constants per current source setting. +# Format: (offset_mV, slope_mV_per_degree_celsius) +_TEMP_CALIB = { + 1: (646.0, 1.92), # current source 1: offset=646mV, slope=1.92mV/°C + 2: (701.5, 1.74), # current source 2: offset=701.5mV, slope=1.74mV/°C + 3: (760.0, 1.56), # current source 3: offset=760mV, slope=1.56mV/°C +} + + class ScienceLab: """Aggregate interface for the PSLab's instruments. @@ -46,18 +83,26 @@ def __init__(self, device: ConnectionHandler | None = None): @property def temperature(self): - """float: Temperature of the MCU in degrees Celsius.""" - # TODO: Get rid of magic numbers. - cs = 3 - V = self._get_ctmu_voltage(0b11110, cs, 0) - - if cs == 1: - return (646 - V * 1000) / 1.92 # current source = 1 - elif cs == 2: - return (701.5 - V * 1000) / 1.74 # current source = 2 - elif cs == 3: - return (760 - V * 1000) / 1.56 # current source = 3 + """float: Temperature of the MCU in degrees Celsius. + + Uses the CTMU (Charge Time Measurement Unit) with a 55 µA current + source (current_range index 0b11110) on channel 3 to measure the + internal temperature sensor voltage. + The voltage is converted to Celsius using calibration constants + defined in _TEMP_CALIB for each current source setting. + + Returns + ------- + float + Temperature in degrees Celsius. + """ + cs = 3 # current source index used for temperature measurement + tgen = 0 # disable time delay mode for direct voltage measurement + V = self._get_ctmu_voltage(_CTMU_CURRENT_RANGE_55UA, cs, tgen) + offset, slope = _TEMP_CALIB[cs] + return (offset - V * 1000) / slope + def _get_ctmu_voltage(self, channel: int, current_range: int, tgen: bool = True): """Control the Charge Time Measurement Unit (CTMU). From 7e3c7518a5c1d2c54ac6757708133eb21bc0f4e6 Mon Sep 17 00:00:00 2001 From: saad-aids Date: Sat, 28 Mar 2026 13:42:19 +0530 Subject: [PATCH 2/2] fix: remove duplicate ScienceLab class definition --- pslab/sciencelab.py | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/pslab/sciencelab.py b/pslab/sciencelab.py index 6847db7..0c87c16 100644 --- a/pslab/sciencelab.py +++ b/pslab/sciencelab.py @@ -19,31 +19,6 @@ from pslab.instrument.waveform_generator import PWMGenerator, WaveformGenerator -class ScienceLab: - """Aggregate interface for the PSLab's instruments. - - Attributes - ---------- - logic_analyzer : pslab.LogicAnalyzer - oscilloscope : pslab.Oscilloscope - waveform_generator : pslab.WaveformGenerator - pwm_generator : pslab.PWMGenerator - multimeter : pslab.Multimeter - power_supply : pslab.PowerSupply - i2c : pslab.I2CMaster - nrf : pslab.peripherals.NRF24L01 - """ - - def __init__(self, device: ConnectionHandler | None = None): - self.device = device if device is not None else autoconnect() - self.firmware = self.device.get_firmware_version() - self.logic_analyzer = LogicAnalyzer(device=self.device) - self.oscilloscope = Oscilloscope(device=self.device) - self.waveform_generator = WaveformGenerator(device=self.device) - self.pwm_generator = PWMGenerator(device=self.device) - self.multimeter = Multimeter(device=self.device) - self.power_supply = PowerSupply(device=self.device) - # CTMU current range index for temperature measurement (0b11110 = 55 µA) _CTMU_CURRENT_RANGE_55UA = 0b11110