Pages: [1] 2   Go Down
Author Topic: Solarladeregler fürs Auto mit Arduino?  (Read 5186 times)
0 Members and 1 Guest are viewing this topic.
Germany
Offline Offline
Full Member
***
Karma: 2
Posts: 171
... has much to learn
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo!

Ich bin günstig an eine Solarzelle rangekommen und überlege was ich damit, neben der Speisung von kleinen Projekten so machen könnte.
Ziemlich cool fände ich da ein Erhaltungsladungsgerät fürs Auto zu bauen. Meins steht oft rum und auf Dauer entlädt sich die Batterie dann doch ein wenig...

Kann man mit einem Arduino ein (Erhaltungs)Ladegerät für Autos bauen? Ich denke mal ja, oder?
Und lassen sich Funktionen wie Überladeschutz etc. auch vermeiden? Bzw. was will man bei sowas eigentlich an Funktionen haben?

Mal zur Solarzelle, das hier sind die Daten:
Leistung max.20 W
U max.9,12 V
I max.2,25 A
U Leerlauf10,94 V
I Kurzschluss2,71 A

Lässt sich mit dieser Zelle überhaupt was in der Richtung anfangen?

Danke!
Logged

Beste Grüße
Florian

http://www.flomei.de

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

das wird mit dieser einen Solarzelle nicht ohne weiteres gehen, da sie nur U max 9,12 V hat. Entweder eine zweite gleiche Solarzelle in Reihe geschaltet (U max dann ca. 18 V) oder die Spannung mit einer entsprechenden Schaltung anheben.

Habe selbst drei 50 Watt-Module parallel geschaltet mit jeweils U max 28 V die einen großen Akku laden. Mit dem arduino messe ich die an dem Akku anliegende Spannung mittels einfacher Spannungsteiler-Schaltung (zwei Widerstände) und regle dann die Akku-Ladung über die Software über ein MOSFET. Steigt die Spannung (bei Erhaltungsladung 13,8 V) am Akku an, verbrate ich die überschüssige Leistung mit einem 12 V Tauchsieder in einem Wasserkanister (dumpload)

Gruß Klaus
Logged

Germany
Offline Offline
Full Member
***
Karma: 2
Posts: 171
... has much to learn
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Interessant... :-)

Ich kümmere mich mal um eine zweite Zelle gleichen Typs, dann hätte ich 40 Wp bei 18 V. Klingt nach einem Anfang. :-)

Wir haben für unsere Motorräder auch kleine Erhaltungsgeräte. Das sind keine Solarzellen, die bringen 12 V bei wenigen mA, glaube ich. Von der Bauart her, kann da auch schwerlich groß was an Technik untergebracht sein.

Um das so zu machen (Spannungsteiler, damit ~13,8 V abfallen, sonst nix) und einfach an die Batterie hängen, ist bei diesen größeren Zellen vermutlich keine so gute Idee, oder?
Logged

Beste Grüße
Florian

http://www.flomei.de

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo flomei,

das mit dem Spannungsteiler hast Du wohl falsch  verstanden, über den Spannungsteiler messe ich die am Akku anliegende Spannung über einen Analogeingang des Arduino. Steigt die Spannung über einen, im Sketch festgelegten Wert (z.B. 13.8 V bei Erhaltungsladung) wird die Ladung über eine MOSFET-Schaltung, die von einem Digitalpin des Arduino angesteuert unterbrochen, indem die überschüssige Leistung per dupload verheizt wird (Tauchsieder).

Ich hatte diese Schaltung ursprünglich für ein Kleinwindrad zusammengebaut, betreibe sie jetzt aber an den schon genannten Solarpaneelen. Vielleicht kann man sie für Solarpaneele so abwandeln, dass die Ladung über den MOSFET erfolgt und bei Überschreitung der gewünschten Akkuspannung unterbrochen wird. Die Solarzellen laufen dann im Leerlauf, ich glaube das schadet den nicht?

Wenn Du interessiert bist, dann kann ich ja mal die Schaltung posten und die Experten im Forum können das Ganze vielleicht optimieren.

Gruß Klaus
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Schaltung und Sketch würden mich auch interessieren. Es wäre toll, wenn Du das veröffentlichen könntest.

Grüße,
Mario.
Logged

Germany
Offline Offline
Full Member
***
Karma: 2
Posts: 171
... has much to learn
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo!
Das wäre super, wenn du das veröffentlichen würdest, kann sicherlich noch mehr Leuten helfen.

