Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Arduino - PV MPPT-zonnelader

Componenten en benodigdheden

Arduino Nano R3
× 1
Inductor 100 uH
de huidige beoordelingen moeten overeenkomen met het vereiste vermogen.
× 1
Power MOSFET N-kanaal
× 1
Adafruit Standaard LCD - 16x2 Wit op Blauw
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)

Apps en online services

Arduino IDE

Over dit project

Er zijn veel laadregelaars op de markt, maar gewone goedkope laadregelaars zijn niet efficiënt voor gebruik met het maximale vermogen van zonnepanelen. En degenen die efficiënt zijn, zijn erg duur.

Dus besloot ik om mijn eigen laadcontroller te maken om efficiënt en slim genoeg te zijn om de batterijbehoeften en zonne-omstandigheden te begrijpen. Het neemt passende maatregelen om het maximale beschikbare vermogen uit zonne-energie te halen en dit zeer efficiënt in de batterij te plaatsen.

Als je mijn inspanningen leuk vindt, stem dan op deze tutorial.

Stap 1:Wat is MPPT en waarom hebben we het nodig?

Onze zonnepanelen zijn dom en niet slim genoeg om de batterijcondities te begrijpen. Stel dat we een 12v/100 watt zonnepaneel hebben en dat het een output geeft tussen 18V-21V, afhankelijk van de fabrikant, maar batterijen zijn geschikt voor een nominaal voltage van 12v. Bij volledige lading zullen ze 13,6 V zijn en 11,0 V bij volledige ontlading. Laten we nu aannemen dat onze batterijen op 13v worden opgeladen, panelen geven 18v, 5,5A bij 100% werkefficiëntie (niet mogelijk om 100% te hebben, maar laten we aannemen). Gewone controllers hebben een PWM-spanningsregelaar ckt die de spanning tot 13,6 verlaagt zonder enige stroomwinst. Het biedt alleen bescherming tegen overladen en lekstroom naar panelen tijdens de nacht.

Om dit probleem op te lossen, heb ik smps buck-converter gebruikt. Dit soort converter heeft een efficiëntie van meer dan 90%. Zelfs 90% wordt als slecht beschouwd.

Het tweede probleem dat we hebben is de niet-lineaire output van zonnepanelen. Ze moeten op een bepaalde spanning worden gebruikt om het maximale beschikbare vermogen te oogsten. Hun output varieert gedurende de dag.

Om dit probleem op te lossen worden MPPT-algoritmen gebruikt. MPPT (Maximum Power Point Tracking) zoals de naam al doet vermoeden, volgt dit algoritme het maximaal beschikbare vermogen van panelen en varieert de uitgangsparameters om de conditie te behouden.

Dus door MPPT te gebruiken, zullen onze panelen het maximale beschikbare vermogen genereren en de buck-converter zal deze lading efficiënt in batterijen stoppen.

Stap 2:Hoe werkt MPPT?

Ik ga dit niet in detail bespreken, dus als je het wilt begrijpen, bekijk dan deze link - Wat is MPPT?

In dit project heb ik ook de input V-I-kenmerken en output V-I gevolgd. Door de input V-I en output V-I te vermenigvuldigen, kunnen we het vermogen in watt krijgen.

Laten we zeggen dat we op elk moment van de dag 17 V 5 A hebben, d.w.z. 17x5 =85 watt. Tegelijkertijd is onze output 13 V 6A, d.w.z. 13x6 =78 Watt.

Nu zal MPPT de uitgangsspanning verhogen of verlagen door deze te vergelijken met het vorige ingangs-/uitgangsvermogen.

Als het vorige ingangsvermogen hoog was en de uitgangsspanning lager was dan aanwezig, dan wordt de uitgangsspanning weer verlaagd om weer op hoog vermogen te komen. En als de uitgangsspanning hoog was, wordt de huidige spanning verhoogd naar het vorige niveau. Zo blijft hij oscilleren rond het maximale vermogenspunt. Deze oscillaties worden geminimaliseerd door efficiënte MPPT-algoritmen.

