Skip to content

Commit 2a40f46

Browse files
committed
Update AbstractPowerConverters.py
1 parent 8333668 commit 2a40f46

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

edg/abstract_parts/AbstractPowerConverters.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ class Values(NamedTuple):
212212

213213
inductor_avg_current: Range
214214
ripple_scale: float # divide this by inductance to get the inductor ripple current
215+
min_ripple: float # fallback minimum ripple current for component sizing for light-load, may be 0
215216
output_capacitance_scale: float # multiply inductor ripple by this to get required output capacitance
216217

217218
inductor_peak_currents: Range # based on the worst case input spec, for unit testing
@@ -256,10 +257,12 @@ def _calculate_parameters(cls, input_voltage: Range, output_voltage: Range, freq
256257
inductance_scale = max(inductance_scale_candidates) / frequency.lower
257258

258259
inductance = Range.all()
260+
min_ripple = 0.0
259261
if sw_current_limits.upper > 0: # fallback for light-load
260262
# since limits are defined in terms of the switch current which should have ripple factored in already,
261263
# assume a safe-ish 0.25 ripple ratio was specified and unapply that before applying the limit ratio
262264
inductance = inductance.intersect(inductance_scale / (sw_current_limits.upper / 1.25 * limit_ripple_ratio))
265+
min_ripple = sw_current_limits.upper / 1.25 * limit_ripple_ratio.lower
263266
if ripple_ratio.upper < float('inf'):
264267
assert ripple_ratio.lower > 0, f"invalid non-inf ripple ratio {ripple_ratio}"
265268

@@ -280,8 +283,8 @@ def _calculate_parameters(cls, input_voltage: Range, output_voltage: Range, freq
280283

281284
return cls.Values(dutycycle=dutycycle, inductance=inductance,
282285
input_capacitance=input_capacitance, output_capacitance=output_capacitance,
283-
inductor_avg_current=output_current,
284-
ripple_scale=inductance_scale, output_capacitance_scale=output_capacitance_scale,
286+
inductor_avg_current=output_current, ripple_scale=inductance_scale, min_ripple=min_ripple,
287+
output_capacitance_scale=output_capacitance_scale,
285288
inductor_peak_currents=inductor_peak_currents,
286289
effective_dutycycle=effective_dutycycle)
287290

@@ -377,7 +380,7 @@ def generate(self) -> None:
377380
current=self.output_current, # min-bound only, the real filter happens in the filter_fn
378381
frequency=self.frequency,
379382
experimental_filter_fn=ExperimentalUserFnPartsTable.serialize_fn(
380-
self._buck_inductor_filter, values.inductor_avg_current, values.ripple_scale)
383+
self._buck_inductor_filter, values.inductor_avg_current.upper, values.ripple_scale)
381384
))
382385
self.assign(self.actual_inductor_current_ripple, values.ripple_scale / self.inductor.actual_inductance)
383386

@@ -447,6 +450,7 @@ class Values(NamedTuple):
447450

448451
inductor_avg_current: Range
449452
ripple_scale: float # divide this by inductance to get the inductor ripple current
453+
min_ripple: float # fallback minimum ripple current for component sizing for light-load, may be 0
450454

451455
inductor_peak_currents: Range # based on the worst case input spec, for unit testing
452456
effective_dutycycle: Range
@@ -476,10 +480,12 @@ def _calculate_parameters(cls, input_voltage: Range, output_voltage: Range, freq
476480
inductance_scale = max(inductance_scale_candidates) / frequency.lower
477481

478482
inductance = Range.all()
483+
min_ripple = 0.0
479484
if sw_current_limits.upper > 0: # fallback for light-load
480485
# since limits are defined in terms of the switch current which should have ripple factored in already,
481486
# assume a safe-ish 0.25 ripple ratio was specified and unapply that before applying the limit ratio
482487
inductance = inductance.intersect(inductance_scale / (sw_current_limits.upper / 1.25 * limit_ripple_ratio))
488+
min_ripple = sw_current_limits.upper / 1.25 * limit_ripple_ratio.lower
483489
if ripple_ratio.upper < float('inf'):
484490
assert ripple_ratio.lower > 0, f"invalid non-inf ripple ratio {ripple_ratio}"
485491
inductance = inductance.intersect(inductance_scale / (inductor_avg_current.upper * ripple_ratio))
@@ -503,7 +509,7 @@ def _calculate_parameters(cls, input_voltage: Range, output_voltage: Range, freq
503509

504510
return cls.Values(dutycycle=dutycycle, inductance=inductance,
505511
input_capacitance=input_capacitance, output_capacitance=output_capacitance,
506-
ripple_scale=inductance_scale, inductor_avg_current=inductor_avg_current,
512+
inductor_avg_current=inductor_avg_current, ripple_scale=inductance_scale, min_ripple=min_ripple,
507513
inductor_peak_currents=inductor_peak_currents,
508514
effective_dutycycle=effective_dutycycle)
509515

@@ -693,22 +699,22 @@ def generate(self) -> None:
693699
self.assign(self.actual_boost_dutycycle, boost_values.effective_dutycycle)
694700

695701
combined_ripple_scale = max(buck_values.ripple_scale, boost_values.ripple_scale)
696-
combined_inductor_avg_current = max(self.get(self.output_current).upper, boost_values.inductor_avg_current.upper)
702+
combined_inductor_avg_current = boost_values.inductor_avg_current.hull(boost_values.inductor_avg_current)
697703

698704
self.inductor = self.Block(Inductor(
699705
inductance=buck_values.inductance.intersect(boost_values.inductance) * Henry,
700706
current=buck_values.inductor_peak_currents.hull(boost_values.inductor_peak_currents),
701707
frequency=self.frequency,
702708
experimental_filter_fn=ExperimentalUserFnPartsTable.serialize_fn(
703-
BuckConverterPowerPath._buck_inductor_filter, combined_inductor_avg_current, combined_ripple_scale)
709+
BuckConverterPowerPath._buck_inductor_filter, combined_inductor_avg_current.upper, combined_ripple_scale)
704710
))
705711
self.connect(self.switch_in, self.inductor.a)
706712
self.connect(self.switch_out, self.inductor.b)
707713
self.assign(self.actual_inductor_current_ripple, combined_ripple_scale / self.inductor.actual_inductance)
708714
self.assign(self.actual_avg_current_rating,
709715
BuckConverterPowerPath._ilim_expr(self.inductor.actual_current_rating, self.sw_current_limits,
710716
self.actual_inductor_current_ripple))
711-
self.assign(self.actual_inductor_current, combined_inductor_avg_current + self.actual_inductor_current_ripple.upper())
717+
self.assign(self.actual_inductor_current, combined_inductor_avg_current + self.actual_inductor_current_ripple / 2)
712718

713719
self.in_cap = self.Block(DecouplingCapacitor(
714720
capacitance=buck_values.input_capacitance.intersect(boost_values.input_capacitance) * Farad,

0 commit comments

Comments
 (0)