P&O MPPT Algorithm: From Theory to DSP Implementation

P&O MPPT Algorithm: From Theory to DSP Implementation

Maximum Power Point Tracking (MPPT) is the algorithmic heart of any photovoltaic or DC-source energy harvesting system. Among the family of MPPT algorithms, the Perturb & Observe (P&O) method remains the most widely deployed due to its simplicity, low computational overhead, and proven field reliability. This article traces the P&O algorithm from first principles through to a fixed-point DSP implementation extracted from a 30 kW commercial Power Conversion System, examining the production-grade techniques that differentiate a lab prototype from a field-deployable solution.

1. P&O Algorithm Fundamentals

The P&O algorithm operates on a simple principle: perturb the operating voltage and observe the resulting change in power. The decision logic follows four rules:

ΔP ΔV Action Interpretation
Positive Positive Increase V Operating left of MPP on the P-V curve
Positive Negative Decrease V Operating right of MPP on the P-V curve
Negative Positive Decrease V Crossed MPP from left to right
Negative Negative Increase V Crossed MPP from right to left

At the MPP, dP/dV = 0. The algorithm oscillates around this point with an amplitude determined by the perturbation step size. Larger steps track faster but oscillate more; smaller steps reduce oscillation but slow tracking. The art of P&O implementation lies in balancing these competing objectives.

2. Fixed-Point DSP Implementation

The MPPT routine executes every 8 ADC interrupts at a 6 kHz ISR rate, giving an effective MPPT update rate of 750 Hz. This is intentionally slower than the control loop to allow the DC bus voltage loop sufficient time to settle after each perturbation before the next power observation.

void sMpptStrategy(INT16S wPVVolMppt, INT16S wPVCurrMppt, INT16S wDCPowerMppt)
{
    INT16S wPvVoltAvg = 0;
    INT32S dwPvPowerAvg = 0;
    INT16S wPOstep = 24;  // Perturbation step size

    dwPVVoltSum = dwPVVoltSum + wPVVolMppt;
    dwPVPowerSum = dwPVPowerSum + wDCPowerMppt;

    if (++wMpptCount >= 8) {   // Execute every 8th interrupt
        wMpptCount = 0;
        wPvVoltAvg = dwPVVoltSum >> 3;     // Power-of-2 averaging
        dwPvPowerAvg = dwPVPowerSum >> 3;
        dwPVVoltSum = 0;
        dwPVPowerSum = 0;
        // ... MPPT logic follows
    }
}

A key fixed-point optimization is the use of power-of-2 averaging. Instead of dividing the accumulated sum by 8 with an integer division instruction (costly on the DSP28335), the code uses a right-shift of 3 bits. This produces identical results with a single CPU cycle while avoiding any off-by-one errors from truncation that could bias the MPPT direction over thousands of iterations.

3. Dead-Band Anti-Oscillation

Without mitigation, the P&O algorithm would perpetually oscillate around the MPP, causing unnecessary ripple on the PV voltage and minor power loss from the continuous perturbation. The solution is a dead-band region:

#define cBus5V  80  // 80 = 16 * 5V, Q4 scaling

if (abs(wPvVoltAvg - wMpptPvVoltMP) < cBus5V) {
    // Inside dead-band: execute P&O logic
    // ...
}
// Outside dead-band: skip P&O, maintain current setpoint

The dead-band of 5V (scaled to Q4 as 80 counts) means the algorithm only perturbs when the average voltage is within 5V of the current MPP estimate. Outside this band (e.g., during fast irradiance changes or cloud transients), the algorithm holds the voltage setpoint steady, relying on the fast-tracking accelerator to recover. This eliminates oscillation during steady-state operation while preserving tracking speed during transients.

4. Fast-Tracking Accelerator

When irradiance drops suddenly (e.g., a cloud passes), the PV current can fall below the threshold where P&O becomes unreliable due to poor signal-to-noise ratio in the power measurement. The code implements a two-stage acceleration mechanism:

if ((wPVCurrMppt - wMpptPVCurrOffset) > 32) {  // Above 4A threshold? (32 = 4A * Q3)
    // Normal P&O mode with dead-band
    uwMiniCurrCnt = 0;
} else {
    // Fast-tracking accelerator engaged
    if (++uwMiniCurrCnt < 10) {
        wMpptPvVoltMP = wMpptPvVoltMP - cBus5V;   // Phase 1: slow sweep (3.2s)
    } else {
        wMpptPvVoltMP = wMpptPvVoltMP - cBus20V;  // Phase 2: fast sweep
        uwMiniCurrCnt = 10;
    }
}

