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):
|
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")
|
|
||||||
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():
|
|
||||||
break
|
|
||||||
time.sleep(0.5)
|
|
||||||
|
|
||||||
if not self.test_running:
|
if not self.test_running:
|
||||||
return
|
self.status_var.set("Test interrupted - finishing current cycle")
|
||||||
|
break
|
||||||
|
|
||||||
# 2. Rest period after initial discharge
|
# 1. Charge (constant current)
|
||||||
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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user