Skip to content

Commit 437c4b4

Browse files
authored
Strict LDO dropout (#386)
Prior, the LDO dropout would propagate to the output voltage and assume that the LDO would track. This creates an assertion that the input voltage is greater than the dropout. Not super strict, only checks that the input lower bound is greater than the output lower bound + dropout. Rationale: voltage_out is a spec, and it's not being met. Users can change the dropout voltage in refinements to tighten bounds (eg, LDO operating at less than max current) or allow the regulator to go into tracking. Also refactors out actual_target_voltage since it's no longer needed.
1 parent 36fa559 commit 437c4b4

File tree

4 files changed

+18
-20
lines changed

4 files changed

+18
-20
lines changed

edg/abstract_parts/AbstractPowerConverters.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,25 +101,22 @@ def __init__(self) -> None:
101101
# these device model parameters must be provided by subtypes
102102
self.actual_dropout = self.Parameter(RangeExpr())
103103
self.actual_quiescent_current = self.Parameter(RangeExpr())
104-
self.actual_target_voltage = self.Parameter(RangeExpr())
105104

105+
self.gnd = self.Port(Ground(), [Common])
106106
self.pwr_in = self.Port(VoltageSink(
107-
voltage_limits=RangeExpr(),
107+
voltage_limits=RangeExpr(), # parameters set by subtype
108108
current_draw=RangeExpr()
109109
), [Power, Input])
110-
# dropout voltage is modeled to expand the tolerance range for actual output voltage
111110
self.pwr_out = self.Port(VoltageSource(
112-
voltage_out=( # bounds are lowest of the target voltage or dropout voltage
113-
self.actual_target_voltage.lower().min(self.pwr_in.link().voltage.lower() - self.actual_dropout.upper()),
114-
self.actual_target_voltage.upper().min(self.pwr_in.link().voltage.upper() - self.actual_dropout.lower()),
115-
),
111+
voltage_out=self.RangeExpr(), # parameters set by subtype
116112
current_limits=RangeExpr()
117113
), [Output])
118-
self.gnd = self.Port(Ground(), [Common])
119-
120114
self.assign(self.pwr_in.current_draw,
121115
self.pwr_out.link().current_drawn + self.actual_quiescent_current)
122116

117+
self.require(self.pwr_out.voltage_out.lower() + self.actual_dropout.upper() <= self.pwr_in.link().voltage.lower(),
118+
"excessive dropout")
119+
123120

124121
@abstract_block
125122
class SwitchingVoltageRegulator(VoltageRegulator):

edg/parts/LinearRegulators.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def generate(self):
3131
assert suitable_parts, "no regulator with compatible output"
3232
part_output_voltage, part_number, lcsc_part = suitable_parts[0]
3333

34-
self.assign(self.actual_target_voltage, part_output_voltage)
34+
self.assign(self.pwr_out.voltage_out, part_output_voltage)
3535
self.assign(self.lcsc_part, lcsc_part)
3636
self.assign(self.actual_basic_part, False)
3737
self.footprint(
@@ -89,7 +89,7 @@ def generate(self):
8989
assert suitable_parts, "no regulator with compatible output"
9090
part_output_voltage_nominal, part_number, jlc_number = suitable_parts[0]
9191

92-
self.assign(self.actual_target_voltage, part_output_voltage_nominal * Volt(tol=TOLERANCE))
92+
self.assign(self.pwr_out.voltage_out, part_output_voltage_nominal * Volt(tol=TOLERANCE))
9393
self.footprint(
9494
'U', 'Package_TO_SOT_SMD:SOT-223-3_TabPin2',
9595
{
@@ -159,7 +159,7 @@ def generate(self):
159159
assert suitable_parts, "no regulator with compatible output"
160160
part_output_voltage_nominal, part_number, jlc_number = suitable_parts[0]
161161

162-
self.assign(self.actual_target_voltage, part_output_voltage_nominal * Volt(tol=TOLERANCE))
162+
self.assign(self.pwr_out.voltage_out, part_output_voltage_nominal * Volt(tol=TOLERANCE))
163163
self.footprint(
164164
'U', 'Package_TO_SOT_SMD:SOT-23-5',
165165
{
@@ -204,7 +204,7 @@ def __init__(self, output_voltage: RangeLike):
204204
self.assign(self.pwr_out.current_limits, (0, 0.6) * Amp)
205205
self.assign(self.actual_quiescent_current, (50, 80) * uAmp)
206206
self.assign(self.actual_dropout, (0, 0.25) * Volt) # worst-case @ 100mA Iout
207-
self.assign(self.actual_target_voltage, (3.234, 3.366) * Volt)
207+
self.assign(self.pwr_out.voltage_out, (3.234, 3.366) * Volt)
208208
self.footprint(
209209
'U', 'Package_TO_SOT_SMD:SOT-89-3',
210210
{
@@ -273,7 +273,7 @@ def generate(self):
273273
assert suitable_parts, "no regulator with compatible output"
274274
part_output_voltage, part_number, part_dropout, part_max_current, lcsc_part, basic_part = suitable_parts[0]
275275

276-
self.assign(self.actual_target_voltage, part_output_voltage * Volt)
276+
self.assign(self.pwr_out.voltage_out, part_output_voltage * Volt)
277277
self.assign(self.actual_dropout, part_dropout * Volt)
278278
self.assign(self.pwr_out.current_limits, (0, part_max_current) * Amp)
279279
self.footprint(
@@ -337,7 +337,7 @@ def generate(self):
337337
assert suitable_parts, "no regulator with compatible output"
338338
part_output_voltage_nominal, part_number, part_dropout, lcsc_part = suitable_parts[0]
339339

340-
self.assign(self.actual_target_voltage, part_output_voltage_nominal * Volt(tol=TOLERANCE))
340+
self.assign(self.pwr_out.voltage_out, part_output_voltage_nominal * Volt(tol=TOLERANCE))
341341
self.assign(self.actual_dropout, part_dropout * Volt)
342342
self.footprint(
343343
'U', 'Package_TO_SOT_SMD:SOT-23-5',
@@ -408,7 +408,7 @@ def generate(self):
408408
assert suitable_parts, "no regulator with compatible output"
409409
part_output_voltage_nominal, part_number, jlc_number = suitable_parts[0]
410410

411-
self.assign(self.actual_target_voltage, part_output_voltage_nominal * Volt(tol=TOLERANCE))
411+
self.assign(self.pwr_out.voltage_out, part_output_voltage_nominal * Volt(tol=TOLERANCE))
412412
self.footprint(
413413
'U', 'Package_TO_SOT_SMD:SOT-23-5',
414414
{
@@ -496,7 +496,7 @@ def generate(self):
496496
assert suitable_parts, "no regulator with compatible output"
497497
part_output_voltage, part_number, footprint, jlc_number = suitable_parts[0]
498498

499-
self.assign(self.actual_target_voltage, part_output_voltage)
499+
self.assign(self.pwr_out.voltage_out, part_output_voltage)
500500
if footprint == 'Package_TO_SOT_SMD:SOT-23-5':
501501
pinning: Dict[str, CircuitPort] = {
502502
'1': self.pwr_in,
@@ -591,7 +591,7 @@ def generate(self):
591591
assert suitable_parts, "no regulator with compatible output"
592592
part_output_voltage, part_number, part_dropout, lcsc = suitable_parts[0]
593593

594-
self.assign(self.actual_target_voltage, part_output_voltage)
594+
self.assign(self.pwr_out.voltage_out, part_output_voltage)
595595
self.assign(self.actual_dropout, (0, part_dropout)*Volt)
596596

597597
self.footprint(
@@ -659,7 +659,7 @@ def generate(self):
659659
if part[0] in self.get(self.output_voltage)]
660660
assert suitable_parts, "no regulator with compatible output"
661661

662-
self.assign(self.actual_target_voltage, suitable_parts[0][0])
662+
self.assign(self.pwr_out.voltage_out, suitable_parts[0][0])
663663
self.assign(self.pwr_in.voltage_limits, suitable_parts[0][1])
664664
self.assign(self.pwr_out.current_limits, (0, 100)*mAmp)
665665
self.assign(self.actual_quiescent_current, suitable_parts[0][2])

edg/parts/VoltageReferences.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def generate(self):
3030
assert suitable_parts, "no regulator with compatible output"
3131
part_output_voltage, part_number, lcsc_part = suitable_parts[0]
3232

33-
self.assign(self.actual_target_voltage, part_output_voltage)
33+
self.assign(self.pwr_out.voltage_out, part_output_voltage)
3434
self.assign(self.lcsc_part, lcsc_part)
3535
self.assign(self.actual_basic_part, False)
3636
self.footprint(

examples/test_pcbbot.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ def refinements(self) -> Refinements:
208208
]),
209209

210210
(['prot_batt', 'diode', 'footprint_spec'], 'Diode_SMD:D_SMA'), # big diodes to dissipate more power
211+
(['reg_3v3', 'ic', 'actual_dropout'], Range(0.0, 0.3)) # tighter dropout from lower current draw
211212
],
212213
class_refinements=[
213214
(PassiveConnector, JstPhKVertical), # default connector series unless otherwise specified

0 commit comments

Comments
 (0)