Phase 1 (first 3.2 seconds of low current): the algorithm sweeps downward at 5V per 320 ms, searching for the new MPP due to reduced irradiance. Phase 2 (beyond 3.2 seconds): the sweep accelerates to 20V per cycle, covering the full 850V–minimum range quickly. Once current recovers above the threshold, normal P&O resumes instantly.

5. Complete P&O Decision Logic

The core decision block is concise yet handles all four quadrants of the (dP, dV) plane:

dwDeltaPvPower = dwPvPowerAvg - dwMpptPvPowerMPPrev;
wDeltaPvVolt = wPvVoltAvg - wMpptPvVoltMPPrev;

if (abs(wPvVoltAvg - wMpptPvVoltMP) < cBus5V) {
    if (dwDeltaPvPower > 0) {
        if (wDeltaPvVolt > 0) {
            wMpptPvVoltMP = wMpptPvVoltMP + wPOstep;    // dP>0, dV>0: go higher
        } else if (wDeltaPvVolt < 0) {
            wMpptPvVoltMP = wMpptPvVoltMP - wPOstep;    // dP>0, dV<0: go lower
        }
    } else {
        if (wDeltaPvVolt > 0) {
            wMpptPvVoltMP = wMpptPvVoltMP - wPOstep;    // dP<0, dV>0: reverse
        } else if (wDeltaPvVolt < 0) {
            wMpptPvVoltMP = wMpptPvVoltMP + wPOstep;    // dP<0, dV<0: reverse
        }
    }
}

// Voltage clamping
if (wMpptPvVoltMP > 13600) { wMpptPvVoltMP = 13600; }      // 850V max
else if (wMpptPvVoltMP < uwMpptVolMin) { wMpptPvVoltMP = uwMpptVolMin; }

The voltage is clamped to 13600 (850V in Q4) at the upper end and a configurable minimum at the lower end, preventing the MPPT from drifting the operating point into the inverter's non-linear modulation region or below the PV panel's reverse-bias threshold.

6. P&O vs. Incremental Conductance Comparison

Criterion Perturb & Observe Incremental Conductance
Computational Complexity Low (2 multiplies, 4 comparisons) Medium (division + threshold logic)
Steady-State Oscillation Inherent (mitigated by dead-band) Minimal (stops at dI/dV = -I/V)
Rapid Irradiance Tracking Good (with fast-tracking accelerator) Excellent (instantaneous dP/dV detection)
Noise Sensitivity Moderate (mitigated by averaging) Higher (derivative amplifies noise)
Implementation Effort Minimal Higher (division, fractional comparison)
Partial Shading Poor (local maxima trapping) Poor (same limitation)
Fixed-Point DSP Suitability Excellent Fair (division requires Q-format care)

For this 30 kW PCS, P&O was the appropriate choice: the 8-sample power averaging eliminates noise sensitivity, the dead-band suppresses steady-state oscillation, and the fast-tracking accelerator compensates for P&O's inherent sluggishness during large irradiance transients. For applications with severe partial shading (e.g., residential rooftop with chimney shadows), a global MPPT algorithm such as a scanning P&O or particle swarm optimization would be more appropriate.

7. Tuning Recommendations

  • Step size selection: Set wPOstep to approximately 1–2% of the expected MPP voltage. For an 800V MPP, 24 counts (1.5V in Q4) is 0.19%—conservative but yields tight MPP tracking with 99.7%+ efficiency.
  • Averaging window: The 8-sample window at 6 kHz (1.33 ms) must exceed the DC bus voltage loop settling time (typically 500–800 µs) to ensure each power measurement reflects a settled operating point.
  • Dead-band width: Set to 2–3 times the perturbation step size. At 5V dead-band and 1.5V step, the algorithm oscillates within a 3-step window at steady state, trading 0.6% voltage ripple for near-zero hunting loss.
  • Current threshold: The 4A minimum current threshold for P&O activation should be set just above the ADC noise floor plus the current sensor offset drift over temperature.
Need custom power electronics development? Contact InnovChip for a consultation →

Leave a Reply

Your email address will not be published. Required fields are marked *