69 lines
2.5 KiB
Python
69 lines
2.5 KiB
Python
def charge_phase(self):
|
|
"""Handle the battery charging phase"""
|
|
self.update_phase.emit("Charge")
|
|
self.update_status.emit(f"Charging to {self.charge_cutoff}V @ {self.test_current:.3f}A")
|
|
|
|
try:
|
|
# Configure both channels properly
|
|
self.device.channels['B'].mode = pysmu.Mode.HI_Z
|
|
self.device.channels['A'].mode = pysmu.Mode.SIMV
|
|
self.device.channels['A'].sink = False # Ensure sourcing current
|
|
self.device.channels['A'].constant(self.test_current)
|
|
|
|
# Small delay to allow current to stabilize
|
|
time.sleep(0.1)
|
|
|
|
while self._running:
|
|
voltage, current = self.get_latest_measurement()
|
|
if voltage is None:
|
|
continue
|
|
|
|
# Update parent's data for logging/display
|
|
with self.parent.plot_mutex:
|
|
if len(self.parent.voltage_data) > 0:
|
|
self.parent.voltage_data[-1] = voltage
|
|
self.parent.current_data[-1] = current
|
|
|
|
if voltage >= self.charge_cutoff:
|
|
break
|
|
|
|
time.sleep(0.1)
|
|
|
|
finally:
|
|
self.device.channels['A'].mode = pysmu.Mode.HI_Z
|
|
self.device.channels['A'].constant(0)
|
|
|
|
def discharge_phase(self):
|
|
"""Handle the battery discharging phase"""
|
|
self.update_phase.emit("Discharge")
|
|
self.update_status.emit(f"Discharging to {self.discharge_cutoff}V @ {self.test_current:.3f}A")
|
|
|
|
try:
|
|
# Configure both channels properly
|
|
self.device.channels['B'].mode = pysmu.Mode.HI_Z
|
|
self.device.channels['A'].mode = pysmu.Mode.SIMV
|
|
self.device.channels['A'].sink = True # Ensure sinking current
|
|
self.device.channels['A'].constant(-self.test_current)
|
|
|
|
# Small delay to allow current to stabilize
|
|
time.sleep(0.1)
|
|
|
|
while self._running:
|
|
voltage, current = self.get_latest_measurement()
|
|
if voltage is None:
|
|
continue
|
|
|
|
# Update parent's data for logging/display
|
|
with self.parent.plot_mutex:
|
|
if len(self.parent.voltage_data) > 0:
|
|
self.parent.voltage_data[-1] = voltage
|
|
self.parent.current_data[-1] = current
|
|
|
|
if voltage <= self.discharge_cutoff:
|
|
break
|
|
|
|
time.sleep(0.1)
|
|
|
|
finally:
|
|
self.device.channels['A'].mode = pysmu.Mode.HI_Z
|
|
self.device.channels['A'].constant(0) |