Mit dem Spannungsteiler bezog ich mich auf die Erhaltungsladung von Batterien.
Bei zwei Solarzellen in Reihe a 9 V komme ich ja auf 18 V Spannung.
Die wollte ich mittels Spannungsteiler auf 13,8 V runterbrechen und das dann auf die Batterie "puffern".

Deine Lösung ist aber sicherlich eleganter, sicherer und skalierbar(er).
Logged

Beste Grüße
Florian

http://www.flomei.de

Germany
Offline Offline
Full Member
***
Karma: 2
Posts: 171
... has much to learn
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Zweite Solarzelle bekommen, damit jetzt also 2 x 20 Wp mit 18 V... :-D
Logged

Beste Grüße
Florian

http://www.flomei.de

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
werde die einfache Arduinoschaltung und die Sketches einstellen. Brauche aber noch etwas Zeit, da ich noch eine ganze Menge drumherum gebastelt habe und ich das Ganze noch vereinfachen muss. Also ein bis zwei Tage...

Gruß Klaus
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Hallo,

hier nun die Minimalschaltungen (mit und ohne dumpload) und den sketch  dazu.  Im sketch sind die notwendigen Änderungen für die beiden Varianten kommentiert.

Meine Originalschaltung  und dementsprechend das Arduinoprogramm sind natürlich umfangreicher.  Ich habe zusätzlich zur Spannungsmessung noch eine Strommessung,  eine Drehzahlmessung für den Dreiphasengenerator  für die Windradversion und ein vierzeiliges LCD-display.  Z.Zt. bin ich gerad dabei  die Schaltung für drei  50W Solarpaneele neu aufzubauen (die Platine dafür ist schon fertig, aber muss noch gebohrt undbestückt werden). Da ist dann noch zusätzlich ein Datenlogger  mit SD-card und eine DCF77 Funkuhr integriert.  Die einzelnen Module habe ich auf dem Steckbrett schon getestet, doch jetzt muss ich das alles noch in einem sketch zusammenfügen. Später will ich die Daten dann noch über ein Ethernetshield in das Netz stellen. Die letzten verbliebenen ports am Arduino will ich dann ach noch für einige Status-LEDs nutzen.

Zur Schaltung:
Den MOSFET kann man natürlich mit jedem logic-level Typen austauschen, natürlich müssen die Werte für die entsprechende Leistung passen. In meiner z.Zt benutzten Schaltng habe ich zwischen Gate und Arduinoport noch ein 56 Ohm Widerstand geschaltet.
Die Wahl der Widerstände für den Spannungsteiler habe ich so getroffen, weil ich diese ungraden Werte geradeaus einem Sortiment daliegen hatte, die können natürlich verändert werden.

Ich hoffe, dass ich als Laie hier nichts Falsches poste, aber bei mir funktioniert das was ich hier reingestellt habe.  Kritik sehe ich als hilfreich an.

Code:
  /*Spannungsmessung mit Arduino PV-Einspeiseregler (Ausschnitt)
   Schaltung Spannungsteiler:
   Vin )------33,4k---+---6,6k---( GND Arduino und Vin
                      |----( A0
   */
 
  #define voltPin A0    // inputpin für Spannungsmessung an Batterie
  #define shuntPWM 6 //pin 6 für PWM-Ansteuerung MOSFED GATE
  const int lVoltConst = 29; /* Konstante für Umrechnung analogen Messwert in Volt
  muss durch Messung und Berechnung in Abstimmung mit den Spannungsteilerwerten errechnet werden Formel:
  Messwert Multimeter (Volt) * 1023 / analogIn-Wert am Arduino (Messreihe erforderlich)*/
  const float UMAX = 13.8; //Maximalwert der Ladespannung, je nach Akkutyp und Ladezyklus
  int lVoltSensor = 0;  // Spannungsmessung an analogIn Pin A0
  int lVolt = 0; //gemessene Spannung
  float fVolt = 0; //Ausgabewert
  int i_PWM = 0;    //PWM-Wert MOSFET Ansteuerung
 
  void setup()
  {
    pinMode(shuntPWM, OUTPUT); // pin als Ausgang definieren
    pinMode(voltPin, INPUT);   // Pinmode für A0
    Serial.begin(9600); // +++Serial initialisieren - nur debug
    Serial.print("hallo - Spannungsmessung");
    delay(2000);
  }
  void loop()
  {
    lVoltSensor = analogRead(voltPin);  //Auslesen Messwert A0 
    Serial.println(lVoltSensor, DEC); // +++debug
    fVolt = lVoltSensor * lVoltConst; // Berechnung Volt 1.
    Serial.println(lVolt); // +++debug
    delay(500); // +++debug
    fVolt = fVolt/1024; // Berechnung Volt 2
    Serial.println(fVolt); // +++debug
    delay(1000); // +++durch withoutDelay ersetzen   
    PWM_shunt(); //Funktion
  }
 
  //Funktionen
  void PWM_shunt() // Funktion zur  Ermittlung des aktuellen PWM-Wertes zur Ladereglung
  {
    if (fVolt > UMAX) //Ladespannung Obergrenze prüfen
    {
      if (i_PWM < 254) i_PWM--; //PWM am shunt erhöhen !für Schaltung 01
      // für Schaltung 02 : if (i_PWM < 254) i_PWM++;
    }
    else if (i_PWM > 0) i_PWM++;//PWM  am shunt absenken !für Schaltung 01
        // für Schaltung 02 : if (i_PWM < 254) i_PWM--;
    analogWrite(shuntPWM, i_PWM); // PWM-Wert ausgeben für Shunt, je nach Spannung
  }

