“Learn how to implement a maximum power point tracking (MPPT) algorithm with an Arduino to optimize solar panel performance. Our tutorial provides sample code and insights into how MPPT works, helping you maximize energy output from your solar panel system.”

Disclaimer:

Advertisements

What is MPPT?

An MPPT, or maximum power point tracker is an electronic DC-to-DC converter that optimizes the match between the solar array (PV panels), and the battery bank or utility grid. To put it simply, they convert a higher voltage DC output from solar panels (and a few wind generators) down to the lower voltage needed to charge batteries.

MPPT algorithm with an Arduino

The maximum power point of a solar panel varies with sunlight and load. Voltage reduces with an increment of load and a decrease in sunlight, on the other hand, current increases with an increment of sunlight and decreases in load.

So? when the voltage is maximum, the current is minimum, and when the current is maximum, the voltage is minimum. So we are not getting the power in full. But if we operate the panel at a point where we get the maximum current at maximum voltage, then we can get the maximum power out of the panel.

That is the MPPT. To know more about MPPT, read this.

Making an MPPT controller:

To make an MPPT controller, you need a DC/DC converter that you can control with a controller (microcontroller or similar) and you can measure the input and output voltage & currents. I’ve written a complete guide to make an MPPT controller, you can read it from here.

now, here is an example code in the Arduino platform that you can use to make an MPPT controller.

Arduino Example code to find MPPT:

#define VIN A0 //Input voltage from solar panel
#define VOUT A1 //Output voltage to battery
#define IOUT A2 //Output current to battery

#define VSTEP 0.2 //Voltage step size for perturb and observe method
#define MAX_VOLTAGE 18 //Maximum voltage that can be supplied to battery
#define MIN_VOLTAGE 12 //Minimum voltage that can be supplied to battery

double vIn, vOut, iOut, vMPPT; //Variables for voltage and current readings

void setup() {
  Serial.begin(9600); //Initialize serial communication
  pinMode(VIN, INPUT); //Set VIN pin as input
  pinMode(VOUT, INPUT); //Set VOUT pin as input
  pinMode(IOUT, INPUT); //Set IOUT pin as input
}

void loop() {
  vIn = analogRead(VIN) * 5.0 / 1023.0; //Convert analog reading to voltage
  vOut = analogRead(VOUT) * 5.0 / 1023.0; //Convert analog reading to voltage
  iOut = analogRead(IOUT) * 5.0 / 1023.0; //Convert analog reading to current

  //Perturb and Observe algorithm
  if (vOut < MAX_VOLTAGE && vOut > MIN_VOLTAGE) {
    double vInPerturb = vIn + VSTEP;
    double vOutPerturb = vOut + VSTEP * (vInPerturb - vIn) / (vInPerturb + vIn);
    double pOutPerturb = vOutPerturb * iOut;
    double pOut = vOut * iOut;

    if (pOutPerturb > pOut) {
      vMPPT = vInPerturb;
    }
    else {
      vInPerturb = vIn - VSTEP;
      vOutPerturb = vOut + VSTEP * (vInPerturb - vIn) / (vInPerturb + vIn);
      pOutPerturb = vOutPerturb * iOut;

      if (pOutPerturb > pOut) {
        vMPPT = vInPerturb;
      }
      else {
        vMPPT = vIn;
      }
    }
  }
  else {
    vMPPT = vIn;
  }

  Serial.print("MPPT Voltage: ");
  Serial.println(vMPPT);
  delay(1000); //Wait for next reading
}

The code uses the perturb and observe algorithm to find the maximum power point of the solar panel and adjust the voltage output accordingly. The MPPT voltage is calculated and printed to the serial monitor every second. Make sure to connect the solar panel, battery, and current sensor to the correct pins on the Arduino and adjust the maximum and minimum voltage values according to your specific setup.

Additionally, you can modify the code to control a DC-DC converter to adjust the voltage output and achieve the maximum power point. Here’s an example code:

MPPT Controller code for Arduino:

#define VIN A0 //Input voltage from solar panel
#define VOUT A1 //Output voltage to battery
#define IOUT A2 //Output current to battery

