Understanding Solar Charge Controllers: PWM vs MPPT
As a professional solar installer, I’ve learned that the charge controller is the most underestimated box in a DC system. When it’s sized or set wrong, issues can occur in it. You notice “weak” batteries, random inverter alarms, or lights dimming at night. Panels also never seem to hit their potential. In this post I’ll explain what a solar charge controller does. I will also cover the difference between PWM and MPPT. Additionally, I will describe how I size and wire them correctly. Finally, I will share my field-tested troubleshooting playbook with fixes for the most common issues.

What a Solar Charge Controller Actually Does
In plain terms, the controller sits between your PV array and the battery bank and does four critical jobs:
- Multi-stage charging
- Bulk (push as much current as possible),
- Absorption (hold at a set voltage to finish the charge),
- Float (keep a full charge gently),
- Equalize (periodic controlled overcharge for flooded lead-acid only).
- Voltage/current limiting
It prevents overcharging and limits charge current to what the batteries can safely accept. - Reverse-current blocking
At night it stops batteries from back-feeding the panels. - Load management (if equipped)
Many controllers have a “LOAD” output. They include a low-voltage disconnect (LVD) to protect batteries. This feature prevents deep discharge on DC loads.
PWM vs MPPT (What I Recommend and Why)
PWM (Pulse Width Modulation)
- How it works: Think “fast switch.” PWM rapidly connects/disconnects the array to hold the battery at a target voltage. The array is effectively pulled down near battery voltage.
- When I still use it: Very small, budget systems where panel Vmp ≈ battery charge voltage (e.g., a single 36-cell 12 V panel into a 12 V battery) and short wire runs.
- Limitations you feel in the field: Any “extra” panel voltage is thrown away. Long strings or higher-voltage modules waste power.
MPPT (Maximum Power Point Tracking)
- How it works: Think “DC-DC converter with brains.” MPPT keeps the array at its sweet spot (Vmp/Imp) and converts extra voltage into extra current for the batteries.
- When I use it: Almost always. It is especially used with 60/72/120/144-cell modules and in colder climates (higher Voc). It is also used for longer wire runs, 24/48 V banks, or anytime efficiency matters.
- Real-world gain: 10–30% more harvest vs PWM is typical; more on cold, clear days.
Quick Math Example (why MPPT wins)
- Two 350 W panels in series: Vmp ≈ 34 V each → 68 V, Imp ≈ 10.3 A, P ≈ 700 W.
- Charging a 24 V battery at ~28.8 V (absorb):
- PWM clamps array near 28.8 V → power ≈ 28.8 V × 10.3 A ≈ 297 W (huge loss).
- MPPT converts 68 V×10.3 A ≈ 700 W (minus conversion losses) into ≈ 24 A at 28.8 V.
If you’re deciding today, MPPT is usually the right answer.
How I Size a Charge Controller (Correctly)
1) Electrical Limits
- PV input voltage (Voc) must be below the controller’s max even on the coldest day.
- Use:
Voc_cold = Voc_STC × [1 + |temp-coeffVoc| × (T_STC − T_min)]
. - Example: Panel Voc_STC 41 V, temp-coeff −0.30%/°C, T_min = −5 °C
ΔT = 25−(−5)=30 °C; 0.003×30=0.09 → Voc_cold=41×1.09=44.7 V.
Three in series → 134.1 V must be < controller Voc max (e.g., 150 V).
- Use:
- PV input current per string ≤ controller input current rating; each string fused.
- Output current to battery ≤ controller charge rating.
2) Power & Current Headroom
- Size for 1.25× safety on both Isc (NEC 125% rule) and charge current.
- With MPPT, I’m comfortable oversizing PV power to ~1.2–1.5× controller’s rated output; it just clips at peak.
3) Cable & Voltage Drop
- Keep PV and battery cable voltage drop ≤ 3% (≤ 2% is ideal on battery side).
- Choose cable gauge from run length and current; shorter & thicker beats hot conductors and lost watts.
Battery Charging Setpoints (Typical Ranges I Use)
Always confirm with the battery’s datasheet. These ranges are “typical,” not gospel.
Battery Type | Bulk/Absorb (25 °C) | Absorb Time | Float | Equalize | Notes |
---|---|---|---|---|---|
Flooded Lead-Acid (FLA) | 14.4–14.8 V (12 V) | 2–4 h | 13.4–13.8 V | 15.2–15.8 V (1–2 h, monthly) | Temp compensation −4 mV/°C/cell |
AGM | 14.2–14.6 V | 1–3 h | 13.4–13.6 V | No/Low | Lower gassing; no equalize unless OEM allows |
GEL | 14.0–14.2 V | 1–3 h | 13.5 V | No | Sensitive to over-voltage—be conservative |
LiFePO₄ (with BMS) | 14.0–14.4 V | Minimal | 13.4–13.6 V or none | No | Follow BMS; often no float, rely on BMS limits |
(Scale to 24/48 V banks by ×2/×4.)
Wiring & Protection: How I Build It So It Lasts
- Sequence for connect/disconnect (critical):
- Connect: Battery → program settings → PV.
- Disconnect: PV → Battery.
- Protection:
- PV side: fuse/breaker per string, PV isolator, Type-2 DC SPD, correct MC4s (same brand, proper crimp).
- Battery side: Install a fuse or circuit breaker within 18–20 cm of the battery positive. Use proper lugs and torque to the specified value. Add Type-2 DC SPD if required.
- Earthing: Bond array frames and metal enclosures to earth; keep earth resistance low; follow local code.
- Layout: Short, direct battery leads; avoid “daisy-chain” battery jumpers—use a proper bus bar for multi-battery banks.
- Ventilation: Controllers hate heat. Mount vertical, shaded, with clear airflow.
Commissioning Checklist I Run Every Time
- Verify battery chemistry, set absorb/float/equalize properly.
- Plug in battery temp sensor; confirm controller detects it.
- Confirm time-of-day and absorb duration.
- Check Voc per string and polarity at the PV input (meter, not eyes).
- Close PV isolator; confirm MPPT finds Vmp and tracks smoothly.
- Watch the charge current rise; confirm no unusual noise/heat.
- Log firmware version, final settings, and initial performance snapshot.

