Arduino-gebaseerde MPPT Zonnelaadcontroller voor Optimale PV Energie-Oogst
Onderdelen en Benodigdheden
| Arduino Nano R3 | × | 1 | |
| Inductor 100 µH | × | 1 | Stroomwaarden moeten overeenkomen met je benodigde vermogen |
| Power MOSFET N-Kanaal | × | 1 | |
| Adafruit Standard LCD - 16x2 Wit op Blauw | × | 1 |
Benodigde Tools en Machines
- Solderbout (generisch)
Apps en Online Diensten
- Arduino IDE
Over dit Project
Er zijn veel laadcontrollers op de markt, maar gewone goedkope controllers zijn niet efficiënt voor het halen van maximaal vermogen uit zonnepanelen. De efficiënte zijn weer heel duur. Daarom besloot ik mijn eigen laadcontroller te bouwen die efficiënt en slim genoeg is om de behoeften van de accu en de zonnestoestand te begrijpen. Het onderneemt de juiste acties om het maximaal beschikbare vermogen uit de zonnepanelen te halen en dit zeer efficiënt in de accu te laden.
Stap 1: Wat is MPPT en waarom hebben we het nodig?
Onze zonnepanelen zijn "dom" en niet slim genoeg om de accucondities te begrijpen. Stel we hebben een 12V/100W zonnepaneel dat een output geeft tussen 18V-21V, maar accu's zijn genomineerd voor 12V nominale spanning. Bij volle lading zijn ze 13.6V en bij volledige ontlading 11.0V. Stel onze accu's zijn op 13V aan het laden, panelen geven 18V, 5.5A bij 100% rendement (niet mogelijk maar als voorbeeld). Gewone controllers hebben een PWM spanningregelaar die de spanning naar 13.6V daalt zonder stroomwinst. Het biedt alleen bescherming tegen overladen en lekkagestroom naar panelen 's nachts.
Om dit te counteren heb ik een SMPS buck converter gebruikt. Dit type converter heeft boven 90% rendement.zelfs 90% wordt als slecht beschouwd.
Het tweede probleem is de niet-lineaire output van zonnepanelen. Ze moeten op een bepaalde spanning werken om maximaal beschikbaar vermogen te oogsten. Hun output varieert over de dag.
Om dit op te lossen worden MPPT algoritmes gebruikt. MPPT (Maximum Power Point Tracking) volgt het maximaal beschikbare vermogen van de panelen en past de output parameters aan om de toestand te handhaven.
Dus door MPPT te gebruiken zullen onze panelen maximaal beschikbaar vermogen genereren en de buck converter zal deze lading efficiënt in de accu's stoppen.
Stap 2: Hoe werkt MPPT?
Ik ga hier niet diep op in, maar voor begrip: Wat is MPPT?
In dit project heb ik de input V-I kenlijnen en output V-I getrackt. Door input V-I en output V-I te vermenigvuldigen krijgen we het vermogen in Watt.
Voorbeeld: 17V 5A = 85 Watt input. Op hetzelfde moment is output 13V 6A = 78 Watt. MPPT zal de output spanning verhogen of verlagen door te vergelijken met vorige input/output vermogen. Als vorig input vermogen hoger was en output spanning lager dan nu, dan wordt output spanning weer verlaagd om terug te keren naar hoog vermogen. En als output spanning hoog was, wordt huidige spanning verhoogd naar vorig niveau. Zo blijft het oscilleren rond het maximum power point. Deze oscillaties worden geminimaliseerd door efficiënte MPPT algoritmes.
Stap 3: MPPT implementeren op Arduino
Dit is de hersenen van deze lader. Hieronder de Arduino code voor regeling en MPPT in één blok:
// Iout = output stroom // Vout = output spanning // Vin = input spanning // Pin = input vermogen, Pin_previous = vorig input vermogen
// Vout_last = vorige output spanning, Vout_sense = huidige output spanning
void regulate(float Iout, float Vin, float Vout) {
if((Vout > Vout_max) || (Iout > Iout_max) || ((Pin > Pin_previous && Vout_sense < Vout_last) || (Pin < Pin_previous && Vout_sense > Vout_last))) {
if(duty_cycle > 0) { duty_cycle -= 1; }
analogWrite(buck_pin, duty_cycle);
} else if ((Vout < Vout_max) && (Iout < Iout_max) && ((Pin > Pin_previous && Vout_sense > Vout_last) || (Pin < Pin_previous && Vout_sense < Vout_last))) {
if(duty_cycle < 240) { duty_cycle += 1; }
analogWrite(buck_pin, duty_cycle);
}
Pin_previous = Pin;
Vin_last = Vin;
Vout_last = Vout;
}
Stap 4: Buck Converter
Ik heb een N-kanaal MOSFET gebruikt voor de buck converter. Meestal kiezen mensen P-kanaal voor high-side switching, en bij N-kanaal is een driver IC of bootstrap schakeling nodig. Maar ik heb de buck converter aangepast voor low-side switching met N-kanaal MOSFET. Redenen: N-kanaal is goedkoper, hogere vermogenswaarden, lagere dissipatie. Dit project gebruikt IRFZ44N logic level MOSFET, direct aan te sturen via Arduino PWM pin.
Bij hogere belastingstroom moet een transistor 10V aan de gate aanbrengen voor volledige verzadiging en minimale dissipatie. Ik heb dit gedaan.
Zoals te zien in het schema, staat de MOSFET op de -ve spanning, dus de +12V van het paneel als ground. Deze configuratie stelt me in staat een N-kanaal MOSFET te gebruiken met minimale componenten.
Nadeel: beide -ve zijden zijn gescheiden, dus geen gemeenschappelijke referentie ground meer. Spanningmetingen zijn lastig.
Ik heb de Arduino aangesloten op de zonne-invoerminalen, met de -ve lijn als ground voor Arduino. Input spanning meten is makkelijk met een spanningsdeler. Maar output spanning niet, omdat geen gemeenschappelijke ground.
De truc: in plaats van spanning over de output condensator te meten, meet ik de spanning tussen de twee -ve lijnen. Zonne -ve als ground voor Arduino, output -ve als te meten signaal. De gemeten waarde aftrekken van input spanning geeft de echte output spanning over de output condensator.
Vout_sense_temp = Vout_sense_temp * 0.92 + float(raw_vout) * volt_factor * 0.08; // meet spanning tussen input gnd en output gnd
Vout_sense = Vin_sense - Vout_sense_temp - diode_volt; // verschil tussen twee grounds omrekenen naar output spanning
Voor stroommeting gebruik ik ACS-712 stroomsensor modules, gevoed door Arduino en aangesloten op input GND.
Interne timers aangepast voor 62.5 kHz PWM op pin D6 om de MOSFET aan te sturen. Een uitgangsblokkeerdiode (Schottky) is nodig voor reverse lekstroom en polariteitsbescherming. Inductiewaarde hangt af van frequentie en output stroomvereisten. Gebruik online buck converter calculators of 100µH 5A-10A belasting. Overschrijd nooit de maximum output stroom van de inductor met 80-90%.
Stap 5: Afronding
Je kunt extra features toevoegen. Mijn versie heeft een LCD voor parameters en 2 schakelaars voor gebruikersinput. Ik zal de finale code en complete schema binnenkort updaten.
Stap 6: Echte Schema, BOM & Code
UPDATE: Code, BOM en schema geüpload. Iets anders dan mijn origineel, omdat dit makkelijker te bouwen is.
Bestand: Solar_charger_tutorial_code.ino
Code
Solar_charger_tutorial_code.ino (Arduino)
De volledige code bevat watchdog timer, EEPROM opslag voor instellingen, MPPT regeling, autolading afsnijden, zacht opstarten, LCD UI met menu systeem, en seriële monitoring. De code is te lang voor hier, maar download het .ino bestand voor de complete implementatie met commentaar.
Schema's
Productieproces
- Bulldozer Technologie: Ontwerp, Productie en Toekomstige Innovaties
- Zonnecellen: van vroege experimenten tot moderne fotovoltaïsche technieken – Technologie, productie en toekomstperspectieven
- Real-time zonnepaneelmonitoring met Arduino: Goedkope data-acquisitie
- Bluetooth-gecontroleerde Arduino Spybot bouwen
- FlickMote: Gebarengecontroleerde IR-afstandsbediening voor Slimme Huizen
- DIY Arduino TV-B-Gone: Universele TV-uit-schakelaar
- Bouw een Aangepaste LED Hoofdklok met Alarm – Zichtbaar vanaf 12 Meter
- Find Me: Slimme Item Locator met Arduino en Bluetooth
- Geoptimaliseerde Voedingsoplossingen voor Arduino Projecten
- Zonnetracker V2.0 – Geavanceerd DIY Zonnepaneel Volgsysteem
- Windenergie: Omzetten van Luchtbeweging in Schone Elektriciteit