Steuerung 2.0
In den Vergangenen Wochen hatte ich mal wieder etwas Zeit zu basteln. Das Layout des "Steuerkastens" hat sich geringfügig geändert, die meiste Arbeit floss in die Steuerplatine 2.0. Diese ist ein bisschen eskaliert, aber unterm Strich nun eine Super-Sache mit tatsächlich sehr geringem Budget-Aufwand.
Mal der Reihe nach Anfangen
Neues Layout
In Summe besteht mein Schaltschrank nun aus folgenden Komponenten, die ich - denn ich glaube das ist der finale Stand - nun auch wieder etwas ordentlicher verbaut und verkabelt habe.
Hier noch einmal Zusammenfassend die Komponenten die jetzt zum Einsatz kommen:
1.) Anschluss-Terminal für die Windturbine
2.) Klemmleisten 230V
3.) SUN-2000 Inverter, über Firmware umgestellt auf "24-60V"
Steht bei dem von MarsRock tatsächlich drauf SUN-2000 (-WAL G2...)? Scheint nämlich einige äußerlich sehr ähnliche zu geben, mit Preisen im Netz zwischen 275 bis 450 EUR, sogar noch mehr, bei vermutlich längerer Händlerkette. MarsRock scheint immerhin ein Hersteller zu sein. Können die bezüglich EN4105 mit einem "Einheitenzertifikat" und einem Netzausfall-Zertifikat (NA-Zsertifikat) dienen?
Kommt der WR mit Domp Load Widerstand, mit WiFi auch?
4.) 14V Gleichstrom Netzteil
Eine Notstromversorgung im Sinne USV wäre vermutlich sinnvoll.?
5.) Zwei handelsübliche Sicherungsautomaten (Bremse und Inverter-Verbindung)
Wenn mit Bremse die Dump Load gemeint ist, so wäre ne Si direkt in diesem Kreis eher schlecht.
Wo überhaupt ist die Dump Load?
6.) Shelly PM 2: Verbrauchs- und Produktionsmessung, Fernsteuerung der Bremse und Inverter-Verbindung.
7.) Shelly H&T: Temperatur und Feuchtigkeitsüberwachung (Steuerkasten hängt draußen)
Innen-Temp. vom Schaltkasten? Was erfolgt, wenn die zu hoch wäre?
8.) Raspberry PI 3 - übernimmt diverse Aufgaben, mehr dazu unten.
9.) ABB ESB25-04N-06 25A ("Öffner") - Wenn unter Strom hält er die Generator-Kurzschluss-Bremse geöffnet.
10.) ABB ESB25-40N-06 25A ("Schließer") - Wenn unter Strim hält er die Inverter-Generator Verbindung geschlossen.
A) Unter Strom (Netz) hat der WR die Bremse (n) immer offen, und schließt die bei Netzausfall. Ob nun direkt dadurch oder erst, wenn der Generator Überspannung liefert, da bin ich überfragt.
B) Gerade bei Netzausfall muss die Verb. zum WR gewährleistet sein, sonst kann Dump Load bzw. übergeordenter Gen.-Kurzschluss nicht wirken!
11.) Steuer-und-Überwachungs-Platine 2.0
Steuerplatine 2.0
Hier floss die letzten Wochen etwas Arbeit hinein - aber das Ergebnis ist eine Eierlegende Wollmilchsau wie ich sie mir vorgestellt habe. Das ganze wirkt auf den ersten Blick furchtbar komplex - Ist aber historisch gewachsen und jeder "Teilbereich" ist mehr oder weniger einfach und getrennt operabel.
Folgende Aufgaben werden von diesem Platinchen in Verbindung mit dem Raspberry/Shelly Uni übernommen:
Messung Inverter VDC
Das Shelly unterstützt über den ADC-Input nur Spannungen bis 30V. Daher habe ich einen Spannungsteiler aus 2* 50kOhm Widerständen eingebaut, und messe mit dem Shelly zwischen den Widerständen - in diesem Fall muss ich dann die gemessene Spannung mal 2 nehmen. (da beide Widerstände gleich sind)
Messung Windgeschwindigkeit
Mit der Möglichkeit "Sekündlich" die Drehzahl und VDC Werte auslesen zu können, war mir die bisherige Wetterstation mit einem Messwert alle 45 Sekunden ein Dorn im Auge. Ich habe mir daher ein Wetter-Stations-Set bestellt, deren Sensoren Kabelgebunden und ohne viel Schnickschnack auswertbar sind.
Die Windgeschwindigkeit ist furchtbar leicht auszulesen: Das Anemometer erzeugt pro Umdrehung einen Pulse - ein Pulse pro Sekunde entspricht 2.4 km/h - der Rest ist ein "simpler Dreisatz".
Versuche mal, auf m/s um zu arbeiten, denn damit arbeiten wir in der Windkraft.
Oder noch ne Parallelanzeige in m/s.
Das Raspberry läuft hierzu auf dem jeweiligen GPIO im Interrupt-Modus, zählt mit und rechnet.
Für die Logik habe ich eine "justierung" des Zählers angewandt (ebenso beim RPM Auslesen):
- Gestartet wird damit, die Zeit zwischen 2 Pulsen zu messen.
- Liegt dieser Wert UNTER 1000ms, wird das "Zählziel" um 1 erhöht, beim nächsten Messzyklus werden also 2 Pulse gezählt / gemessen, bevor gerechnet wird.
- Liegt dieser Wert ÜBER 1000ms, wird das "Zählziel" um 1 erniedrigt (minimum 1, logisch)
Dadurch erreiche ich, dass ich nicht unnötigerweise 15-20 Messwerte pro Sekunde generiere, sondern meinem Bedrüfnis entsprechend "etwa" einen. Dadurch nimmt auch die Beständigkeit zu, denn es ist leichter die ms zwischen 20 impulsen zu zählen, als dies 20 mal für den selben Zyklkus auszurechnen. (Weniger Schwankung)
Code
2023-02-02 11:56:10, es.gardencontrol.gpio.concrete.AnemometerGPIO: 5 turns: 896ms => rpm: 334.82 => 13.39 km/h
2023-02-02 11:56:11, es.gardencontrol.gpio.concrete.AnemometerGPIO: 6 turns: 943ms => rpm: 381.76 => 15.27 km/h
2023-02-02 11:56:12, es.gardencontrol.gpio.concrete.AnemometerGPIO: 7 turns: 1212ms => rpm: 346.53 => 13.86 km/h
2023-02-02 11:56:13, es.gardencontrol.gpio.concrete.AnemometerGPIO: 6 turns: 1064ms => rpm: 338.35 => 13.53 km/h
2023-02-02 11:56:14, es.gardencontrol.gpio.concrete.AnemometerGPIO: 5 turns: 796ms => rpm: 376.88 => 15.08 km/h
2023-02-02 11:56:15, es.gardencontrol.gpio.concrete.AnemometerGPIO: 6 turns: 860ms => rpm: 418.6 => 16.74 km/h
2023-02-02 11:56:16, es.gardencontrol.gpio.concrete.AnemometerGPIO: 7 turns: 1006ms => rpm: 417.5 => 16.7 km/h
2023-02-02 11:56:17, es.gardencontrol.gpio.concrete.AnemometerGPIO: 6 turns: 1045ms => rpm: 344.5 => 13.78 km/h
2023-02-02 11:56:18, es.gardencontrol.gpio.concrete.AnemometerGPIO: 5 turns: 868ms => rpm: 345.62 => 13.82 km/h
2023-02-02 11:56:19, es.gardencontrol.gpio.concrete.AnemometerGPIO: 6 turns: 1116ms => rpm: 322.58 => 12.9 km/h
2023-02-02 11:56:20, es.gardencontrol.gpio.concrete.AnemometerGPIO: 5 turns: 1121ms => rpm: 267.62 => 10.7 km/h
Messung Windrichtung
Die Windrichtung zu messen war etwas aufwändiger: Der Wind-Richtungssensor besteht intern aus 8 REED-Schaltern (Magnet-Schalter) und jeder ist mit einem gewissen Widerstands-Wert beschalten. An der Achse befindet sich ein Magnet, der je nach Richtung 1 oder 2 Reed-Schalter auslöst.
Damit ergeben sich 16 verschiedene Widerstandswerte, die der Sensor annehmen kann.
In Verbindung mit einem "bekannten" Widerstand im Spannungsteiler (hier 10k) und der gemessenen Spannung kann man damit nun sagen: "Ok, der Sensor hat jetzt gerade 2740 ohm - d.h. er zeigt in Richtung 75°"
Das Messen der Spannung erfolgt über einen 15bit ADC-Wandler, der mit dem Raspberry über den I2C-Bus kommuniziert.
Anmerkung:
Zu Begin hatte ich das Problem - Versorgung des Sensors mit 5V - , dass Zwei Werte immer eine identische Anzeige lieferten: 32767 digits. Dann habe ich "bemerkt", dass dies genau 2^15-1 ist, also den Maximal-Wert des 15bit AD Wandlers darstellt.
Das heißt: Obwohl der Sensor mit 5V gespeist wurde, ergab sich eine gemessene Spannung von über 5V (Antennen-Effekte vermutlich)
Lösung war den AD-Wandler bei 5V Versorgung zu lassen, aber den Sensor nur noch mit 3V zu versorgen. Das verschenkt ein wenig Messbereich - Aber ist unterm Strich hinreichend genau und die beiden Werte die vorher ins maximum liefen sind nun unterschiedlich.
Auch hier ist dann die Auswertung nur ein wenig Rechnen / Übersetzen.
Messung Drehzahl
Die Messung der Drehzahl ist sehr gut geworden. Wie von CHE vorgeschlagen habe ich mich entschieden einfach die Wechselstromfrequenz der Turbine auszuwerten statt irgendwelcher externe Messgeräte anzubringen. Zwar kann man sich für wenige Euro "fertige" Frequenzmesser kaufen - aber der Weg war Teil des Ziels, wollte ich selbst machen
Zumindest mit Multimetern incl. Messzangen ist es mir noch nie gelungen, bei WEA in Betrieb die Frequenz richtig an zu zeigen.
Liegt daran, dass nacheinander alle enthaltenen Frequenzen detektieren, und nicht die Null-Durchgänge auswerten.
Auf die ganz genauen Berechnungen kann ich hier schwerlich eingehen, das würden Rahmen dieses Posts etwas sprengen - aber das Grundprinzip versuche ich best möglich zu erklären.
Die Aufgabe bestand im Prinzip darin:
Wie verwandle ich den Drehstrom (0-150V; 0-??? Hz) in ein 0-3V DC Signal, das vom Raspberry gezählt werden kann?
Die Spannung 2er Phasen sieht im Prinzip erstmal so aus, wie man es kennt: L1 und L2 sind um 120° Phasenverschoben:
Betrachtet man nun die "Differenz" dieser Signale ergibt sich folgende Kurve. Etwas verschoben, etwas skaliert, aber im Grunde vom Verlauf identischer informations-gehalt.
Genügt nicht auch einfach nur der Sinus zwischen 2 Phasen, also z.B. L1 und L2?
Bei diesem Signal habe ich nun durch eine Diode dafür gesorgt, dass nur noch die Hälfte übrig bleibt. Es hat sich der "Negative" Anteil ergeben, aber das Spielt für die Auswertung keinerlei Rolle:
Mit diesem Signal - und einem passenden Vorwiderstand von 35kohm - triggere ich nun einen Optokoppler, der das konstante 3V Signal des Raspberries schält. Herraus kommt eine wunderschöne Rechteck-Kurve - wie aus dem Lehrbuch - deren Frequenz der Frequenz des zu grundeliegenden Drehstroms entspricht:
Erstaunlich, dass die LED im Optokoppler von wenigen Volt bis 150 mit spielt. Ich hätte da vorgelagert noch ne Z-Diode gehabt, damit die LED die Funktion nicht gänzlich übernehmen muss.
Null-Durchgänge detektieren hätte ich wahrscheinlich mit einem Komperator gemacht, aber wenn es auch so geht, gut.
Der Rest ist nun wieder ein bisschen Mathematik, wobei ich mir bei der
Multiplikation bzw. Teilung noch nicht ganz 100% Sicher bin - vielleicht hat hier jemand ja input dazu?
- Die Ista besitzt 12 Magnete auf dem Rotor, die abwechselnd angeordnet sind.
- Das bedeuted, pro vollständiger Umdrehung erlebt eine Phase 12 mal eine Pol-Umkehr, erzeugt damit 12 Halbwellen - oder eben 6 komplette Wellen.
Ja, dürfte stimmen.
d.h. (??):
Dreht sich die Ista-Breeze mit 1 Umdrehung pro Sekunde, erhalte ich 6 Impulse.
Dreht sie sich z.b. mit 500 rpm sind das 8,333 Umdrehungen pro Sekunde - und bei 6 Impulsen also ganz genau 50Hz
(Das erscheint mir zumindest plausibel - Rechnerisch und Physikalisch)
Das auch.
Analog dem oben beschriebenen Zählverfahren skaliert das Raspberry wieder rauf und runter, wieviele Impulse gezählt werden müssen, bis "gerechnet" wird.
Gelegentliche Ausreißer gibt es in folgendem Beispiel noch - da diese aber komplett daneben sind, deuted das für mich eher
auf ein noch vorhandenes "Code-Problem" hin - Ich vermute, dass hier zu zeitgleich zweimal die Auswertung getriggert wird,
und der Zweite Durchlauf daher die absurde Zeit von wenigen Millisekunden für das aktuelle Zählziel annimmt - und ensprechend eine hohe Drehzahl errechnet.
Ausreißer: Es gibt auch Störstrahlung.? Verschiedene Quellen sind möglich.
Code
2023-02-01 23:41:02, es.gardencontrol.gpio.concrete.WindTurbineRPMGPIO: 16 pulses: 293ms => rpm: 546.08
2023-02-01 23:41:02, es.gardencontrol.gpio.concrete.WindTurbineRPMGPIO: 17 pulses: 272ms => rpm: 625.0
2023-02-01 23:41:02, es.gardencontrol.gpio.concrete.WindTurbineRPMGPIO: 18 pulses: 25ms => rpm: 7200.0
2023-02-01 23:41:03, es.gardencontrol.gpio.concrete.WindTurbineRPMGPIO: 19 pulses: 300ms => rpm: 633.33
2023-02-01 23:41:03, es.gardencontrol.gpio.concrete.WindTurbineRPMGPIO: 20 pulses: 290ms => rpm: 689.66
Auch mein "Excel-Sheet" das diese Daten auswertet ist nun mittlerweile auf einen möglichen Sekunden-Takt umgestellt... JETZT fehlt mir nur noch der Wind aus der passenden Richtung oder der finale Mast, damit das "Tal-Problem" behoben ist und ich die ersten Auswertungen aller Parameter auf sekündlicher Ebene betrachten kann
Leider hier auch schön zusehen: Wenn "kurz" die Windgeschwindigkeit einbricht, fällt die Turbine zurück ins angesprochene Tal, damit auch sofort die Drehzahl - und schleicht sich dann wieder in den Stillstand.
Hast Du 3 oder 5 Blätter?
Was fehlt ist aus meiner Sicht ein händischer Gen.-Kurzschluss. Da brauchts anschließend keine Trennschalter mehr
MPPT steht auf dem WR-Gehäuse drauf. Aber wohl nur bei Einstellung für PV wirksam, oder?
Wenn das so ist, welche Kennlinie hast Du genommen?
Momentan is mir aber zu kalt und zu Nass, da was zu machen