Feed a Renogy RSP100DC (Vmp 19.97 V) into a 12 V PWM controller and 27.9% of the panel's voltage above the battery's 14.4 V charge point is thrown away as heat before it ever reaches the battery. Feed the same panel into an MPPT controller and that excess voltage gets converted into extra current instead. The two controller types aren't different grades of the same thing — they handle the panel's operating point in fundamentally different ways, and the difference is computable from the panel's own datasheet, not a marketing claim.
What a controller actually does with the panel's voltage
A panel's maximum-power point (Vmp, Imp) is fixed by its own physics at a given temperature and irradiance — it's the one operating voltage where the panel produces the most watts. A 12 V battery bank charges at a specific voltage window (14.4 V bulk, per Calc::V_CHARGE[12]), which is almost always lower than a panel's Vmp, because 12V-class panels are built with a Vmp comfortably above battery voltage to leave headroom for voltage drop, temperature, and low-light conditions.
A PWM (pulse-width modulation) controller does not convert voltage at all — it switches the panel's connection to the battery on and off rapidly, which pulls the panel's actual operating point down to whatever voltage the battery is sitting at. Every volt of the panel's Vmp above that battery voltage is not delivered as extra current; it's simply not used, dissipated as heat in the cells operating away from their power point. An MPPT (maximum power point tracking) controller instead uses a DC-DC converter stage to buck the panel's higher voltage down to charging voltage while stepping current up correspondingly (power in equals power out, minus conversion losses) — so the excess volts don't disappear, they get converted into amps the battery actually receives.
The catalog encodes this as two flat derate constants applied to array wattage: Calc::MPPT_DERATE = 0.90 and Calc::PWM_DERATE = 0.75, used identically in arrayBalance() on both the PHP and JS sides. These aren't independent guesses — the 15-point gap between them is the modeled average cost of the clamping behavior above, applied uniformly because the exact loss for any one panel depends on how far its Vmp sits above battery voltage, which varies panel to panel.
The panel-specific clamping loss, computed per panel
The site's pwm-loss rule computes the actual percentage for any specific panel and system voltage: loss = 1 − V_CHARGE[system_v] / string_vmp, and flags it whenever a string's Vmp exceeds 1.4× system voltage on a PWM controller. Running that formula against real panels in the catalog, at 12 V (charge voltage 14.4 V):
| Panel | Vmp | Voltage clamped away on PWM | Fraction of Vmp wasted |
|---|---|---|---|
| Rich Solar MEGA 100 FLEX (RS-F100B) | 17.1 V | 2.7 V | 15.8% |
| Renogy RSP100DC (16BB N-Type) | 19.97 V | 5.57 V | 27.9% |
| BougeRV Arch Pro (N-Type TOPCon) | 32.4 V | 18.0 V | 55.6% |
The pattern is direct: the higher a panel's Vmp sits above the battery's charge voltage, the more of that panel's rated power a PWM controller simply cannot use. A PWM system built with a low-Vmp panel loses relatively little; the same controller paired with a newer high-Vmp N-type panel — increasingly common because higher cell voltage reduces resistive loss inside the panel itself — loses more than half the panel's rated output to clamping. This is exactly why PWM systems are conventionally matched to "12V-nominal" panels specifically chosen to keep Vmp close to charging voltage, and why pairing a PWM controller with a panel designed for an MPPT-based system is a specific, quantifiable mismatch rather than a vague inefficiency.
What the derate difference costs in array size
arrayBalance(dailyWh, genPerKwDayWh, arrayW, controllerType) answers a different, more practical question: given a daily load and a site's solar generation per kW of array, how many watts of panel does it take to cover that load — and how does the answer change with controller type? For a 1,500 Wh/day load at a site generating 4,000 Wh per kW of array per day (roughly 4 peak sun hours):
| Controller type | Derate | Required array (300 W array, 1,500 Wh load) | Actual output from a 300 W array |
|---|---|---|---|
| MPPT | 0.90 | 417 W | 1,080 Wh/day (28% deficit) |
| PWM | 0.75 | 500 W | 900 Wh/day (40% deficit) |
To fully cover the same 1,500 Wh/day load, this site needs 417 W of MPPT-fed array against 500 W of PWM-fed array — an 83 W difference, or 20% more panel wattage required purely from the controller choice, before a single panel's own Vmp margin is even considered. That 20% is the flat modeled cost of PWM's clamping behavior baked into arrayBalance(); the panel-specific numbers in the table above show why that average holds — and why it can be considerably worse than 20% for a mismatched high-Vmp panel specifically.
Why MPPT isn't simply "better" without qualification
None of this makes PWM a defective technology — it makes it a technology matched to a specific and narrower use case. A PWM controller is simpler, has no DC-DC conversion stage to fail, and costs a fraction of an equivalently-rated MPPT unit. For a small array built from 12V-nominal panels chosen specifically to keep Vmp close to battery voltage — like the Rich Solar MEGA 100 FLEX in the table above, with only a 2.7 V clamping loss — the efficiency gap is small enough that PWM's lower cost and mechanical simplicity can be the better engineering tradeoff, not just the cheaper one. The mistake isn't choosing PWM; it's choosing PWM and then pairing it with a high-Vmp panel selected for an MPPT system, which is where the 25%+ losses in the table above come from.
A second load, to show the gap isn't a one-off number
The 20% figure above comes from the ratio of the two derates (0.90/0.75 = 1.2̄) and holds regardless of the specific load and generation numbers plugged in, because arrayBalance()'s required_w term divides by genPerKwDayWh/1000 × derate — the derate is a straight denominator, so any two loads compared at the same generation rate carry the same 1.2x ratio between required MPPT and PWM array size. A larger, more realistic daily load of 3,000 Wh/day at a sunnier 5,000 Wh/kW/day site confirms it:
| Controller type | Derate | Required array size |
|---|---|---|
| MPPT | 0.90 | 667 W |
| PWM | 0.75 | 800 W |
667 W vs. 800 W — a 133 W gap, again exactly 20% more panel for PWM to cover the identical load. The absolute wattage changes with the load and the site's generation; the 20% relationship between the two controller types does not, because it's fixed entirely by the ratio of the two constants, not by anything specific to a particular system.
Where the flat derate comes from, and its limits
0.90 and 0.75 are not per-panel calculations — they're catalog-wide averages standing in for effects that, individually, are panel- and installation-specific: MPPT's own conversion losses (a real buck converter is roughly 97-99% efficient, not 100%), tracking algorithm overhead as the controller hunts for the true power point under changing light, wiring and connector losses, and — for PWM specifically — the clamping loss this guide's first table quantifies per panel. Because that clamping loss varies from roughly 16% to over 55% depending on the specific panel's Vmp margin, PWM's flat 0.75 derate is necessarily an average across a wide range of real outcomes, not a guarantee for any one pairing. A build using a low-Vmp, PWM-matched panel will likely outperform the flat 0.75 estimate; a build pairing PWM with a high-Vmp panel, as the BougeRV Arch Pro row showed, will underperform it substantially. The practical use of the flat derate is as a conservative planning number when the specific panel isn't yet chosen — the pwm-loss rule's per-panel calculation is the more precise check once it is.
Try it: required array size for your load and site
Enter a daily load, a site's generation per kW of array per day, and a controller type, to see the required array wattage via arrayBalance().
Required array to cover the load: — · This array's actual output: —/day
What this means in practice
Three consequences follow directly from the derate mechanism, not from a general reputation MPPT controllers have for being "the good ones":
- Check a specific panel's Vmp against system charge voltage before choosing PWM. The
pwm-lossrule's own threshold — Vmp above 1.4× system voltage — is a reasonable line: below it, PWM's simplicity is a defensible tradeoff; above it, the wasted fraction climbs fast, as the 55.6% loss on the 32.4 V TOPCon panel above shows. - Sizing an array for a PWM system means sizing for the 0.75 derate, not the panel's rated wattage. A PWM array sized as if every rated watt reaches the battery will underperform the load by exactly the gap this guide's table shows — a design error, not a hardware defect, and one
arrayBalance()catches before parts are bought. - The two derates aren't a small rounding difference — they compound with everything else in the system. A 20% larger PWM array also means proportionally larger wire, a larger footprint, and a heavier fuse and breaker sizing throughout the PV circuit, so the real cost of choosing PWM with a mismatched panel extends past the panel purchase itself.
The controller catalog lists type (MPPT or PWM) for every controller on the site, and the panel catalog lists Vmp for every panel, so this same comparison can be run for any panel-and-controller pairing, not just the examples above.
These results are for reference. Wiring must be installed by a qualified electrician. Mobile installations follow ABYC E-11; stationary ones NEC 690/706.