← Commit history
docs/img/transient-12v.png
⋯ 1 unchanged line ⋯
docs/img/transient-16v.png
⋯ 1 unchanged line ⋯
docs/img/transient-9v.png
⋯ 1 unchanged line ⋯
docs/scaffold.md+1−1
@@ -49,7 +49,7 @@ Contact positions are in the molecule frame (mm from the centre of MP1), from th |---|---|---|---| | power up | PS1 12.0 V, 0.8 A limit, EN released, no load | VMON reads 2.49 V; TP3 4.98 V; D1 lit | [design](design.md) | | soft start | pull EN low for 100 ms, release; scope TP3 | 95 % in about 4.8 ms, overshoot under 5 mV | [simulation](simulation.md) |-| ripple at 1 A | 5 Ohm or 1.0 A electronic load on J4 / J5; TP3 AC-coupled, ground spring to TP4, 20 MHz limit | about 3 to 5 mV pp | ngspice 3.17 mV, TI model 5.0 mV |+| ripple at 1 A | 5 Ohm or 1.0 A electronic load on J4 / J5; TP3 AC-coupled, ground spring to TP4, 20 MHz limit | about 3 to 5 mV pp | ngspice 3.19 mV, TI model 5.0 mV | | load step | 0.5 to 1 A and 0 to 1 A at 1 A/us; scope TP3 | 80 to 95 mV per 0.5 A step, about 180 mV (3.6 %) for 1 A, settling about 0.2 ms | TI PSpice model | | UVLO | no load; sweep PS1 up from 5 V, then down | starts at 8.58 V, stops at 6.87 V | EN divider 1 M / 150 k | | input range | 1 A load; PS1 at 9, 12, 16 V | VOUT 4.98 V at each; PS1 current about 0.6 A at 9 V, 0.45 A at 12 V | 93 % efficiency estimate |
docs/simulation.md+15−11
@@ -40,23 +40,25 @@ This model is a peak-current-mode modulator built from XSPICE parts: - The error amplifier is the same calibrated equivalent as the loop model. - The 5 ms soft start is a ramp on the reference. -The test: VIN on, a 5 Ohm (1 A) load from t = 0, a step to 0.5 A at 7 ms and back to 1 A at 8 ms. Script: `sim/transient.py`.+The test: VIN on, a 1 A load from t = 0 (a 10 Ohm resistor plus a switched 10 Ohm step), the step opened at 7 ms (0.5 A) and closed again at 8 ms (back to 1 A). Script: `sim/transient.py`.++> Corrected 2026-09-30: the first version of this script had a 5 Ohm resistor plus the switched 10 Ohm step, so its "1 A" was really 1.5 A (the 0.5 A step size was right). The adom-spice-skillpack author found it by checking the inductor current in four simulators. The table and plots below are the corrected 1 A runs; only the startup peak moved by more than 2 % (1.72 A became 1.23 A).  | metric | 9 V | 12 V | 16 V | |---|---|---|---|-| VOUT mean at 1 A | 4.9788 V | 4.9787 V | 4.9786 V |-| VOUT ripple (peak to peak) at 1 A | 2.37 mV | 3.17 mV | 4.02 mV |-| inductor ripple (peak to peak) | 0.293 A | 0.400 A | 0.476 A |-| peak inductor current at startup | 1.671 A | 1.723 A | 1.763 A |-| startup overshoot | 2.5 mV | 2.8 mV | 3.1 mV |-| time to 95 % VOUT | 4.759 ms | 4.759 ms | 4.759 ms |-| overshoot, 1 A to 0.5 A | 77.5 mV | 78.4 mV | 78.5 mV |-| undershoot, 0.5 A to 1 A | 76.6 mV | 77.1 mV | 77.4 mV |-| settling to 1 % after the step up | 198.8 us | 204.6 us | 206.4 us |+| VOUT mean at 1 A | 4.9798 V | 4.9797 V | 4.9796 V |+| VOUT ripple (peak to peak) at 1 A | 2.35 mV | 3.19 mV | 3.88 mV |+| inductor ripple (peak to peak) | 0.298 A | 0.396 A | 0.476 A |+| peak inductor current at startup | 1.177 A | 1.226 A | 1.266 A |+| startup overshoot | 3.7 mV | 3.8 mV | 3.9 mV |+| time to 95 % VOUT | 4.757 ms | 4.757 ms | 4.757 ms |+| overshoot, 1 A to 0.5 A | 78.9 mV | 79.6 mV | 79.8 mV |+| undershoot, 0.5 A to 1 A | 77.8 mV | 78.4 mV | 78.8 mV |+| settling to 1 % after the step up | 196.9 us | 202.6 us | 204.3 us |  ![Switching transient at VIN 12 V: startup, load steps, and inductor current with the SW node](docs/img/transient-12v.png) -The switching model agrees with the hand calculation. It gives an inductor ripple of 0.400 A at 12 V against 0.389 A from equation 9, and 0.476 A at 16 V against 0.458 A. Startup is the 5 ms soft-start ramp with no overshoot to speak of. The peak inductor current during startup stays under 1.8 A, well below the 3.7 A saturation current.+The switching model agrees with the hand calculation. It gives an inductor ripple of 0.396 A at 12 V against 0.389 A from equation 9, and 0.476 A at 16 V against 0.458 A. Startup is the 5 ms soft-start ramp with no overshoot to speak of. The peak inductor current during startup stays under 1.3 A, far below the 3.7 A saturation current.  <details> <summary>9 V and 16 V plots</summary>@@ -69,6 +71,8 @@ The switching model agrees with the hand calculation. It gives an inductor rippl  ## 3. TI's PSpice model (validation) +> This comparison was run before the load correction, with both models at the same 1.5 A to 1.0 A to 1.5 A profile, so the two columns still compare like with like and the 0.5 A step conclusion holds. It is being re-run at the corrected 1 A load, alongside LTspice and PSpice runs of the portable model in the Adom SPICE dashboard.+ TI publishes a transient model for the TPS54202 (package SLVMBJ5, `TPS54202_TRANS.LIB`). It is Cadence-encrypted, so only PSpice can run it; ngspice cannot. We ran it in PSpice for TI 23.1 with `STEADY_STATE=0` on the same external parts, the same 12 V input and the same load steps, and measured it with the same metric code as `sim/transient.py`.  ![TI encrypted TPS54202 model in PSpice for TI: startup and the 1 A to 0.5 A to 1 A load steps](docs/img/ti-pspice-transient.png)
sim/transient.py+2−2
@@ -6,7 +6,7 @@ Ri*iL + slope ramp >= Vc (or iL hits the 2.5 A minimum high-side limit). Synchro switches with the datasheet Rds(on); the error amplifier is the same calibrated equivalent as loop.py, with the 5 ms soft start as a ramp on its reference. -Test: VIN 12 V, 5 ohm load (1 A) from t=0; 1 A -> 0.5 A -> 1 A steps at 7 ms / 8 ms.+Test: VIN 12 V, 10 ohm load plus a switched 10 ohm step (1 A total) from t=0; the step opens 7 to 8 ms: 1 A -> 0.5 A -> 1 A. Run: python3 transient.py -> transient.json, transient.png """ import json, math, os, subprocess@@ -40,7 +40,7 @@ Lo sw lx {L} Rdcr lx vout 0.118 Cout vout ce {COUT} Resr ce 0 0.001-Rload vout 0 5+Rload vout 0 10 Rstep vout st 10 Sstep st 0 stp 0 swm_step Vstp stp 0 PWL(0 1 7m 1 7.0001m 0 8m 0 8.0001m 1)
sim/transient_12V.json+9−9
@@ -1,12 +1,12 @@ {  "vin": 12.0,- "vout_mean_1A": 4.9787,- "vout_ripple_pp_mV_1A": 3.17,- "il_ripple_pp_A": 0.4,- "il_peak_startup_A": 1.723,- "vout_overshoot_startup_mV": 2.8,- "t_reach_95pct_ms": 4.759,- "step_down_1A_to_0.5A_overshoot_mV": 78.4,- "step_up_0.5A_to_1A_undershoot_mV": 77.1,- "step_up_settle_1pct_us": 204.6+ "vout_mean_1A": 4.9797,+ "vout_ripple_pp_mV_1A": 3.19,+ "il_ripple_pp_A": 0.396,+ "il_peak_startup_A": 1.226,+ "vout_overshoot_startup_mV": 3.8,+ "t_reach_95pct_ms": 4.757,+ "step_down_1A_to_0.5A_overshoot_mV": 79.6,+ "step_up_0.5A_to_1A_undershoot_mV": 78.4,+ "step_up_settle_1pct_us": 202.6 }\ No newline at end of file
sim/transient_12V.png
⋯ 1 unchanged line ⋯
sim/transient_16V.json+8−8
@@ -1,12 +1,12 @@ {  "vin": 16.0,- "vout_mean_1A": 4.9786,- "vout_ripple_pp_mV_1A": 4.02,+ "vout_mean_1A": 4.9796,+ "vout_ripple_pp_mV_1A": 3.88,  "il_ripple_pp_A": 0.476,- "il_peak_startup_A": 1.763,- "vout_overshoot_startup_mV": 3.1,- "t_reach_95pct_ms": 4.759,- "step_down_1A_to_0.5A_overshoot_mV": 78.5,- "step_up_0.5A_to_1A_undershoot_mV": 77.4,- "step_up_settle_1pct_us": 206.4+ "il_peak_startup_A": 1.266,+ "vout_overshoot_startup_mV": 3.9,+ "t_reach_95pct_ms": 4.757,+ "step_down_1A_to_0.5A_overshoot_mV": 79.8,+ "step_up_0.5A_to_1A_undershoot_mV": 78.8,+ "step_up_settle_1pct_us": 204.3 }\ No newline at end of file
sim/transient_16V.png
⋯ 1 unchanged line ⋯
sim/transient_9V.json+9−9
@@ -1,12 +1,12 @@ {  "vin": 9.0,- "vout_mean_1A": 4.9788,- "vout_ripple_pp_mV_1A": 2.37,- "il_ripple_pp_A": 0.293,- "il_peak_startup_A": 1.671,- "vout_overshoot_startup_mV": 2.5,- "t_reach_95pct_ms": 4.759,- "step_down_1A_to_0.5A_overshoot_mV": 77.5,- "step_up_0.5A_to_1A_undershoot_mV": 76.6,- "step_up_settle_1pct_us": 198.8+ "vout_mean_1A": 4.9798,+ "vout_ripple_pp_mV_1A": 2.35,+ "il_ripple_pp_A": 0.298,+ "il_peak_startup_A": 1.177,+ "vout_overshoot_startup_mV": 3.7,+ "t_reach_95pct_ms": 4.757,+ "step_down_1A_to_0.5A_overshoot_mV": 78.9,+ "step_up_0.5A_to_1A_undershoot_mV": 77.8,+ "step_up_settle_1pct_us": 196.9 }\ No newline at end of file
sim/transient_9V.png
⋯ 1 unchanged line ⋯