Stap 3:MPPT implementeren op Arduino

Dit is het brein van deze oplader. Hieronder vindt u de Arduino-code om de uitvoer te regelen en MPPT in een enkel codeblok te implementeren.

// Iout =uitgangsstroom// Vout =uitgangsspanning// Vin =ingangsspanning// Pin =ingangsvermogen, Pin_previous =laatste ingangsvermogen// Vout_last =laatste uitgangsspanning, Vout_sense =huidige uitgangsspanningvoid reguleren (float Iout, float Vin, float Vout) {
if((Vout>Vout_max) || (Iout>Iout_max) || ((Pin>Pin_previous &&Vout_senseVout_last ))) {if(duty_cycle>0) { duty_cycle -=1; } analogWrite(buck_pin,duty_cycle); } else if ((VoutPin_previous &&Vout_sense>Vout_last) || (Pin duty_cycle+=1; } analogWrite(buck_pin,duty_cycle); } Pin_vorige =Pin; Vin_last =Vin;Vout_last =Vout;}

Stap 4:Buck-converter

Ik heb N-kanaals mosfet gebruikt om de buck-converter te maken. Gewoonlijk kiezen mensen P-kanaal mosfet voor high side switching en als ze N-kanaal mosfet voor hetzelfde doel kiezen, dan is een driver-IC vereist of boot strapping ckt.

Maar ik heb de buck-converter ckt aangepast om een ​​low-side-switching te hebben met behulp van N-kanaals mosfet. Ik gebruik N-kanaal omdat dit lage kosten, hoge vermogens en lagere vermogensdissipatie is. Dit project maakt gebruik van IRFz44n mosfet op logisch niveau, zodat het direct kan worden aangestuurd door een Arduino PWM-pin.

Voor hogere belastingsstroom moet men een transistor gebruiken om 10V aan de poort toe te passen om de mosfet volledig in verzadiging te krijgen en de vermogensdissipatie te minimaliseren. Ik heb hetzelfde gedaan.

Zoals je kunt zien in ckt hierboven, heb ik de mosfet op -ve spanning geplaatst, dus gebruik +12v van het paneel als aarde. Met deze configuratie kan ik een N-kanaals mosfet voor buck-converter gebruiken met minimale componenten.

Maar het heeft ook enkele nadelen. Omdat je beide kanten -Ve spanning gescheiden hebt, heb je geen gemeenschappelijke referentieaarde meer. Het meten van spanningen is dus erg lastig.

Ik heb de Arduino aangesloten op zonne-ingangsterminals, met behulp van de -Ve-lijn als aarde voor Arduino. We kunnen de ingangsspanning op dit punt eenvoudig meten door een spanningsdeler ckt te gebruiken volgens onze vereisten. Maar we kunnen de uitgangsspanning niet zo gemakkelijk meten omdat we geen gemeenschappelijke aarde hebben.

Om dit te doen is er een truc. In plaats van de spanning over de uitgangscondensator te meten, heb ik de spanning tussen twee -Ve-lijnen gemeten. Solar -Ve gebruiken als aarde voor de Arduino en output -Ve als het te meten signaal/voltage. De waarde die je met deze meting hebt gekregen, moet worden afgetrokken van de gemeten ingangsspanning en je krijgt de echte uitgangsspanning over de uitgangscondensator.

Vout_sense_temp=Vout_sense_temp*0.92+float(raw_vout)*volt_factor*0.08; // meet de volatge over input gnd en output gnd.
Vout_sense=Vin_sense-Vout_sense_temp-diode_volt; // verander spanningsverschil tussen twee gronden om spanning uit te voeren ..

Voor stroommetingen heb ik ACS-712 stroomdetectiemodules gebruikt. Ze worden aangedreven door Arduino en aangesloten op ingang GND.