Das Hochladen der Bilder klappt nicht. Habe auch kein vernünftiges Tutorial zum einbinden von Bildern im Forum gefunden.

Erhalte jedesmal die folgende Fehlermeldung:
The upload folder is full. Please try a smaller file and/or contact an administrator.
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

werde nochmal einen Versuch starten die beiden Schaltungen hier einzufügen



Logged

Germany
Offline Offline
Full Member
***
Karma: 2
Posts: 171
... has much to learn
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke für die Pläne!

Wofür hast du eigentlich eine Blindlast in dem Schaltkreis?
Kann ich den nicht einfach öffnen und an meinen Zellen liegt Spannung an, aber ich nehme die halt nicht ab?

Danke!
Logged

Beste Grüße
Florian

http://www.flomei.de

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo flomei,

für die von Dir genannte Variante ist die erste Schaltung. Damit kann mann die Solarzelle einfach über den MOSFET vom Akku trennen bzw. PWM-gesteuert die Spannung am Akku herunterfahren. In dem geposteten Beispielsketch kann dann die Funktion  void PWM_shunt() so wie sie dasteht genutzt werden und die als  Kommentar // gesetzten beiden Zeilen können gelöscht werden.

Die Variante mit dem dumpload ist für den Anschluss an ein Windrad gedacht. Hier kann man den Anschluss an einen Akku nicht einfach abschalten, sonst würde das Windrad ungebremst hochtouren und letztendlich bei Sturm auseinanderfliegen. Deshalb muss hier immer eine Last anliegen.

Gruß Klaus
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 258
Posts: 21511
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@berlin1109 Verzeihung mal; da sind eine ganze Menge Fehler in den beiden Schaltplänen.
* Der Spannungsteiler zur Batterie-Spannungsmessung ist falsch dimensioniert. Sollte R2 vieleicht 33kOhm sein?
* Ein MOSFET brauch einen Gate-Widerstand damit der Arduino-Ausgang nicht kaputgeht (Stromspitze beim Laden der Gatekapazität).
* Im ersten Schaltbild: Wie soll der MOSFET schalten. Er ist hochohmig wenn die Gate-Sourcespannung (fast) null ist und schaltet auf niederohmig wenn die Gate-Sourcespannung über UGS(th) Gate Threshold Voltage ist. In diesem Fall mit der Gatespannung 0V bzw 5V ist die Gate Souce Spannung -12V bzw -7V. Das sind unzulässige Werte.
* Im zweiten Schaltbild ist der MOSFET richtig gepolt aber erklärst Du mir bitte wie ein Tauchsieder in einem Auto funktionieren soll. Soll man da 200 Liter Wasser mitführen? Bei 18V wären 0,6 Ohm Tauchsieder 30A; bei 12V immernoch 20 A. Das wären 240W die verheizt werden müssen und sichergegangen werden muß, daß bei Temperaturen um 40 Grad im Sommer das Wasser nie verdampft. 30 A bei 18V Solarzelle wären das 540W also eine Solarpannel zwischen 4 und 5 Quadratmeter.

@flomei Spannunsteiler verwendet man nur für Spannungsmessung. Zum Angleich von Solarpannel und Batterie verwendet man Laderegler die auf das Solarpannel abgestimmt sein müssen, dieses im Arbeitspunkt der max Leistungsabgabe betreiben und die notwendige Ladespannung des Akkus liefern.

Grüße Uwe
 
Logged

Windbergen
Offline Offline
Jr. Member
**
Karma: 0
Posts: 76
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo ihr Lieben :-)