My Troubleshooting Workflow (Step-by-Step)
- Identify the symptom (no charge, low charge, resets, hot unit, odd readings).
- Visual & tug test (loose lugs, browning, melted plastics, wrong MC4 pairs).
- Measure PV side: per-string Voc/Isc, compare strings (±5–10%).
- Measure battery side: voltage at battery posts and at controller (detect drop).
- Check settings: battery type, absorb/float voltages, LVD, time windows.
- Thermal check: IR temp on heat sink; ventilation review.
- Firmware & logs: update if manufacturer lists relevant fixes.
- Isolate: test with known-good panel/string or bench supply if needed.
Diagnostic Table: Common Controller Problems, Root Causes & Fixes
Symptom / Error | Quick Checks | Likely Root Cause | Field Fix I Use |
---|---|---|---|
Controller dead / no display | Battery voltage at controller? Polarity? Fuse near battery? | Blown fuse, reverse polarity, open battery circuit | Replace/size fuse, correct polarity, fix battery link before PV |
Charges only in morning/evening | Ambient temp, enclosure airflow, unit too hot at noon? | Thermal derating or shutdown | Improve ventilation, relocate, add heat sinking, upsize controller |
“Batteries not charging” | Per-string Voc/Isc; PV isolator on? Shading? | Open string, MC4 mismatch, blown PV fuse | Re-terminate MC4s, replace string fuse, fix broken home-run |
Low charge current all day | Compare array power vs controller output; check cable drop | Long thin cables, PWM on high-V panels | Use MPPT, thicken cables, tighten lugs |
Overcharging (high V, boiling FLA) | Setpoints vs datasheet; temp sensor detected? | Wrong battery profile, bad temp sensor | Correct profile, replace sensor, enable temp comp |
Undercharging (never hits absorb) | Panel cleanliness, Vmp vs battery voltage, loads | Dirty/shaded array, undersized PV, heavy daytime loads | Clean/realign, add panels, reschedule big loads |
MPPT “hunts” / unstable | String Vmp vs MPPT window; partial shade? | Vmp near limits, mismatch, bypass diode issues | Re-string to keep Vmp in window; replace weak module |
PV over-voltage fault | Cold morning Voc vs controller spec | Too many in series for climate | Reduce modules per string; respect cold Voc calc |
Controller very hot | Mounting orientation, sun exposure, dust clog | Poor location, derated heatsink | Shade, clean, re-mount vertical with clearance |
LOAD output trips (DC loads) | LVD setting vs battery SOC; load surge | LVD too high, motor surge | Lower LVD carefully; connect motors directly via fused feed |
Noise/sparking at terminals | Torque, oxidation, correct lugs? | Loose/corroded joints | Clean, new lugs, torque to spec, anti-oxidant compound |
Random resets | Voltage dip on input, weak battery, poor bonding | Cable drop, battery bad, EMI | Shorter/heavier leads, service/replace battery, tidy wiring |
Lithium bank misbehaves | BMS comms? Correct profile? | Wrong profile, bad CAN/RS485 cable | Select Li profile, use vendor cable, update firmware |
SOC wildly inaccurate | Shunt installed? Correct tail current? | No shunt or wrong parameters | Install/commission battery monitor; calibrate |
Reverse current at night | Back-feed observed on PV? | Failed internal MOSFET | Replace controller; don’t rely on external diode for long term |
10 Common Issues (Explained) and How I Fix Each
- Wrong Battery Profile Selected
Effect: GEL/AGM overcharge, LiFePO₄ undercharge or float forever.
Fix: Set correct chemistry; absorb/float per datasheet; for LiFePO₄, often no float and rely on BMS. - PV String Voc Too High in Cold
Effect: Over-voltage faults or latent damage.
Fix: Recalculate cold Voc; reduce series count; keep 10–15% margin below controller max. - Undersized Controller
Effect: Thermal clipping, early failure.
Fix: Upsize to handle array and ambient; give physical cooling and headroom. - PWM Used with Modern High-V Modules
Effect: Chronic low harvest.
Fix: Swap to MPPT or re-panel with lower-V modules matched to battery. - Bad Temp Sensor / Not Installed
Effect: Wrong charge voltages as seasons change.
Fix: Replace sensor, route away from hot sinks, secure to battery. - Voltage Drop on Battery Cables
Effect: Controller “thinks” it’s at absorb; battery never truly full.
Fix: Short, thick cables; measure at posts; use remote voltage sense if available. - Partial Shade & Mismatch
Effect: MPPT hunts; peaks never stabilize.
Fix: Panel layout/optimizer/micro-inverter; or re-string to minimize mismatch. - Dirty/Soiled Modules
Effect: 5–30% loss that looks like “controller issue.”
Fix: Clean safely; implement schedule; show before/after numbers. - Loose MC4 / Mixed Brands
Effect: Hot joints, intermittents, melted plugs.
Fix: Use same-brand MC4s, correct crimp die, firm click, gentle pull test. - LOAD Port Abuse
Effect: Motors/pumps trip the controller.
Fix: Don’t run inductive/heavy loads off LOAD; feed them directly via fused lines.
Preventive Maintenance I Promise My Clients
- Monthly: Visuals, log charge cycles, spot-clean modules.
- Quarterly: Torque check on terminals, firmware check, verify absorb time achieved, thermal inspection.
- Bi-annually: Full string Voc/Isc test, battery health check (voltage spread, capacity test), settings review vs season.
- Annually: Combiner inspection, MC4 sampling (open/re-make a few), SPD check, re-calibrate monitors.
I keep a simple log: date, weather, PV peak power, bulk/absorb/float times, max controller temp. Trends tell the truth.
Quick Decision Guide: PWM or MPPT?
- Tiny cabin / lighting only / 12 V panel matched to 12 V battery? PWM is fine.
- Anything else (24/48 V, long runs, modern panels, growth plans)? MPPT.
- Hot climate with cramped enclosures? Oversize the controller and ventilate—heat kills electronics.
FAQs I Hear on Site
Q: Can I mix old and new panels on the same MPPT input?
A: I avoid it. Mixed Vmp/Imp forces the MPPT to compromise; harvest suffers. If you must, group like-for-like on the same tracker.
Q: My controller says “float” by noon—good or bad?
A: Good if the batteries are truly full. Verify with a hydrometer (FLA), BMS SOC (Li), and that absorb time actually completed.
Q: Do I need a separate controller if my hybrid inverter has one?
A: No, if its PV charger meets your array/battery specs. Add a separate MPPT only for an additional PV input or different battery.
Field Notes That Save Headaches
- Program absorb time based on battery capacity and charge current. Too short = chronic undercharge; too long = heating.
- For LiFePO₄, let the BMS be the cop. Set conservative voltages; don’t fight the BMS.
- Respect cold Voc and hot Vmp windows when stringing. The math takes minutes; the mistake lasts years.
- Always connect battery first so the controller knows its target voltage before PV arrives.