Interne timers zijn aangepast om 62,5 Khz PWM te krijgen op pin D6, die wordt gebruikt om de MOSFET aan te sturen. Er is een uitgangsblokkerende diode nodig om lekkage in omgekeerde richting te bieden en bescherming tegen omgekeerde polariteit. Gebruik hiervoor een Schottky-diode met de gewenste stroomsterkte. De waarde van de inductor hangt af van de frequentie en de uitgangsstroomvereisten. U kunt online beschikbare rekenmachines voor buck-converter gebruiken of een belasting van 100uH 5A-10A gebruiken. Overschrijd nooit de maximale uitgangsstroom van de spoel met 80%-90%.

Stap 5:Laatste bijwerking

U kunt ook extra functies aan uw oplader toevoegen. De mijne hebben een LCD om de parameters weer te geven en 2 schakelaars om input van de gebruiker te krijgen.

Ik zal de definitieve code zeer binnenkort bijwerken en het ckt-diagram voltooien.

Stap 6:Werkelijk schakelschema, stuklijst en code

BIJWERKEN:

Ik heb de code, bom en circuit geüpload. Het is iets anders dan het mijne, omdat het gemakkelijker is om deze te maken.

Solar_charger_tutorial_code.ino

Code

  • Solar_charger_tutorial_code.ino
