2026-07-10 10:38:57 +02:00

125 lines
2.7 KiB
Python

import glob
lookup_table_energy = {}
def process_charge(data, r_eq, v_source):
t_prev = None
v_prev = None
e_pj = 0.0
last_t = int(data[-1].split(';')[0])
v_key = int(v_source*10)
if v_key not in lookup_table_energy:
lookup_table_energy[v_key] = {}
lookup_table_energy[v_key][r_eq] = {}
# t; v; ; t; ua
for line in data[1:]:
if 'E' in line:
continue
line = line.replace(',', '.').replace("\n", '').split(";")
# Ignore missing measures
if line[3] == '' or line[4] == '':
continue
t = int(line[0])
v = float(line[1])
i_ua = float(line[4])
if t_prev is None:
t_prev = t
if v_prev is not None:
if v < v_prev:
break
# E
#e_pj += (t-t_prev) * (v_source-v) * i_ua * 1000000.0
e_pj += (t-t_prev) * v * i_ua * 1000000.0
# Q
#e_pj += (t-t_prev) * i_ua * 1000000.0
t_prev = t
v_prev = v
lookup_table_energy[v_key][r_eq][int(e_pj)] = v
print(f"Charge @ {v_source}V {r_eq}Ohm - E={round(e_pj/1000000000.0, 4)}mJ; T={t_prev}s ({last_t}s)")
def process_discharge(data, r_eq):
e = 0.0
t_prev = None
v_prev = None
lookup_table_energy[r_eq] = {}
last_t = int(data[-1].split(';')[0])
# t; v
for line in data[1:]:
if 'E' in line:
continue
line = line.replace(',', '.').replace("\n", '').split(";")
t = int(line[0])
v = float(line[1])
if t_prev is None:
t_prev = t
#if v_prev is not None:
# if v > v_prev:
# break
e += (t-t_prev) * (v * v / r_eq)
t_prev = t
v_prev = v
lookup_table_energy[r_eq][int(e*1000000000000.0)] = v
print(f"Discharge @ {r_eq}Ohm - E={e*1000.0}mJ; T={t_prev}s ({last_t}s)")
for f in glob.glob("*.csv"):
name = f.split("_")
name[-1] = name[-1].split(".csv")[0]
mode = name[0]
r = int(name[1].replace('ohm', ''))
with open(f) as fp:
data = fp.readlines()
if mode == 'charge':
v = float(name[2].replace('v', ''))
process_charge(data, r, v)
else:
continue
process_discharge(data, r)
processed = []
print("V_source=0.6V")
for e_pj, v in reversed(sorted(lookup_table_energy[6][580].items())):
v = round(v, 1)
if v not in processed:
processed.append(v)
print(f"{v}V -> {round(e_pj/1000000000.0, 2)}mJ")
print()
processed = []
print("V_source=0.8V")
for e_pj, v in reversed(sorted(lookup_table_energy[8][580].items())):
v = round(v, 1)
if v not in processed:
processed.append(v)
print(f"{v}V -> {round(e_pj/1000000000.0, 2)}mJ")