There is a million different ways to get the power from the panels into the batteries.
As a normal rule for me, I use 60cell panels that output 8-9 amps@ 30v or so... directly onto the batteries via pwm regulator of about 100-120 amps@60v.
This works fine, and we don't loose a lot through voltage mismatching, as there in in fact almost no mismatch at the top of the charge cycle, and usually not more than 10v differential to use for any mppt that can be wangled into there even when the charge cycle is low... not a lot to work with compared to the 72 cell panels... where there is up to 30% to be claimed back ( seems optimistic , but plenty of claims out there).
The other problem, is that all the mppt types are both expensive, and very limited.. you can spend 4 to 5 hundred dollars for a lousy 60 amps..... and the voltage clearance is puny to say the least.. rarely more than 100-150v to work with.
By the time you buy a few of these, you would have been miles in front, just buying more s/hand 300 watt panels for the same money....eg a thousand bucks gets you 2kw extra solar to work with... much better than you likely to ever get out of the mppt... on the mainland ( not this island)... probably twice that.
But there is a better way, and thats using the grid tie inverters that seem to be proliferating on the net s/hand. These have serious voltage o/head in the 400v range as a lower range, and many kilowatts for very little money... and they are true mppt... yes you get your cake... and get to chew on some of it as well.
I have fiddled with this over the years, but have not gotten too serious with it, as controlling it when the batteries no longer need 5-6kw going into them becomes problematic. I tried simple solutions.... like..... let the powerjack boards let the AC voltage rise until the voltage [protection kicks in on the GTI, and shuts it down for 3 mins then has another go etc.... bang bang controller.
Another effort was a simple voltage switch that interrupts the AC going to the grid tie, and let the anti islanding shut it down... this works ok too, but never felt quite right.... it was bang bang again.
So for reasons I don't quite understand, I decided to see how hot a decent fet would get if it modulated the power from the panels into the cap bank in the inverter.
I found some fets in an old SMA, they were 600v 20 amps .35rdson 300w dissipation..... I wonder.
So using one of my normal pwm boards, I interfaced the totem pole output to the mosfet, attached to the huge heat sink of the inverter..... and quietly stood back to pick up the pieces. A quick back of the envelope said I^2R would be only about 8 watts losses..... but that would be before switching losses ... what would it really be.
It looked like this inside, with the fet attached to the back wall. It has protection zener, source gate resistor and gate resistor on there as well. We can also see where I chopped the neg input lead and sent it to the fet and then back to the board input terminal... so pulse the fet... modulate the voltage in the caps.. fool the mppt.. all looks good
The whole set up using the old board and it driving that fet looks like this
It took a bit of fiddling with board values to get all the competing hysteresis bits playing nicely... but eventually it worked very nicely.... and no heat problems up to at least 1300watts ( no more sun than that, and only one bank of panels, as this is a 1.5k inverter )
So this tells me that three fets will handle the 5kw inverter without stress... maybe 22w at worst.... now I was interested.
The little board has voltage regulation, totem pole output with beefy transistors... in fact everything needed to drive a nano ..... hmmm...
So grabbed the cutting pliers, and stripped anything not directly involved with voltage divider, power regulation, or output and indicator stuff. not much stuff was left and it looked like this before I destroyed it......
After removing all the bits... it looked like this. We can see the nano attached to it as well
Here is the pcb of the half naked board, reflecting the changes from the original
I am the worlds worst arduino coder... and like my circuitry, there is no planning or flow charts or anything. Like the pcb's I do... I start at the start and end up with something else entirely different to what I expected before I started....
So I don't pretend to be a programmer, but here what seems to work.
int ledPin = 9; // fet gate connected to this pine via totem or similar driver digital pin 9
int analogPin = 3; // divided voltage from battery or transformer if thats your go
int val = 0; // value of voltage query
int pulseVal = 0; // initilise the pulse width to zero of 255.... won't help really as the thing will run for three minutes before kick off
int floaTime=0; // initialise the time to zero for the absorb
int floatVolts = 972; // compared to the figure of the bulk and absorb...
int bulkCharge = 1000; // figured that ( 1000 ) would do as the set point for absorb voltage... gives the best definition I think
int absorbCharge = 1000; // voltage equivalent for the absorb voltage.... same as bulk.... funny about that.
int startAllOverAgain = 820; // prpobably in the 49v range
long timedOut = 50; // time delay and step rate will change this... 50 is for 30 second absorb test only.... must change this
int increment = 10; // size of each change in pwm
int weAreHereNow=0; // tells us where we are in the cycle 0=bulk, 1= absorb 2=float
void setup() // this is where the story starts...
{
pinMode(ledPin, OUTPUT); // sets the pin 9 as an output for the fet drive
Serial.begin(9600);
}
void loop() // and this is where the story really starts
{
Serial.print("pulseVal = " );
Serial.print(pulseVal); // tells us the output pulse size... 255 max
Serial.print("read value = "); //show and tell time
Serial.print(val); // tells us what it sees as the input value. measure the battery voltage and set for your circumstance
Serial.print("time value = ");
Serial.print(floaTime); // tells us ho many time cycles have passed once weAreHereNow has incremented to 1
Serial.print("weAreHereNow =" );
Serial.println (weAreHereNow); // tells us where we are now in the 3 stage cycle
delay(100); // use this to speed things up and down.... responsible for the timing number calculation
// use the timedOut definition to set the number we count to for the 2 hours...
val = analogRead(analogPin); // read the input pin
if (val< bulkCharge)
{
pulseVal=pulseVal + increment; // was not up to bulkCharge, then increase pulse width incrementally
}
if (val>=bulkCharge) // now bulkCharge is attained stage 1 finished...so we change the weAreHereNow to 1 as a flag
{
weAreHereNow=1;
}
if (val>bulkCharge)
{
pulseVal=pulseVal-increment; //We have over shot, so need to increment backwards to get back in the game... looks good on the scope
}
if ( pulseVal>=255)
{
pulseVal=255; // trying to catch o/flow sins before they happen
}
if ( pulseVal<=0)
{
pulseVal=0;
}
analogWrite (ledPin,pulseVal); // write to the fet
if (weAreHereNow==1) //if weAreHereNow is one , then count each cycle from now on until it no longer equals 1
{
floaTime=floaTime+1; // incrementing the timer stuff
bulkCharge=absorbCharge; // making sure we stay in the stage... and don;t wander off..... yeah it can happen
}
if (floaTime>=timedOut) // once we reach timedOut, we have finished our absorb sequence, change status flag weAreHereNow, and change the voltage now to float value
{
weAreHereNow=2;
bulkCharge = floatVolts; // change our battery reference voltage to the new float of 56 or 57 or whatever you choose
}
if (val<startAllOverAgain) // panic routine when voltage drops back to 48 volts or so.... we go back to restart because we couldn't hold float
{
weAreHereNow=0; // The night time comes, and it will rest o/night... well thats the plan anyway.
bulkCharge=absorbCharge;
floaTime=0;
}
}
//thats all folks
This makes the grid tie into a three stage battery charger. It will drive the batteries up to 59v, and when it gets there it will hold at 59v ( if the sun lets it) for the next 2 hours for me, then drop back to maintaining 56v for the rest of the day... or whatever we set it for.
This particular code needs the timing bought out to 2hrs by changing the timedOut in the initialising part. It incorporates a serial monitor so you can see what it sees and then use those voltage set points for your own circumstances.
The delay in there, can be changed. It will dictate the length of each calculation cycle, which also increments the pulse value, and increments the timer that will start when weAreHereNow=1. So by choosing how reactive you want it to be, will dictate how many cycles will pass before your 2 hours are up. eg if delay is set to 1000 ( 1 second), then 7000s cycles would get near to the 2 hours or however long you wanted. I made the int a long, so you should be able to get very large numbers indeed if you wish.
So it allows the use of otherwise useless GTI's to be front line chargers.
................oztules