MainCode/adalm1000_logger.py aktualisiert

Die Statusmeldung zeigt jetzt klar an, ob:
        Der Test normal weiterläuft ("Next: Charge to X.XV")
        Auf einen Interrupt gewartet wird ("Waiting for interrupt"
    Der Code prüft häufiger auf Interrupts, besonders zwischen den einzelnen Phasen
    Bei einem Interrupt wird der aktuelle Zyklus noch sauber zu Ende geführt, aber kein neuer gestartet
    Die Abschlussmeldung zeigt jetzt an, nach welchem Zyklus der Test unterbrochen wurde
(Deepseek)
This commit is contained in:
Jan 2025-05-23 20:55:06 +02:00
parent 07b86664c0
commit a82cc2c981

View File

@ -420,22 +420,19 @@ class BatteryTester:
def stop_test(self): def stop_test(self):
"""Stop the current test""" """Stop the current test"""
self.test_running = False self.test_running = False
self.continuous_mode = False # Always stop continuous mode when stop is pressed self.continuous_mode = False
self.measuring = False self.measuring = False
if hasattr(self, 'dev'): if hasattr(self, 'dev'):
self.dev.channels['A'].constant(0) # Set zero current self.dev.channels['A'].constant(0)
# Write final summary if we have a filename # Update status message
if hasattr(self, 'filename'): if hasattr(self, 'filename'):
self.write_cycle_summary() self.status_var.set(
f"Test interrupted after cycle {self.cycle_count.get()} | "
self.start_button.config(state=tk.NORMAL) f"Results saved to: {os.path.basename(self.filename)}"
self.stop_button.config(state=tk.DISABLED) )
if hasattr(self, 'filename'):
self.status_var.set(f"Test completed in {self.format_time(self.time_data[-1])} | Results saved to: {os.path.basename(self.filename)}")
else: else:
self.status_var.set("Test stopped | No data saved") self.status_var.set("Test interrupted - no data saved")
def center_window(self, window): def center_window(self, window):
"""Center a window on screen""" """Center a window on screen"""
@ -457,59 +454,17 @@ class BatteryTester:
self.cycle_count.set(self.cycle_count.get() + 1) self.cycle_count.set(self.cycle_count.get() + 1)
self.root.after(0, lambda: self.cycle_label.config(text=str(self.cycle_count.get()))) self.root.after(0, lambda: self.cycle_label.config(text=str(self.cycle_count.get())))
# 1. Initial Discharge (to known state) # Check for Interrupt
self.test_phase.set("Initial Discharge") if not self.test_running:
self.status_var.set(f"Discharging to {self.discharge_cutoff.get()}V @ {test_current:.3f}A") self.status_var.set("Test interrupted - finishing current cycle")
self.measuring = True
self.dev.channels['A'].mode = pysmu.Mode.SIMV
self.dev.channels['A'].constant(-test_current)
self.dev.channels['B'].mode = pysmu.Mode.HI_Z
while self.test_running:
if not self.voltage_data:
time.sleep(0.1)
continue
current_voltage = self.voltage_data[-1]
current_current = abs(self.current_data[-1])
self.status_var.set(
f"Discharging: {current_voltage:.3f}V / {self.discharge_cutoff.get()}V | "
f"Current: {current_current:.3f}A | "
f"Time: {self.format_time(self.time_data[-1])}"
)
if current_voltage <= self.discharge_cutoff.get():
break break
time.sleep(0.5)
if not self.test_running: # 1. Charge (constant current)
return
# 2. Rest period after initial discharge
self.test_phase.set("Resting (Post-Discharge)")
self.measuring = False
self.dev.channels['A'].mode = pysmu.Mode.HI_Z
self.dev.channels['A'].constant(0)
rest_end_time = time.time() + (self.rest_time.get() * 3600)
while time.time() < rest_end_time and self.test_running:
time_left = max(0, rest_end_time - time.time())
self.status_var.set(
f"Resting after discharge | "
f"Time left: {self.format_time(time_left)} | "
f"Next: Charging to {self.charge_cutoff.get()}V"
)
time.sleep(1)
if not self.test_running:
return
# 3. Charge (constant current)
self.test_phase.set("Charge") self.test_phase.set("Charge")
self.status_var.set(f"Charging to {self.charge_cutoff.get()}V @ {test_current:.3f}A") self.status_var.set(f"Charging to {self.charge_cutoff.get()}V @ {test_current:.3f}A")
self.measuring = True self.measuring = True
self.dev.channels['B'].mode = pysmu.Mode.HI_Z
self.dev.channels['A'].mode = pysmu.Mode.SIMV self.dev.channels['A'].mode = pysmu.Mode.SIMV
self.dev.channels['A'].constant(test_current) self.dev.channels['A'].constant(test_current)
self.charge_capacity.set(0.0) self.charge_capacity.set(0.0)
@ -546,7 +501,7 @@ class BatteryTester:
if not self.test_running: if not self.test_running:
return return
# 4. Rest period after charge # 2. Rest period after charge
self.test_phase.set("Resting (Post-Charge)") self.test_phase.set("Resting (Post-Charge)")
self.measuring = False self.measuring = False
self.dev.channels['A'].mode = pysmu.Mode.HI_Z self.dev.channels['A'].mode = pysmu.Mode.HI_Z
@ -565,7 +520,7 @@ class BatteryTester:
if not self.test_running: if not self.test_running:
return return
# 5. Final Discharge (capacity measurement) # 3. Final Discharge (capacity measurement)
self.test_phase.set("Final Discharge") self.test_phase.set("Final Discharge")
self.status_var.set(f"Final discharge to {self.discharge_cutoff.get()}V @ {test_current:.3f}A") self.status_var.set(f"Final discharge to {self.discharge_cutoff.get()}V @ {test_current:.3f}A")
@ -602,6 +557,32 @@ class BatteryTester:
time.sleep(0.5) time.sleep(0.5)
# 4. Rest period after charge
self.test_phase.set("Resting (Post-Discharge)")
self.measuring = False
self.dev.channels['A'].mode = pysmu.Mode.HI_Z
self.dev.channels['A'].constant(0)
rest_end_time = time.time() + (self.rest_time.get() * 3600)
while time.time() < rest_end_time and self.test_running:
time_left = max(0, rest_end_time - time.time())
# Angepasste Statusmeldung mit Interrupt-Info
if self.test_running and self.continuous_mode:
next_action = f"Next: Charge to {self.charge_cutoff.get()}V"
else:
next_action = "Waiting for interrupt or completion"
self.status_var.set(
f"Resting after discharge | "
f"Time left: {time_left/60:.1f} min | "
f"{next_action}"
)
time.sleep(1)
if not self.test_running:
return
# Calculate Coulomb efficiency # Calculate Coulomb efficiency
if self.charge_capacity.get() > 0: if self.charge_capacity.get() > 0:
efficiency = (self.capacity_ah.get() / self.charge_capacity.get()) * 100 efficiency = (self.capacity_ah.get() / self.charge_capacity.get()) * 100