@@ -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