//Nichternstgemeinterlästermode_on
Du machst gerade folgendes:
- Du möchtest einen Anhänger ziehen, Dein PKW ist jedoch zu schwach
- Du kaufst einen zweiten PKW dazu und hängst ihn davor
- Du stellst fest, dass die Fuhre zu schnell wird
- Du verstopfst bei beiden PKW die Luftfilter bis die Leistung passt
//Nichternstgemeinterlästermode_off

//Helpmode_on
1. Du brauchst natürlich nur 1 Solarmodul

2. Du must die Belastung des Moduls abhängig von der Bestrahlung verändern (Das nennt man MPP Tracking, die Einstellung auf den besten, jedoch sich mit der Einstrahlung verändernden Arbeitspunktes Pmpp=Umpp*Impp)

3. Mit der zur verfügung stehenden Energie kann man mittels Step up Wandler hochREGELN und auf 13,8 V begrenzen.

4. Da die Taktfrequenz für einen SU-Wandler zu gering ist muss direkt auf die Hardware des Arduino zugegriffen werden.

-> 1 Modul, Wirkungsgrad ~90%, sicheres Laden

Code für Stepup mit Arduino 2009:

Code:
// Sketch for Elektor Design Tip 090894-I
// Arduino step-up converter
//
// CPV, 25/11/2009

#define TIMER_CLK_STOP    0x00  /* Timer stopped */
#define TIMER_CLK_DIV1    0x01  /* Timer clocked at F_CPU */
#define TIMER_CLK_DIV8    0x02  /* Timer clocked at F_CPU/8 */
#define TIMER_CLK_DIV64   0x03  /* Timer clocked at F_CPU/64 */
#define TIMER_CLK_DIV256  0x04  /* Timer clocked at F_CPU/256 */
#define TIMER_CLK_DIV1024 0x05  /* Timer clocked at F_CPU/1024 */

#define VREF  (5.0) /* volt */
#define VREF_FIDDLE  (0.07) /* volt, to correct for resistor precision problems etc. */
#define VRATIO  (22.0/(82.0+22.0)) /* Vadc/Vout, these are the feedback resistor values in kOhm */

const int gate = 11; // Gate drive pin (PWM).
const int feedback = 0; // Vout measure input.
int vout = 0;
int vout_average = 0; // For debug/feedback only.
int vtarget = 0;
const int hysteresis = 3;
int pwm = 1;

#define PRESCALE  25 /* times 10 ms */
int prescale = 0;


// Not used, for completeness sake only.
float adc_to_vout(int adc)
{
  return ((float)adc*(VREF+VREF_FIDDLE))/(1023.0*VRATIO);
}


// Convert an output voltage to an ADC value.
// Calculations are done in ADC values (int), not volts (float).
int vout_to_adc(float volt)
{
  return (int)((volt*VRATIO/(VREF+VREF_FIDDLE))*1023.0);
}


void setup()
{
  // Setup serial port for control & debug.
  Serial.begin(9600);

  // Pins default to inputs, so we only have to setup this one.
  pinMode(gate,OUTPUT);

  // Here are some instructions that write directly to registers.
  // The goal is to set the PWM frequency as fast as possible
  // and to activate the right output(s).
  TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(TIMER_CLK_DIV1); // Set prescaler to 1.

  // Set initial output voltage to 10.0 V.
  vtarget = vout_to_adc(10.0);

  // Another direct register write.
  OCR2A = pwm; // Set duty cycle (0..255).
}


void loop()
{
  // Measure the current value of Vout.
  vout = analogRead(feedback);

  // Keep a running average of Vout (for feedback only).
  vout_average += vout;

  // Adjust PWM so that the target will be reached.
  // Use a hysteresis to prevent fast oscillations
  // around the target value.
  if (vout>vtarget+hysteresis) pwm -= 1;
  else if (vout<vtarget-hysteresis) pwm += 1;
  OCR2A = pwm; // Update PWM.

  // Don't print Vout every time we go through the loop.
  prescale += 1;
  if (prescale>=PRESCALE)
  {
    // Print Vout to the serial monitor:
    Serial.print("vout = " );
    Serial.println(vout_average/PRESCALE);
    vout_average = 0;
    prescale = 0;
  }

  // See if a new target value came in.
  // Values should _always_ be three digits long: 000 to 240
  // The third digit is the decimal, i.e. 123 means 12.3 V.
  if (Serial.available()>=3)
  {
    // Convert 3-digit ASCII value to target voltage.
    int temp = (Serial.read()-'0')*100;  // tens
    temp += (Serial.read()-'0')*10;  // units
    temp += Serial.read()-'0'; // decimal
    if (temp>240) temp = 240; // No more than 24 V!
    // Set new target.
    vtarget = vout_to_adc(temp/10.0);
    // Show what we understood.
    Serial.print("vtarget = ");
    Serial.println(vtarget);
  }

  // Wait 10 milliseconds.
  // This way we sample at 100 Hz.
  delay(10);
}



