Skip to content

Commit c4a9415

Browse files
committed
unit tests
1 parent eaadc3a commit c4a9415

File tree

2 files changed

+71
-5
lines changed

2 files changed

+71
-5
lines changed

edg/abstract_parts/AbstractPowerConverters.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ def calculate_parameters(cls, input_voltage: Range, output_voltage: Range, frequ
408408
# calculate minimum inductance based on worst case values (operating range corners producing maximum inductance)
409409
# worst-case input/output voltages and frequency is used to avoid double-counting tolerances as ranges
410410
inductance = (input_voltage.lower * (output_voltage.upper - input_voltage.lower) /
411-
(inductor_current_ripple * frequency.lower * output_voltage.lower))
411+
(inductor_current_ripple * frequency.lower * output_voltage.upper))
412412

413413
# Capacitor equation Q = CV => i = C dv/dt => for constant current, i * t = C dV => dV = i * t / C
414414
# C = i * t / dV => C = i / (f * dV)

edg/abstract_parts/test_switching_converters.py

Lines changed: 70 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,83 @@
66

77
class BuckConverterCalculationTest(unittest.TestCase):
88
def test_buck_converter(self):
9-
values = BuckConverterPowerPath.calculate_parameters(
9+
values_ref = BuckConverterPowerPath.calculate_parameters(
1010
Range.exact(5), Range.exact(2.5), Range.exact(100e3), Range.exact(1),
1111
Range.exact(0.1), 0.01, 0.001,
1212
efficiency=Range.exact(1)
1313
)
14-
self.assertEqual(values.dutycycle, Range.exact(0.5))
14+
self.assertEqual(values_ref.dutycycle, Range.exact(0.5))
15+
# validated against https://www.omnicalculator.com/physics/buck-converter
16+
self.assertEqual(values_ref.inductance, Range.exact(125e-6))
17+
18+
# test that component values are calculated for worst-case conversion
19+
values = BuckConverterPowerPath.calculate_parameters(
20+
Range(4, 5), Range(2.5, 4), Range.exact(100e3), Range.exact(1),
21+
Range.exact(0.1), 0.01, 0.001,
22+
efficiency=Range.exact(1)
23+
)
24+
self.assertEqual(values_ref.inductance, values.inductance)
25+
self.assertEqual(values_ref.input_capacitance, values.input_capacitance)
26+
self.assertEqual(values_ref.output_capacitance, values.output_capacitance)
27+
28+
def test_buck_converter_example(self):
29+
# using the example from https://passive-components.eu/buck-converter-design-and-calculation/
30+
values = BuckConverterPowerPath.calculate_parameters(
31+
Range.exact(12 + 0.4), Range.exact(3.3 + 0.4), Range.exact(500e3), Range.exact(1),
32+
Range.exact(0.35), 1, 0.0165,
33+
efficiency=Range.exact(1)
34+
)
35+
self.assertAlmostEqual(values.dutycycle.upper, 0.298, places=3)
36+
self.assertAlmostEqual(values.inductance.upper, 14.8e-6, places=7)
37+
38+
# the example uses a ripple current of 0.346 for the rest of the calculations
39+
values = BuckConverterPowerPath.calculate_parameters(
40+
Range.exact(12 + 0.4), Range.exact(3.3 + 0.4), Range.exact(500e3), Range.exact(1),
41+
Range.exact(0.346), 1, 0.0165,
42+
efficiency=Range.exact(1)
43+
)
44+
self.assertAlmostEqual(values.inductor_peak_currents.upper, 1.173, places=3)
45+
self.assertAlmostEqual(values.output_capacitance.lower, 5.24e-6, places=7)
1546

1647
def test_boost_converter(self):
17-
values = BoostConverterPowerPath.calculate_parameters(
48+
values_ref = BoostConverterPowerPath.calculate_parameters(
1849
Range.exact(5), Range.exact(10), Range.exact(100e3), Range.exact(1),
1950
Range.exact(0.1), 0.01, 0.001,
2051
efficiency=Range.exact(1)
2152
)
22-
self.assertEqual(values.dutycycle, Range.exact(0.5))
53+
self.assertEqual(values_ref.dutycycle, Range.exact(0.5))
54+
# validated against https://www.omnicalculator.com/physics/boost-converter
55+
self.assertEqual(values_ref.inductance, Range.exact(250e-6))
56+
57+
# test that component values are calculated for worst-case conversion
58+
values = BoostConverterPowerPath.calculate_parameters(
59+
Range(5, 8), Range(7, 10), Range.exact(100e3), Range.exact(1),
60+
Range.exact(0.1), 0.01, 0.001,
61+
efficiency=Range.exact(1)
62+
)
63+
self.assertEqual(values_ref.inductance, values.inductance)
64+
self.assertEqual(values_ref.input_capacitance, values.input_capacitance)
65+
self.assertEqual(values_ref.output_capacitance, values.output_capacitance)
66+
67+
def test_boost_converter_example(self):
68+
# using the example from https://passive-components.eu/boost-converter-design-and-calculation/
69+
# 0.4342A ripple current from .35 factor in example converted in output current terms
70+
values = BoostConverterPowerPath.calculate_parameters(
71+
Range.exact(5), Range.exact(12 + 0.4), Range.exact(500e3), Range.exact(0.5),
72+
Range.exact(0.4342), 1, 1,
73+
efficiency=Range.exact(1)
74+
)
75+
self.assertAlmostEqual(values.dutycycle.upper, 0.597, places=3)
76+
self.assertAlmostEqual(values.inductance.upper, 13.75e-6, places=7)
77+
78+
# the example continues with a normalized inductance of 15uH
79+
values = BoostConverterPowerPath.calculate_parameters(
80+
Range.exact(5), Range.exact(12 + 0.4), Range.exact(500e3), Range.exact(0.5),
81+
Range.exact(.4342*13.75/15), 0.01, 0.06,
82+
efficiency=Range.exact(1)
83+
)
84+
self.assertAlmostEqual(values.dutycycle.upper, 0.597, places=3)
85+
self.assertAlmostEqual(values.inductance.upper, 15.0e-6, places=7)
86+
self.assertAlmostEqual(values.inductor_peak_currents.upper, 1.44, places=2)
87+
# the example calculation output is wrong, this is the correct result of the formula
88+
self.assertAlmostEqual(values.output_capacitance.lower, 9.95e-6, places=7)

0 commit comments

Comments
 (0)