measuring U/I and U/P charts of unknown solar panel

A project log for 30W (=~240W halogen) LED balcony solar lanterns

summer is on its way and my balcony needs light to be summer-night party-ready

rawerawe 05/10/2014 at 14:140 Comments

Finally, today is a day with sunny weather + some hours of free time :D

Question: At which voltage should I use my (unknown type) solar panel to get maximum power out of it? Is it really that worse if I use it a few volts above or below? Is it worth the effort to use a buck converter?

Test set-up

The following picture shows the measurement setup:

The solar panel (mounted outside) is connected to an electronic load (Litronic 9121, center of image) with monitoring output and modulation input. The monitoring output is connected to a scope (Rigol DS1052E, right hand sinde of image), which records the two channels (voltage and current) to an usb stick (.csv file).

The signal generator (Philips PM5108L, left hand side of image) creates a triangle wave from 0V up at about 40Hz (high enough for fast "frame rate", low enough to not create huge measurement errors). The triangle wave controls the electronic load current. The higher-voltage higher-z output of the signa generator is connected to the ext-trig input of the scope, to trigger reliably.

Of course, this can be done by hand (power potentiometer as load and multimeters to measure U and I), too.

It is really interesting to see the output curve, based on the birghtness change when clouds pass by:

As my Thinkpad T30 does not like plotting charts out of spreadsheets with thousands of items in it, plus open office does not like the scientific notation used by the rigol scope (only if I switch locale settings...), the following python script was used to compress the data down to fewer entries and do the power calculation.

#!/usr/bin/env python
import csv
import sys

def powercurve(fname_in,uifactor,shorten,fname_out):
    with open(fname_in, 'rb') as f:
        reader = csv.reader(f)
        rowctr = 0
        voltage_avg = 0.0
        current_avg = 0.0
        power_avg = 0.0
        out_list = []
        for row in reader:
            if row[0] != "X" and row[0] != "Second":
                voltage = float(row[1])
                current = float(row[2])*uifactor
                power = voltage*current
                if rowctr%shorten == 0:
                    dataset =[voltage_avg,current_avg,power_avg]

                    print dataset

    with open(fname_out, 'wb') as f:
        writer = csv.writer(f)

if len(sys.argv) <3:


Results and discussion

Some spreadsheet-chart-voodoo later, the following chart pops up:

The blue-ish curves correspond to the left Y-axis and show the current. The red-ish curves correspond to the right Y-axis and show the power. One current- and one power-curve belong together (ordered by color intensity).

The ambient temperature was at about 25°C. The different intersection points with the X-axis may indicate, that the temperature of the panel was a bit different for the single curves (there was strong wind which may have cooled the panel?).

For all the curves plotted, maximum power can be achieved at about 14 Volts. There is a big range of tolerance, +/- 1V, where the output power does change by a small amount only.

If the step-down had an efficiency of 100%, I would get approx. 0.5W (approx. 6%) more out of the solar panel with it, if the battery would be at 11V and the sun would shine "max" (lightest curve). As this is the situation where I would benefit from the step-down the most, it is propably not worth the effort at all for this panel. Other panels with higher voltage would benefit much more from the step-down. As I already built the circuit and it provides some level of charge control, I'll use it (maybe I'll switch for another panel or add a second one in the future).