Solar_charger_tutorial_code.inoArduino
/////////////////////////////////////////////// //////////////////////////////////////////Gebruiksvoorwaarden///// ////////////////////////////////////////////////// //////////////////////////////////DE SOFTWARE WORDT GELEVERD "AS IS", ZONDER ENIGE GARANTIE, UITDRUKKELIJK OF//IMPLICIET, INCLUSIEF MAAR NIET BEPERKT TOT DE GARANTIES VAN VERKOOPBAARHEID,//GESCHIKTHEID VOOR EEN BEPAALD DOEL EN NIET-INBREUK. IN GEEN GEVAL ZULLEN DE//AUTEURS OF AUTEURSRECHTHOUDERS AANSPRAKELIJK ZIJN VOOR ENIGE CLAIM, SCHADE OF ANDERE//AANSPRAKELIJKHEID, HETZIJ IN EEN HANDELING VAN CONTRACT, ONRECHTMATIGE OF ANDERSZINS, VOORTVLOEIEND UIT,//UIT OF IN VERBAND MET DE SOFTWARE OF GEBRUIK OF ANDERE HANDELINGEN IN//DE SOFTWARE.//////////////////////////////////////// ///////////////////////////////////////////////#include #include #include #define vin_pin A1#define vout_pin A0#define iout_pin A2#define iin_pin A3#define lm35 A4#define fan 5#define buck_pin 6#define menu 3#define-knop 2#define led 13#define charge_led A5#define light 4uint8_t auto_mode=1;float Pin=0,Pout=0,Pin_previous=0;float efficiency=0.0;int raw_vin=0, raw_vout=0, raw_iout =0,raw_iin=0, raw_lm35=0;float Vout_boost=14.5,Vout_max=15.0, Iout_max=5.0, Vout_float=13.5, Iout_min=0.00,Vin_thresold=10.0;float Iout_sense,Iin_sense,Iin;float Vout_sense,Vin_last_float;float Vin_sense;uint8_t duty_cycle =0;float volt_factor =0,05376; // wijzig deze waarde om spanningsmetingen te kalibreren ... String mode =""; bool startup =true, lcd_stat =true, charge =true, mppt_init =true; unsigned int count =0; LiquidCrystal lcd (7, 8, 9, 10, 11, 12);void lcd_show(String data,int column, int row);void UI();void set_limits(int cmd,int temp);void mem_read();void mem_write();void mppt(); void setup() { wdt_disable(); watchdogSetup(); // plaats hier uw setup-code om een ​​keer uit te voeren:Serial.begin(115200);mem_read();pinMode(light,OUTPUT);pinMode(charge_led,OUTPUT);digitalWrite(charge_led,LOW);digitalWrite(light,HIGH);pinMode(led,OUTPUT);pinMode(ventilator,OUTPUT);pinMode(menu,INPUT);pinMode(knop,INPUT);digitalWrite(menu,HOOG);digitalWrite(knop,HOOG);TCCR0B =TCCR0B &0b11111000 | 0x01; / stel pwm in op Max... 62,5 KhzanalogWrite(buck_pin,0);lcd.begin(16,2);lcd_show("Solar Charger",0,0);delay(64000);wdt_reset();delay(64000);wdt_reset();lcd_show("Vi Vb Ib",0,0);//////////////////for(int i=0;i<10;i++) { raw_iout +=analogRead(iout_pin)-513;raw_iin +=analogRead(iin_pin)-513;raw_vin +=analogRead(vin_pin);raw_vout +=analogRead(vout_pin);raw_lm35 +=analogRead(lm35);delay(2); } raw_iout=raw_iout/10; raw_iin=raw_iin/10; raw_vout=raw_vout/10; raw_vin=raw_vin/10; Iout_sense=float(raw_iout)*5/1023/0.066; Iin_sense=float(raw_iin)*5/1023/0.066; Vout_sense_temp=float(raw_vout)*volt_factor; Vin_sense=float(raw_vin)*volt_factor; // heat_sink_temp =raw_lm35*0.48; // 0.0049*1000/10 // heat_sink_temp =heat_sink_temp-273.15; //uncomment bij gebruik van LM235}//////////void watchdogSetup(void){cli(); // schakel alle interruptswdt_reset uit (); // reset de WDT-timer// Ga naar de Watchdog-configuratiemodus:WDTCSR |=(1<Vout_max) || (Iout>Iout_max) || ((Pin>Pin_previous &&Vin_senseVin_last))) { if(duty_cycle>0) { duty_cycle-=1; } analogWrite(buck_pin,duty_cycle); } else if((VoutPin_previous &&Vin_sense>Vin_last) || (PinIout_min+1){ charge =true; } ///////////// if((Vout>Vout_max) &&(Iout
80.0){ duty_cycle=0; analogWrite(buck_pin,duty_cycle); Serial.println("Uitschakeling door oververhitting"); lcd_show("Oververhitting mislukt",0,1); wdt_reset(); for(int i=0;i<10;i++){ digitalWrite(led,HIGH); digitalWrite(charge_led,LOW); vertraging (4000); digitalWrite(charge_led,HIGH); digitalWrite (led, LAAG); vertraging (4000); } wdt_reset(); } else { lading =waar; digitalWrite(charge_led,HIGH); reguleren (Iout_sense, Vin_sense, Vout_sense); digitalWrite (led, LAAG); }}void soft_start() { for(int i=0;i<20;i++) {regul(Iout_sense, Vin_sense, Vout_sense);Serial.print("Vin=");Serial.println(Vin_sense);Serial.print ("Vout=");Serial.println(Vout_sense);Serial.print("Iout=");Serial.println(Iout_sense);Serial.print("Duty cycle=");Serial.println(duty_cycle);Serial .print("Lader MODUS:");Serial.println(mode);Serial.println("Soft Start geactiveerd"); vertraging (32000); } opstarten=false; mppt_init =false;}void lcd_show (String-gegevens, int-kolom, int-rij) { lcd.setCursor (kolom, rij); if(data.length()>0) { for(int i=0;i
45.0){ digitalWrite(fan,HIGH);}else if(heat_sink_temp<37.0){ digitalWrite(fan,LOW);}count++;}

Schema's


Productieproces

  1. Bulldozer
  2. Zonnecel
  3. Real-time data-acquisitie van zonnepaneel met behulp van Arduino
  4. Arduino Spybot
  5. FlickMote
  6. Zelfgemaakte tv B-Gone
  7. Hoofdklok
  8. Vind mij
  9. Arduino Power
  10. Solar Tracker V2.0
  11. Windkracht