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:
parent
07b86664c0
commit
a82cc2c981
@ -420,22 +420,19 @@ class BatteryTester:
|
||||
def stop_test(self):
|
||||
"""Stop the current test"""
|
||||
self.test_running = False
|
||||
self.continuous_mode = False # Always stop continuous mode when stop is pressed
|
||||
self.continuous_mode = False
|
||||
self.measuring = False
|
||||
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'):
|
||||
self.write_cycle_summary()
|
||||
|
||||
self.start_button.config(state=tk.NORMAL)
|
||||
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)}")
|
||||
self.status_var.set(
|
||||
f"Test interrupted after cycle {self.cycle_count.get()} | "
|
||||
f"Results saved to: {os.path.basename(self.filename)}"
|
||||
)
|
||||
else:
|
||||
self.status_var.set("Test stopped | No data saved")
|
||||
self.status_var.set("Test interrupted - no data saved")
|
||||
|
||||
def center_window(self, window):
|
||||
"""Center a window on screen"""
|
||||
@ -457,59 +454,17 @@ class BatteryTester:
|
||||
self.cycle_count.set(self.cycle_count.get() + 1)
|
||||
self.root.after(0, lambda: self.cycle_label.config(text=str(self.cycle_count.get())))
|
||||
|
||||
# 1. Initial Discharge (to known state)
|
||||
self.test_phase.set("Initial Discharge")
|
||||
self.status_var.set(f"Discharging to {self.discharge_cutoff.get()}V @ {test_current:.3f}A")
|
||||
|
||||
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():
|
||||
# Check for Interrupt
|
||||
if not self.test_running:
|
||||
self.status_var.set("Test interrupted - finishing current cycle")
|
||||
break
|
||||
time.sleep(0.5)
|
||||
|
||||
if not self.test_running:
|
||||
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)
|
||||
# 1. Charge (constant current)
|
||||
self.test_phase.set("Charge")
|
||||
self.status_var.set(f"Charging to {self.charge_cutoff.get()}V @ {test_current:.3f}A")
|
||||
|
||||
self.measuring = True
|
||||
self.dev.channels['B'].mode = pysmu.Mode.HI_Z
|
||||
self.dev.channels['A'].mode = pysmu.Mode.SIMV
|
||||
self.dev.channels['A'].constant(test_current)
|
||||
self.charge_capacity.set(0.0)
|
||||
@ -546,7 +501,7 @@ class BatteryTester:
|
||||
if not self.test_running:
|
||||
return
|
||||
|
||||
# 4. Rest period after charge
|
||||
# 2. Rest period after charge
|
||||
self.test_phase.set("Resting (Post-Charge)")
|
||||
self.measuring = False
|
||||
self.dev.channels['A'].mode = pysmu.Mode.HI_Z
|
||||
@ -565,7 +520,7 @@ class BatteryTester:
|
||||
if not self.test_running:
|
||||
return
|
||||
|
||||
# 5. Final Discharge (capacity measurement)
|
||||
# 3. Final Discharge (capacity measurement)
|
||||
self.test_phase.set("Final Discharge")
|
||||
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)
|
||||
|
||||
# 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
|
||||
if self.charge_capacity.get() > 0:
|
||||
efficiency = (self.capacity_ah.get() / self.charge_capacity.get()) * 100
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user