#define VSTEP 0.2 //Voltage step size for perturb and observe method
#define MAX_VOLTAGE 18 //Maximum voltage that can be supplied to battery
#define MIN_VOLTAGE 12 //Minimum voltage that can be supplied to battery

double vIn, vOut, iOut, vMPPT; //Variables for voltage and current readings
double dutyCycle; //Duty cycle of DC-DC converter

void setup() {
  Serial.begin(9600); //Initialize serial communication
  pinMode(VIN, INPUT); //Set VIN pin as input
  pinMode(VOUT, INPUT); //Set VOUT pin as input
  pinMode(IOUT, INPUT); //Set IOUT pin as input
  pinMode(9, OUTPUT); //Set pin 9 as output for PWM signal to DC-DC converter
}

void loop() {
  vIn = analogRead(VIN) * 5.0 / 1023.0; //Convert analog reading to voltage
  vOut = analogRead(VOUT) * 5.0 / 1023.0; //Convert analog reading to voltage
  iOut = analogRead(IOUT) * 5.0 / 1023.0; //Convert analog reading to current

  //Perturb and Observe algorithm
  if (vOut < MAX_VOLTAGE && vOut > MIN_VOLTAGE) {
    double vInPerturb = vIn + VSTEP;
    double vOutPerturb = vOut + VSTEP * (vInPerturb - vIn) / (vInPerturb + vIn);
    double pOutPerturb = vOutPerturb * iOut;
    double pOut = vOut * iOut;

    if (pOutPerturb > pOut) {
      vMPPT = vInPerturb;
    }
    else {
      vInPerturb = vIn - VSTEP;
      vOutPerturb = vOut + VSTEP * (vInPerturb - vIn) / (vInPerturb + vIn);
      pOutPerturb = vOutPerturb * iOut;

      if (pOutPerturb > pOut) {
        vMPPT = vInPerturb;
      }
      else {
        vMPPT = vIn;
      }
    }
  }
  else {
    vMPPT = vIn;
  }

  //Calculate duty cycle based on MPPT voltage
  dutyCycle = (vMPPT - MIN_VOLTAGE) / (MAX_VOLTAGE - MIN_VOLTAGE);
  analogWrite(9, dutyCycle * 255); //Output PWM signal to DC-DC converter

  Serial.print("MPPT Voltage: ");
  Serial.println(vMPPT);
  delay(1000); //Wait for next reading
}

The code uses the duty cycle of a PWM signal to control a DC-DC converter and adjust the voltage output to achieve the maximum power point. The MPPT voltage is calculated and printed to the serial monitor every second. Make sure to connect the DC-DC converter to pin 9 on the Arduino and adjust the maximum and minimum voltage values according to your specific setup.

Conclusion:

It’s worth noting that the code I provided is just one example of an MPPT algorithm for Arduino. There are many other methods that can be used to track the maximum power point, such as the incremental conductance method, the hill climbing method, and the fuzzy logic method.

Additionally, the code assumes that the solar panel is connected directly to the Arduino’s analog inputs. In practice, you may need to use a voltage divider circuit or an op-amp circuit to adjust the voltage and current readings to the correct range for the Arduino.

Furthermore, the code only controls the voltage output to achieve the maximum power point. In a real-world system, you would also need to consider factors such as the temperature and shading of the solar panel, as well as the voltage and current limits of the battery being charged.

In summary, while the code I provided can serve as a starting point for implementing an MPPT algorithm on Arduino, it should be customized and optimized for your specific setup and requirements.

Read more on:

For Professional Designs or Help:

Loading
Categories: ArduinoElectronics

MKDas

Mithun K. Das; B. Sc. in EEE from KUET; Head of R&D @ M's Lab Engineering Solution. "This is my personal blog. I post articles on different subjects related to electronics in the easiest way so that everything becomes easy for all, especially for beginners. If you have any questions, feel free to ask through the contact us page." Thanks.

2 Comments

Djalltra · 31/03/2024 at 6:41 pm

Can you please provide the same algorithm for pure sine wave inverter with change over and battery charging

Leave a Reply

Avatar placeholder

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