-> Schaltung hierzu in Elektor 7/8 2010

Viele Grüße

Jörg
Logged

Mein erstes Tutorial für Anfänger:

youtube.com/watch?v=mRwV4UxsSGI

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@uwefed
Ja, habe den Fehler bemerkt, der Widerstand im Spannungsteiler hat einen Wert von 32,4 kOhm.  (Der Schaltplan für den jetzt von mir Benutzten Laderegler war noch  Handgezeichnet und da habe ich mich wohl beim Übertragen verlesen…) Danke für den Hinweis.

Zum Gate-Widerstand: 
Quote
* Den MOSFET kann man natürlich mit jedem logic-level Typen austauschen, natürlich müssen die Werte für die entsprechende Leistung passen. In meiner z.Zt benutzten Schaltng habe ich zwischen Gate und Arduinoport noch ein 56 Ohm Widerstand geschaltet.

Als Laie hatte ich dazu vorher bei mikrocontroller.net einiges gelesen und da wurde immer wieder heftig diskutiert  ob Gate-Widerstand oder nicht.  Deshalb die Schaltung ohne. Jetzt habe ich einen 10 Ohm Widerstand zwischen Gate und arduino d6 eingezeichnet. Werde es dann auch bei meinem Laderegler so umsetzen. (Der z.Zt. genutzte hat den Widerstand noch nicht und bisher keine Probleme)

Ja,  zweiter Fehler: es  fehlt eine Rückstromdiode. Habe die jetzt auch eingezeichnet und so müsste es funktionieren!?

Das mit dem dumpload (z.Zt zwei 12V  Tauchsieder , je 200W parallel in 30L Kanister mit Wasser)  habe ich unter #11 schon erklärt,  schließt man ein Windrad (in meinem Fall max. 300W) an, dann ist er unbedingt notwendig!  Ist nur eine zweite Variante, da ich Windrad und Solarzellen parallel betrieben habe.

Das verstehe ich nicht:
Quote
* Im zweiten Schaltbild ist der MOSFET richtig gepolt aber erklärst Du mir bitte wie ein Tauchsieder in einem Auto funktionieren soll...

Ich habe das so verstanden, dass flomei den Akku bei Standzeiten des Autos (Garage/Carport/Hof) laden will und Solarzelle wie auch der Laderegler Stationär sind. Dann stört doch auch kein Tauchsieder im Wasserkanister? Ladekabel einfach an den Akku...

Quote
Bei 18V wären 0,6 Ohm Tauchsieder 30A; bei 12V immernoch 20 A.

Der dumpload sollte möglichst niederohmig sein damit die gesamte überschüssige Leistung bei Erreichen der Akkuschlussspannung abgeleitet und der Akku nicht mehr geladen wird. Bei ca. 18 Vmax und  2,25 A 40,5 (W max = Herstellerangaben für die sahara ausgelegt) kann der dumpload natürlich kleiner ausfallen.

Quote
30 A bei 18V Solarzelle wären das 540W also eine Solarpannel zwischen 4 und 5 Quadratmeter.

Ja, wenn ich 5 Quadratmeter Solarpaneel mit  der  angenommenen  Leistung  installiere und damit nur  einen unterdimensionierten Akku laden will, dann muss ich den Überschuss „verheizen“ oder die Solarzellen irgendwie vom Akku trennen, sonst wird er überladen und man kann ihn entsorgen. Deshalb sollte Solarpaneel und Akku so dimensioniert sein, dass möglichst wenig Energie „verheizt“ oder nicht genutzt wird. Trotzdem muss ich das Überladen verhindern.

In verschiedenen Solarforen werden Ladereglerschaltungen  vorgestellt, die ähnlich funktionieren und bei Ladeschluss die Energie einfach verheizen.  Bei 2x20W max (die Flomei jetzt hat) ist das doch nicht viel. Die Energie wird bei Ladeschluss eh nicht mehr genutzt.

Natürlich will flomei nur mit Solarzellen laden, deshalb Schaltung 01 mit entsprechender sketch-Version.

Gruß Klaus

Hier nun die überarbeiteten Schaltungen:





Logged

Pages: [1] 2   Go Up
Jump to: