I needed a solution for charging my single cell lithium ion batteries from solar.
I found some lightweight solar panels like these:
| open voltage | 4.4V |
| closed current | 65mA |
| weight | 1 gram |
These panels enabled me to build a 4 watt panel with mass under 2 ounces. The panels are flexible and durable (waterproof) but expensive.
The goal is to charge a single cell lithium battery using many of these cells in parallel (for increased current)
The main issue is the solar cells produce maximum power (150mW each) at 3v. This voltage is too low to charge a lithium battery which needs up to 4.2V. For optimal charging the solar cells should be run at their peak power voltage, and the voltage then boosted (boost converter) to the voltage needed for the batteries. A quick google search resulted in very few options for devices which could achieve this. Most systems are designed for 12V or higher, and even those were too expensive for me (~$100)
Instead I designed a pcb circuit board for use with solar systems of 3-12V and up to 10A. This is certainly overkill for only a 6w panel running at 3V, however I could not find decent components that were not capable of these ratings.. and the total cost for parts and board is only ~$5.
Pictures of the first version of the board:

Since I have experience with microprocessors, I decided to use one to control the converter. What I ended up with was a programmable buck/boost converter. This allows for converting DC voltages up or down, or tracking peak power. For more information on how buck converts work, see: http://en.wikipedia.org/wiki/Buck_converter
The board must be hooked up in the correct direction to work. (It can run both ways) There is no output or input, just a high voltage side and a low voltage side, power can be pumped either way. If you hook it up backwards, LED1 will blink, this means saturation, and you should flip it around to work correctly.
The microprocessor has an internal 64mhz PLL. This means that there is a high resolution for duty cycle even for fast switching frequencies (like 1mhz).
Running at different duty cycles, you can see the battery voltage (single cell lithium) red. solar panel voltage (single flexible cell) green. And battery current (crappy hall sensor) blue.
The good news is the battery current and voltage are similar so the peak power tracking can be acheived with only voltage measurement. The battery voltage increases with charge current, so I can use this fact to "detect peak power" The ADC on the microprocessor is very good and has programmable gain up to 32x to get high resolution at low voltages.
The buck/boost regulator is capable of continuous and discontinuous mode. When peak power tracking continuous mode is always enabled, but when the battery reaches charge, it may be best to run in discontinuous mode.
I have done testing over frequency, and I noticed that the lowest frequency possible before you start saturating the inductor is optimal. Higher switching speeds work, but the losses go up. This means I will dynamically scale frequency so that the inductor does not saturate. Instead of tuning frequency and duty cycle, I have:
I noticed that the top fet cannot stay on for more than 10 mili seconds. This is because the gate discharges, and the high side gate driver has to switch low to recharge the capacitor (C5) which charges the high-side gate. This means that the lowest frequency I can switch at is 1khz with a duty of .5%. This wastes some power, but it's the closest I can get to "on" and the losses are still very low.
The regulator achieves 95% and better efficiency at .5W (3V) loads. Higher voltages should have less losses. There is also 50uA*frequency + 20mW overhead of the control circuitry.. but keep in mind that if output and input voltages are close, then frequency is low.
Since I'm only measuring voltage, and not current, and my resolution is only 0.01 volts.. it is difficult to find peak power when the battery bank is large compared to the current in the solar panels. To overcome this, I periodically run at a lower duty cycle, and a higher duty cycle by 10%. Then I can use a 3-point curve fit for a parabola to fit the data.. and then just find the duty cycle where the derivative is zero:
y = a*x^2 + b*x + c y' = 2*a*x + b Setting y'=0: x = -b/(2*a)This allows me to find peak power quickly with only voltage feedback.
The software uses fixed point math which is builtin to gcc. Currently it's only in a patch. This allows for fast math with fractional numbers. The microprocessor does not have enough flash space to run floating point routines.
The lastest schematic:
For applications requiring higher voltages than 12 volt systems some parts need to be replaced. This is mainly the gate driver, mosfets and sense resistors. For example:
Various fets in same package
| Part # | Voltage | Current | R@10v | R@4.5v | Qg | charge voltage |
| FDMS8670 | 30V | 42A | 0.0026 Ohm | 0.0038 Ohm | 23 | up to 12v |
| FDMS5352 | 60V | 49A | 0.0067 Ohm | 0.0082 Ohm | 48 | up to 36v |
| FDMS3500 | 75V | 49A | 0.0145 Ohm | 0.0163 Ohm | 34 | up to 48v |
Depending on which fets are on the board, you can do higher voltage, but the on resistance is higher which results in higher losses for low voltage systems. Higher Qg is worse because it requires more power to drive the mosfet. That is why I use the lowest voltage mosfets.
Various gate drivers
| Part # | High Gate Voltage | Operating voltage |
| TPS28225 | 33 | 4.5-8.5 |
| L6743DTR | 41 | 5-12 |
| LM5109A | 108 | 8-14 |
I am using the TPS28225 which is fine for low voltage systems, but not so good above 24v. The LM5109A would work in higher voltage systems, but would also require 8 volts to power. Unfortunately the gate driver parts all use different pinouts, so a new pcb would be needed.
The board requires 5v power, options:
For communication ttl uart is provided. If you only have usb, you can use this or this cable to connect to and power the buck converter, 5v version is best.