Hallo, mit einem STM32f429 generiere ich eine 20kHz PWM im center alligned mode. Im Augenblick "synchronisiere" ich die PWM mit einer Nulldurchgangserkennung. D.h. der positive Nulldurchgang des 50 Hz Sinus generiert mir einen Input Capture Interrupt. Hier wird der Counter der PWM getriggert auf null gesetzt, die Zeit zwischen zwei Nulldurchgängen gemessen, der Top-Wert für die PWM berechnet und ins ARR-Register geschrieben. Das Funktioniert soweit recht akzeptabel. Dennoch eilt die PWM erwartungsgemäß vor oder nach, weil der Timer-Takt so gut wie nie synchron mit den 50Hz ist. Perfekt synchron soll es aber sein. Die einzige mir mittlerweile bekannte Methode, soll eine mit den 50Hz synchrone PLL sein, deren Takt ich als externen CLK für die PWM nutzen könnte. Das sollten am besten 80MHz oder mehr sein. Wie kann ich eine solche PLL realisieren? Bisher habe ich kein konkretes Beispiel gefunden und weiß nicht, wie ich die Lösung angehen soll. Reichen dafür ein paar OPVs und ein Quarz aus? Oder kann der STM so etwas von Hause aus? Dank im Voraus! Christof
:
Bearbeitet durch User
Danke fürs Steinchen. Gibts das auch schneller?
> den Rest kann die interne PLL machen.
Meinst Du damit, der uC soll seine Freq von den 50Hz beziehen, oder
gibts noch andere interne Möglichkeiten?
Der uC soll unbedingt unabhängig takten, weil die 50Hz nicht immer
anliegen und er trotzdem weiter arbeiten muss.
:
Bearbeitet durch User
Kannst Du nicht den internen Oszillator verwenden und solange an der Clock Kalibrierung drehen bis Du zwischen den Nulldurchgängen einen konstanten Timerwert bekommst ?
Christof K. schrieb: > mit einem STM32f429 generiere ich eine 20kHz PWM im center alligned > mode. > Im Augenblick "synchronisiere" ich die PWM mit einer > Nulldurchgangserkennung. D.h. der positive Nulldurchgang des 50 Hz Sinus > generiert mir einen Input Capture Interrupt. Du willst also in eine 50Hz Periode exakt 400 der 20kHz Perioden unterbringen? Und dann im Idealfall deren beiden Nulldurchgänge exakt gleich haben? Wie zuverlässig und genau ist denn die Erkennung des 50Hz-Nulldurchgangs? Jittert diese Nulldurchgangserkennung? Können Störungen auf dem Netz die Nulldurchgangserkennung ins Stolpern bringen?
:
Bearbeitet durch Moderator
Du willst so was ähnliches machen wie gängige Solarinverter? d.h. Zu einem Eingangssignal einen phasengleichen Sinus erzeugen. Dieser soll Phasen, Spannungssprünge u.s.w sicher ausbügeln aber nur in einem relativ kleinem Bereich der Eingangsfrequenz regeln? Dazu gibt es bei TI eine in meinen Augen sehr gute Softwarelib (Solarpower). In etwa hier zu finden: http://www.ti.com/tool/controlsuite Das sind auch mehrere Methoden einer PLL beschrieben incl. Mathlab - Modell und Code. Da du einen f4 mit FPU verwendest kannst du die darin enthaltenen float Routinen benutzen. Bei allem anderen ist Festkomma angesagt und man muss sich da erst einmal die Grundlagen schaffen, da der Code eigentlich für die C2000 Chips gemacht ist.
Du musst die PWM Frequenz verstellen. Wenn du parallel mit der PWM eine ADC Messung der Netzspannung machst kannst du mit diesen Informationen die Phase zwischen der Netzfrequenz und deiner PWM Frequenz bestimmen. Nachzulesen in: "Grid Converters for Photovoltaic and Wind Power Systems" findest du im Internet wahrscheinlich auch als PDF wenn du dir das Buch nicht gleich kaufen möchtest. MfG Michael
Anbei mal ein Beispiel für einen 50/60Hz Phasenschieber zur Brummkompensation auf nem ATtiny25. Der Timer T0 mißt die Frequenz und T1 gibt sie verschoben als PWM aus. Man sieht beim Einschalten schön, wie die PLL langsam einrastet.
Michael K. schrieb: > Kannst Du nicht den internen Oszillator verwenden und solange an der > Clock Kalibrierung drehen bis Du zwischen den Nulldurchgängen einen > konstanten Timerwert bekommst ? --> > Auch zu beachten: das Netzt hat nicht exakt 50Hz: Lothar Miller schrieb: > Du willst also in eine 50Hz Periode exakt 400 der 20kHz Perioden > unterbringen? Ja. 20kHz oder ähnlich. Am liebsten ist mir eine Anzahl Perioden die ganzzahlig durch drei teilbar ist. > Und dann im Idealfall deren beiden Nulldurchgänge exakt > gleich haben? Das wäre natürlich das Optimum! > Wie zuverlässig und genau ist denn die Erkennung des > 50Hz-Nulldurchgangs? Gute Frage. Noch fehlt mir ein DSO um das genau zu bestimmen. Am analogen Oszi sieht es recht genau aus. Der uC gibt mir bei Nichterkennung eines Nulldurchgangs einen Fehler aus - das war bisher noch nicht der Fall. Die Schaltung habe ich angehängt. C2 Soll als Filter dienen (statt Hysterese), C1 soll die Phasenverschiebung von C2 und die Laufzeit OPV/uC kompensieren. Wobei ich bzgl Toleranzen, Alterung etc nicht sicher bin, ob das eine gute Idee ist. >Jittert diese Nulldurchgangserkennung? Die Nulldurchgangsmessung ergibt am uC zwischen 50,046 und 49,988Hz. Es wird eine sehr stabile Frequenz gemessen. Siehe unten. > Können Störungen auf dem Netz die Nulldurchgangserkennung ins Stolpern bringen? Ja? Wahrscheinlich kannst Du das besser beantworten. Später soll netzseitig ein EMV/Tiefpassfilter vorhanden sein. Im Augenblick simuliere ich drei Phasen mit einem Selbstbauwechselrichter mit eingestellten 6Vpp, ca. 50Hz (dafür stabil) und kleinen Sinusfiltern 2.Ordnung. Hieran erfolgt meine Messung. Ans echte Netz möchte ich am liebsten noch lange nicht. Als Ziel habe ich einen 3 Phasen Gleichrichter mit aktiver PFC und Buck-/Boost-Funktion. Das liegt aber noch in den Sternen.
Christof K. schrieb: >> Jittert diese Nulldurchgangserkennung? > Die Nulldurchgangsmessung ergibt am uC zwischen 50,046 und 49,988Hz. Das sind somit von 19981 us bis 20005 us und damit ein Jitter von 23 us. Bezogen auf die 50 us einer kompletten 20 kHz Periode sind das 50% Abweichung durch den Jitter. Da wird wohl eine Filterung nötig werden...
Die Netzfrequenz ändert sich doch ständig, wenn auch nur minimal... wie erfolgt denn die Nachführung? So wie ich es bisher verstanden habe soll nur einmal genau gemessen werden und diese Frequenz dann als Referenz genommen werden.
Christof K. schrieb: >> Auch zu beachten: das Netzt hat nicht exakt 50Hz: Wikipedia: Im Normalfall sind diese Abweichungen im westeuropäischen Verbundnetz minimal und bewegen sich unter 0,2 Hz. Du versuchst Dich ja in Vorhersage wo der nächste Nulldurchgang sein wird und das wird bei einer leicht schwankenden Freq. nie 100% exakt sein. Muss es das denn aus Schaltungstechnischer Sicht sein, oder legts Du Dir die Latte grade etwas hoch auf ? Ohnehin musst Du mit starken Ereignissen rechnen die Dir total die Synchronisation verhauen. Spikes z.B. aber nicht nur. Bei Schaltaktionen am Netz gibt es kurze Ausfälle, Phasensprünge und schlimmeres, das muss Deine Schaltung aushalten. Ich habe mal netzsynchrone LED Matrix Reihen- / Parallel-Umschaltung gemacht um in einem großen Cluster keinen PFC zu benötigen. Ein Fiasko, hat mit sauberem Netz prima funktioniert und war durch jeden Hühnerkram aus dem Tritt zu bringen. Habe das Gebastel dann abgebrochen und einen konventionelleren Ansatz verfolgt.
Lothar M. schrieb: > Da wird wohl eine Filterung nötig werden... Meinst Du damit eine zusätzliche Filterung der Messgröße? Wie könnte ich noch einen geringeren Jitter erreichen? Tcf Kao schrieb: > Die Netzfrequenz ändert sich doch ständig, wenn auch nur minimal... wie > erfolgt denn die Nachführung? So wie ich es bisher verstanden habe soll > nur einmal genau gemessen werden und diese Frequenz dann als Referenz > genommen werden. Es soll die PWM-Frequenz aus der Netzfrequenz bezogen werden...wenn das überhaupt sinnvoll geht.
Michael K. schrieb: > Du versuchst Dich ja in Vorhersage wo der nächste Nulldurchgang sein > wird und das wird bei einer leicht schwankenden Freq. nie 100% exakt > sein. Hier hast Du sicherlich recht, und das verursacht bei mir erst recht Kopfschmerzen. > Muss es das denn aus Schaltungstechnischer Sicht sein, oder legts Du Dir > die Latte grade etwas hoch auf ? Hier magst Du wohl recht haben. Jedoch hatte ich mit der "exakten" Nulldurchgangsbestimmung und einer netzsynchronen PWM eine möglichkeit mehr zu erkennen, wie sich die drei Leiter gerade verhalten... Denke ich zumindest. Zudem soll von vornherein die Möglichkeit zur Rückspeisung im System berücksichtigt werden. Dafür muss ich doch Netzsynchron arbeiten. Oder nicht? > Ohnehin musst Du mit starken Ereignissen rechnen die Dir total die > Synchronisation verhauen. Spikes z.B. aber nicht nur. > Bei Schaltaktionen am Netz gibt es kurze Ausfälle, Phasensprünge und > schlimmeres, das muss Deine Schaltung aushalten. Ja, wie gehen denn Profis beim Schaltungsentwurf damit um? >Ein Fiasko, hat mit sauberem Netz prima funktioniert und war durch jeden > Hühnerkram aus dem Tritt zu bringen. > Habe das Gebastel dann abgebrochen und einen konventionelleren Ansatz > verfolgt. Glaube ich Dir. Soll ich deswegen am besten aufgeben? Was wären die Alternativen? Hatte die Messschaltung vorhin vergessen. Hier die Variante für 6Vpp.
Schau Dir einfach mal meinen Code an. Der PWM-Takt wird durch die CPU bestimmt (64MHz Takt = 250kHz PWM). Es reicht ja, daß die PWM-Setzwerte mit den 50Hz synchron sind. Und als Filter regele ich einfach den Timerreloadwert um max +/-1 Takte nach. Das ergibt einen schönen Tiefpaß und ist unempfindlich gegen Störungen. Wenn man die 50/60Hz Erkennung nicht braucht, kann man den Fangbereich stärker eingrenzen und die PLL regelt schneller ein.
Peter D. schrieb: > Schau Dir einfach mal meinen Code an. > Der PWM-Takt wird durch die CPU bestimmt (64MHz Takt = 250kHz PWM). Es > reicht ja, daß die PWM-Setzwerte mit den 50Hz synchron sind. > > Und als Filter regele ich einfach den Timerreloadwert um max +/-1 Takte > nach. Das ergibt einen schönen Tiefpaß und ist unempfindlich gegen > Störungen. > Wenn man die 50/60Hz Erkennung nicht braucht, kann man den Fangbereich > stärker eingrenzen und die PLL regelt schneller ein. Ehrlich gesagt, versuche ich gerade Deinen Code zu verstehen, was mir bisher nicht gänzlich gelungen ist. Bliebe dann noch das Problem, dass die Nulldurchgangserkennung den erwähnten Jitter hat. Oder stehe ich gerade ganz auf dem Schlauch?
Christof K. schrieb: > Ehrlich gesagt, versuche ich gerade Deinen Code zu verstehen, was mir > bisher nicht gänzlich gelungen ist. Ein Trick ist, daß T0 nur 8Bittig ist und ich daher noch einen SW-Zähler bis 3 brauchte, um die Takte bis zum Nulldurchgang zu zählen. Die CPU arbeitet mit 8MHz, dadurch ergeben sich die: 8MHz / 50Hz / 256 = 625
Christof K. schrieb: > Bliebe dann noch das Problem, dass die Nulldurchgangserkennung den > erwähnten Jitter hat. Oder stehe ich gerade ganz auf dem Schlauch? Sie unterscheidest du denn zwischen deinem hausgemachten Jitterproblemen und dem Jitter den das Netz sowieso mit sich bringt? Ich habe mich auch durch viele AppNotes der Hersteller gelesen. In einer von Microchip wir einfach immer die Zeit der letzten Halbwelle gemessen und mit dieser Zeit als Führungsgröße die aktuelle Halbwelle ausgegeben. Ob das durch ändern der PWM Frequenz oder bei fester PWM durch direkte Berechnung erfolgt ist erst mal egal. Nötig ist da aber noch einiges mehr um auf Fehler zu reagieren. In der verlinkten Lib von TI ist ein Phasensprung innerhalb von 30ms ausgeregelt. Hier nochmal der Link auf eine Beschreibung des ganzen: http://www.ti.com/lit/an/sprabt3/sprabt3.pdf Auf einem F4 sicherlich der bessere Ansatz. Ich habe das mal auf einem F334-Nucleo probiert. Die SOGI-PLL mit float braucht da ca. 8.8µs, die Notch SPLL mit float 3.2µs und mit int32 5µs. Das sind Werte die bei 20KHz noch genügend Spielraum für den Rest lassen.
@Peter Ich sehe in Deinem Code immer noch keinen Zusammenhang der Messung mit dem Timer 1, außer dass das OCR1A im Compare Interrupt des Timer 0 beschrieben wird. temp schrieb: > Christof K. schrieb: >> Bliebe dann noch das Problem, dass die Nulldurchgangserkennung den >> erwähnten Jitter hat. Oder stehe ich gerade ganz auf dem Schlauch? > > Sie unterscheidest du denn zwischen deinem hausgemachten Jitterproblemen > und dem Jitter den das Netz sowieso mit sich bringt? Grundsätzlich eine berechtigte Frage! Zumindest im Augenblick erzeuge ich aber meine 50 Hz ja (wahrscheinlich recht stabil) selbst. > In der verlinkten Lib von TI ist ein Phasensprung innerhalb von 30ms > ausgeregelt. Hier nochmal der Link auf eine Beschreibung des ganzen: > http://www.ti.com/lit/an/sprabt3/sprabt3.pdf > Auf einem F4 sicherlich der bessere Ansatz. Ich habe das mal auf einem > F334-Nucleo probiert. Die SOGI-PLL mit float braucht da ca. 8.8µs, die > Notch SPLL mit float 3.2µs und mit int32 5µs. Das sind Werte die bei > 20KHz noch genügend Spielraum für den Rest lassen. Wusste gar nicht, dass der STM32f4 eine FPU hat. Werde jetzt versuchen das Dokument zu verstehen. Der C2000 wurde mir bereits in einem anderen Thread empfohlen. Wahrscheinlich werde ich bald ein Board damit bestellen.
:
Bearbeitet durch User
Christof K. schrieb: > Soll ich deswegen am besten aufgeben? Nein, aber damit leben das Du den Nulldurchgang leicht verpasst. Weder kannst Du in Zeit 0 auf den Trigger reagieren, noch bist Du exakt mit Deiner Vorhersage. Das gibt im Nulldurchgang minimale Verzerrungen, aber da ist Strom und Spannung ohnehin fast 0, also was solls. Dann muß Du erkennen wenn Du krass daneben liegst und das zu abnormen Strömen führt. Da geht man vom Netz, sucht neu die Synch und fährt wieder hoch. Kommt ja so oft nicht vor. Das natürlich in Hardware weil ja auch die MCU mal abkoffern kann ohne das gleich die Funken fliegen sollen. Als Erkennung kannst Du einfach mit großem R auf einen geclampten INT Eingang gehen. Wird die Spannung größer logisch 1 gibt es einen IRQ. Da kannst Du auch noch eine Zeitkonstante von Abziehen wenn es etwas genauer werden soll. Du musst nicht alles in dem Zyklus berechnen und ausführen in den Du gemessen hast, das kannst du auch ein paar Zyklen später machen und davon ausgehen das Dein System ausreichend stabil ist. Nur Überstromschutz muss schnell sein. Christof K. schrieb: > Es soll die PWM-Frequenz aus der Netzfrequenz bezogen werden...wenn das > überhaupt sinnvoll geht. Ich verstehe einfach den Grund nicht warum Du das willst ? Such Dir Deine Schaltfrequenz völlig unabhängig davon und regel duty nach der Eingangsspannung, die Du über Nulldurchgang, verstrichener Zeit und Sinustabelle bekommst. Auch Deine Reglerantwort ist ja nicht gleich da wenn Du den Duty verstellst. Du machst also eigentlich das von dem Du weist das es gleich passieren muss weil Du weist das das System das gleiche tut was es eine Halbwelle zuvor getan hat.
Michael K. schrieb: > Du machst also eigentlich das von dem Du weist das es gleich passieren > muss weil Du weist das das System das gleiche tut was es eine Halbwelle > zuvor getan hat. Schön gesagt! Zum Einspeisen würde es auch reichen einfach im PWM-Interrupt die Eingangswechselspannung zu messen und damit gewichtet die PWM zu füttern. Damit bist du immer synchron und die Modulation deiner PWM ist proportional zur Eingangswechselspannung. Das reicht zwar sicher nicht um die Normen für solche Inverter zu erfüllen, aber darum ging es hier ja nicht. Alle anderen Probleme wie Inselerkennung u.s.w müssen sowieso behandelt werden unabhängig von der Topologie.
Hmmm... Die ursprüngliche Idee für die PFC des Gleichrichters war ja, den Nulldurchgang zu bestimmen und aus der verstrichenen Zeit zu ermitteln, wo gerade die Netzspannung ist und eine Sinustabelle für die RZM "abzuklappern". Es würde nur der Nulldurchgang einer Phase bestimmt und alle anderen Phasen daraus abgeleitet. Deshalb nahm ich an, hier so präzise wie möglich sein zu müssen. Und eben die letzte Periode der PWM mit der 50Hz Periode enden zu lassen, damit möglichst kleine Stromverzerrungen auftreten. Bei einer Phase wäre ich hier tatsächlich im Nulldurchgang und Michaels Meinung nach wäre das nicht gravierend. Die beiden anderen Phasen wären hier jedoch nicht bei 0. Wenn ich Michael richtig verstehe, soll ich "irgendwie" den Nulldurchgang messen, die "bekannte" Zeit zwischen tatsächlichem Nulldurchgang und dem Interrupt in der PWM-Ausgabe berücksichtigen.
:
Bearbeitet durch User
temp schrieb: > Zum Einspeisen würde es auch reichen einfach im PWM-Interrupt die > Eingangswechselspannung zu messen und damit gewichtet die PWM zu > füttern. > Damit bist du immer synchron und die Modulation deiner PWM ist > proportional zur Eingangswechselspannung. Mittlerweile tendiere ich gerne zur Messung. Einfach ist hier relativ zur Nulldurchgangserkennung nicht gerade einfach. Und einen zeitlichen Versatz zwischen tatsächlicher Spannung, Messung und PWM-Ausgabe habe ich ja trotzdem ;) Trotzdem nahm ich auch für diesen Fall an, die PWM müsste für das beste Ergebnis synchron mit dem Netz sein.
:
Bearbeitet durch User
Christof K. schrieb: > Trotzdem nahm ich auch für diesen Fall an, die PWM müsste für das beste > Ergebnis synchron mit dem Netz sein. Womit Du recht hast, aber es lohnt nicht das bis zum Exzess zu betreiben. Auch Dein EMI Filter + Gleichrichter verursachen bereits Verzerrungen und man kann das Spiel soweit treiben das Du auch das ausgleichst. Nur nicht in dem Moment in dem das passiert sondern einen Zyklus später steuerst Du so an das eine 'Gegenverzerrung' entsteht die das aufhebt. Brachialer Aufwand und etwas für die Messtechnik, DSP und Mathe Helden unter uns. Worum es letzlich geht ist die Einhaltung der zulässigen Grenzwerte und das ist normalerweise mit viel weniger Aufwand zu erreichen.
Christof K. schrieb: > Ich sehe in Deinem Code immer noch keinen Zusammenhang der Messung mit > dem Timer 1, außer dass das OCR1A im Compare Interrupt des Timer 0 > beschrieben wird. T1 arbeitet im PWM-Mode. T0 zählt mit einem bestimmten Reloadwert, daß genau 256 Werte der Sinustabelle an die PWM ausgegeben werden. Und der Interrupt im Nulldurchgang korrigiert den Reloadwert von T0 solange, bis das der Fall ist.
:
Bearbeitet durch User
Christof K. schrieb: > Mittlerweile tendiere ich gerne zur Messung. Eingangsspannungsmessung befreit Dich von den Zeitabhänggkeiten aber das messen selbst dauert seine Zeit und Du misst alles an Netzverzerrung mit und regelst mit kleiner Verzögerung darauf herum. Das kann Schwingungen verstärken und unschöne Sache anstellen. So regeln analoge PFCs aber die sind da einfach schneller. Zudem mußt Du mit relativ hoher Auflösung messen und gerade im kleinen Spannungsbereich ist die Änderungsgeschwindigkeit sehr hoch. Der Ansatz das Netzspannung gefälligst sinusförmig zu sein hat reduziert das ganze auf die Messung des Nulldurchganges, der Zwischenkreisspannung und einer schnellen Stromüberwachung + Hardware Notabschaltung. Ist ein spannendes Thema und Deine Entscheidung erstmal von der Netzspannung fern zu bleiben solltest Du erst nach Kauf einer guten Schutzbrille revidieren.
Christof K. schrieb: > Und einen zeitlichen > Versatz zwischen tatsächlicher Spannung, Messung und PWM-Ausgabe habe > ich ja trotzdem ;) > Trotzdem nahm ich auch für diesen Fall an, die PWM müsste für das beste > Ergebnis synchron mit dem Netz sein. Der zeitliche Versatz beträgt max. genau einen PWM-Zyklus. Bei 20kHz sind das 400 Zyklen pro Vollwelle oder 0,25%. Die PWM würde dabei aber fix mit 20kHz laufen. Dadurch, dass durch die Messung bei einem Spannungseinbruch in Folge von Lastwechseln z.B die Ausgangsspannung automatisch diesem Lastwechsel folgt, wird meines Erachtens nach die Regelung des Einspeisestroms sogar einfacher. Ich habe hier bei mir im Netz einen SDM630 Zwischenzähler, der auch den Klirrfaktor der Spannung und des Stromes misst. 5% bei der Spannung und über 50% beim Strom sind da keine Seltenheit. Insofern halte ich auch die absoluten Anforderungen für nicht so dramatisch. Wichtiger ist hier wirklich eine schnelle Abschaltung bei Überströmen oder sonstigen Fehlern.
Oh man :) Michael schreibt, nach Nulldurchgang. Temp schreibt, nach Spannung. Oje :/ Was ist denn jetzt das Richtige? Den Code von Peter habe ich immer noch nicht verstanden. Vom C2000 Code bin ich völlig erschlagen. Meine eigene Nulldurchgangsanpassung schneidet mir prinzipbedingt immer den letzten Abschnitt der "letzten" PWM-Periode ab. Deswegen jetzt erstmal der Versuch einer Spannungsmessung mit Tiefpass, der einiges wegfiltert. Die Spannung am Ausgang ist um ca. -30us versetzt. Das alles laut Simulation zumindest, Bauteiltoleranzen und Alterung nicht berücksichtigt. Wie könnte ich hier die Kapazitäten über Temperatur und Zeit am stabilsten halten? Die OPVs sollen vorerst OP284 werden, da ich von denen einige hier habe. Was haltet ihr von der Schaltung? Mein STM32 hat drei ADCs. Die können ca. zwei mal während einer PWM-Periode die Strangspannungen messen. Zwischenkreisspannung und Ausgangsstrom könnte ich mit parallelen ADCs messen. So der neue Plan. Eine netzsynchrone PWM wäre mir natürlich immer noch am liebsten.
:
Bearbeitet durch User
Überleg mal. Du wählst einen digitalen Ansatz der in der Lage ist mit minimalen Informationen auf die Phasenlage und Spannung zu schliessen um Dir dann etwas darum herum zu bauen wo Dich die Bauteiltoleranzen und die Drift fertigmachen ? Bis der Wert gewandelt und ausgewertet ist und Du den Duty verändert hast ist die Spannung doch schon eine ganz andere. Du wirst Störungen in den Werten haben und totale Ausreisser ignorieren und durch Mittelwerte ersetzen müssen. Alles das in einem Affenzahn statt einfach einen viertel Sinus als Tabelle zu benutzen und da gemütlich durchzutickern. Bei der Tabellenlösung kannst Du Deine Verzugszeiten zwischen Nulldurchgangserkennung und Ausführung abschätzen und das konstant korrigieren indem Du einen 'späteren' Sinuswert aus der Tabelle nimmst. Bei der Messung addieren sich alle Zeiten auf, ohne Korrekturmöglichkeit. Beide Ansatze funktionieren und beide haben Vor- und Nachteile. Verzettel Dich nicht, nehme einen robusten Ansatz den Du am sympatischten findest und arbeite den sauber aus. Wenn es damit läuft bist Du einen riesigen Schritt weiter und kannst immern noch daran optimieren. Messe nur was Du brauchst. Die Eingangsspannung kann Dir völlig egal sein. Du hast zwei Werte die über den Duty entscheiden. Der schnelle ist die Sinuswelle, der langsame, der die volle Halbwelle gleich bleibt, ist der Fehlerfaktor zwischen gewünscher Zwischenkreisspannung und gemessener Zwischenkreisspannung. Die Sinuswelle kannst Du analog messen und aufbereiten ODER Du schaust nur auf den Nulldurchgang und zählst dann in Deiner Sinustabelle hoch. Temp sagt ersteres ist bin für letzteres. Beides wird funktionieren. Du brauchst weiterhin eine schnelle Hardwareabschaltung bei Überstrom die nur den Zustand an den STM meldet, der dann wieder die Stufe freischalten kann. Temperatur am Leistungsteil messen wäre noch schick, aber muss erstmal auch nicht sein. Alles weitere ist Luxus und kann erstmal entfallen. Die Leistungselektronik wird Dich noch viel intensiver beschäftigen als Du ahnst. Da liegen noch einige Hürden vor Dir, scheitere also nicht schon an der Ersten weil Du Die Featurelist aufbläst.
Das ist ja eine Ansage ;) Danke. Tatsächlich verliere ich mich gerne im Detail und überstrapaziere meine Fähigkeiten. Am liebsten wäre mir natürlich eine "einfache" Lösung. Die Nulldurchgangserkennung wäre ja so eine. Mir bereitet hier nur Bauchschmerzen dass meine Schaltung in dem Fall mit einer Grösse, die alle 20ms wiederkehrt, eine Vorhersage für eine sehr schnelle PWM für drei Phasen macht, die blind drauf losschaltet. Wenn zudem diese Größe gestört wird, weiss mein uC nicht im geringsten, was gerade geschieht, mindestens bis zur nächsten Periode. Aber wie Du schon sagtest, hat jede Variante ihre Vor- und Nachteile. Irgendwie suche ich wohl vergebens nach der Eierlegenden Wollmilchsau. Die Stromabschaltung behalte ich auf jeden Fall im Hinterkopf und werde sie angehen, wenn die aktuellen Fragen geklärt sind. Greift solch eine Stromabschaltung in die Treiber des Gleichrichters ein, oder schalte ich am besten Relais am Eingang des Gleichrichters?
Dann mal zum Nulldurchgang. Im Augenblick benutze ich folgende Schaltung. Jedoch habe ich einen Offset auf meinem Sinus, wodurch ich nicht beide Flanken nutzen kann. Zudem scheint die Schaltung empfindlich auf Störungen zu reagieren. Der verwendete Komparator ist ein LM393. Hat jemand eine Idee, wie ich den Offset beim Messen eliminiere und die Schaltung "robuster" gestalte? Edit: Jetzt ist der nichtinvertierendee Eingang mit einer 10n Kapazität gegen GND geschaltet und der Offset weg. Liege ich hier richtig?
:
Bearbeitet durch User
Irgendwie habe ich den Eindruck, dass das ganze Projekt eine Nummer zu groß ist für deine Kenntnisse. Kann aber täuschen, deshalb nicht als Kritik auffassen. Du sprachst am Anfang von einem STM32F4xx oder STM32F334. Wenn du diese Controller benutzen willst, würde ich keinen analogen Ansatz mit Nulldurchgangserkennung oder ähnlichen benutzen. Bei einem kleinen Controller ohne FPU muss man anders denken, keine Frage. Aber so einen Boliden sollte man auch entsprechend fordern. Deshalb alles digital. Das bedeutet für den Falls dass du nicht mit einer spll arbeiten willst in etwa: - Eine Schleife die vom PWM-Interrupt getriggert wird (oder in ihm läuft) - Eingangsspannung messen. - Anhand dieses Messergebnisses kannst du den Nulldurchgang sicher bestimmen - Wenn der Nulldurchgang erkannt wird feststellen wieviel PWM-Zyklen seit dem letzten vergangen sind. - liegt der Wert z.b. zwischen 410 und 390 bei 20khz dann ist das Plausibel. Zähler auf Null setzten sonst hochzählen. - wenn bis dahin alles ok: Mit sinf(Zaehler*2*pi/zyklen) den neuen Wert für die PWM berechnen - jetzt kann man noch diesen Wert mit dem gemessenen vergleichen um eine Plausibilitätsprüfung zu machen. Jedenfalls kann man sich hier in der Software ausferkeln ohne den Lötkolben zu schwingen. Das ist aber nur das ganz,ganz grobe Muster. Tabellen oder ähnliches sind bei einen F4 nicht mehr nötig. Wenn das ganze 3phasig werden soll, wirst du aber nicht um deutlich mehr Grundlagen herum kommen. Allein die ganzen Hardwaremodule im Controller zum Laufen zu kriegen, den ADC zu synchronisieren u.s.w. ist auch schon mal nicht an einem Abend gemacht.
temp schrieb: > Irgendwie habe ich den Eindruck, dass das ganze Projekt eine Nummer zu > groß ist für deine Kenntnisse. Kann aber täuschen, deshalb nicht als > Kritik auffassen. Es gab schon schlimmeres an Kommentaren hier. Damit kann ich leben. Ganz unrecht hast Du vllt nicht, wiederum habe ich mehr an Fähigkeiten, als es den Eindruck macht. > Du sprachst am Anfang von einem STM32F4xx oder STM32F334. Wenn du diese > Controller benutzen willst, würde ich keinen analogen Ansatz mit > Nulldurchgangserkennung oder ähnlichen benutzen. Bei einem kleinen > Controller ohne FPU muss man anders denken, keine Frage. Aber so einen > Boliden sollte man auch entsprechend fordern. Deshalb alles digital. Das > bedeutet für den Falls dass du nicht mit einer spll arbeiten willst STM32f429-Discovery (für Erprobungszwecke). An sich wäre mir die PLL am liebsten in Hardware. Aber davon habe ich immer noch null Ahnung, wie umzusetzen. > etwa: > - Eine Schleife die vom PWM-Interrupt getriggert wird (oder in ihm > läuft) > - Eingangsspannung messen. > - Anhand dieses Messergebnisses kannst du den Nulldurchgang sicher > bestimmen > - Wenn der Nulldurchgang erkannt wird feststellen wieviel PWM-Zyklen > seit dem letzten vergangen sind. > - liegt der Wert z.b. zwischen 410 und 390 bei 20khz dann ist das > Plausibel. Zähler auf Null setzten sonst hochzählen. > - wenn bis dahin alles ok: Mit sinf(Zaehler*2*pi/zyklen) den neuen Wert > für die PWM berechnen > - jetzt kann man noch diesen Wert mit dem gemessenen vergleichen um eine > Plausibilitätsprüfung zu machen. So ähnlich stelle ich mir das ganze auch vor. Außer dass ich die PWM anhand einer RZM (--> 3 Phasen) berechnen will. Siehe Anhang. > Jedenfalls kann man sich hier in der Software ausferkeln ohne den > Lötkolben zu schwingen. Je mehr ich in Hardware umsetze, desto weniger Softwareaufwand (denke ich zumindest) - es spricht nichts dagegen den Lötkolben zu schwingen. > Das ist aber nur das ganz,ganz grobe Muster. Tabellen oder ähnliches > sind bei einen F4 nicht mehr nötig. Meine Vorstellung im Augenblick - über analoge Spannungsmessung zu gehen und noch als Gegenkontrolle den Nulldurchgang mit erfassen. Bei groben Ausreißern (die im Augenblick bereits bei 6Vpp häufig vorkommen) in der Messung, könnte ich dann auf eine Sinustabelle zurückgreifen. Dafür wäre ein zum Netz synchroner Timer von Vorteil. Damit wäre ich doch auf der sicheren Seite. > Wenn das ganze 3phasig werden soll, wirst du aber nicht um deutlich mehr > Grundlagen herum kommen. Jup :/ > Allein die ganzen Hardwaremodule im Controller zum Laufen zu kriegen, > den ADC zu synchronisieren u.s.w. ist auch schon mal nicht an einem > Abend gemacht. Ich habe ja noch ein paar Monate Lebenszeit ;)
Jetzt mal ohne den Sinn/Unsinn der präzisen Nulldurchgangserkennung zu hinterfragen... Bisher habe ich keine Nulldurchgangserkennung mit ordentlichem Tiefpass ohne Hysterese gefunden. Was spricht dagegen? Meine selbst entworfene Schaltung funktioniert in der Simulation, praktisch jedoch nicht, weil am invertierenden Eingang (OPV -> LM393) der Sinus (80mVpp) einen Offset von ca. 300mV hat und der Komparator deswegen gar nicht erst schaltet.
:
Bearbeitet durch User
Anbei mal ne einfache Nulldurchgangserkennung. Wichtig ist der Schmitt-Trigger, damit der Ausgang nicht oszilliert. 74AHC ist nicht nötig, aber den hatte ich schon angelegt.
Christof K. schrieb: > Meine selbst entworfene Schaltung funktioniert in der Simulation Dürfte sie aber nicht bzw. nur sehr kurz. Jeder OPV-Eingang benötigt einen Gleichstrompfad, sonst lädt er sich durch den Biasstrom unkontrolliert auf. Auch braucht jeder Komparator eine Hysterese, damit er stabil arbeitet.
Du brauchst auf jeden Fall ein Trennrelais (o.Ä.), wenn du für eine gewisse Zeit im off-Grid-Modus fährst und keine Phasensynchronisation möglich ist. In der off-grid-Zeit kann dir die Netz-Phase bei den o.g. Schwankungen von +-0,2Hz in kürzester Zeit um 0-180° relativ zu deiner PWM-Phase davonlaufen. Wenn dann das Netz wieder da ist, ohne dass du eine Synchronisation oder Trennung hast, werden deine Endstufen "brachialsynchronisiert"... Dagegen hilft auch keine 1ppm-PLL. Bei Netz-Abwesenheit trennen und nach Netzrückkehr zuerst auf die Netzphase synchronisieren und dann über das Trennrelais zusammenschalten. Deine oben geforderte extreme Genauigkeit ist unter diesem Aspekt auch unnötig, da du wegen den Schwankungen der Netzfrequenz ohnehin zwingend eine kontinuierliche Echtzeit-Netzsynchronisation brauchst. Ob die dann ein halbes Grad Jitter hat, macht den Kohl nicht fett... Und was die 3-phasige Konstanz betrifft: Mit einer Sinus_LUT die 3n Elemente besitzt, kannst du mit 3 um 120°versetzten Zeigern arbeiten, die von einer Phase synchronisiert werden. Du kannst auch jede Phase auf ihren eigenen Nulldurchgang synchronisieren. Ist halt der 3-fache Hardwareaufwand zur ZC-Erkennung.
Christof K. schrieb: > Jetzt mal ohne den Sinn/Unsinn der präzisen Nulldurchgangserkennung zu > hinterfragen... Diese kennst du ... http://www.dextrel.net/diyzerocrosser.htm
Christof K. schrieb: > dass meine Schaltung in dem Fall mit einer Grösse, die > alle 20ms wiederkehrt, eine Vorhersage für eine sehr schnelle PWM für > drei Phasen macht, die blind drauf losschaltet. Wenn zudem diese Größe > gestört wird, weiss mein uC nicht im geringsten, was gerade geschieht, Wovon spricht Du ? Die PWM Frequenz ist vollkommen unabhängig von Deiner Netzfrequenz. Deine brutale Zeitabhängigkeit besteht darin ein 10ms Ereigniss auf ca. 1% Genauigkeit vorherzusagen und das ist völlig trivial. Du must so circa in etwa den Nulldurchgang wissen und dafür würde ich nicht mehr tun als jeden zweiten Nulldurchgang zu triggern wie in meiner angehängten Schaltung. Das machst Du für alle drei Phasen und fertig ist der Lack. Damit hast Du Nulldurchgang, Frequenz, Phasendrehung, Phasenlagen etc. pp. weil Du Dir aus dieser simpelsten aller möglichen Messungen alles andere ermitteln kannst ohne dieses wahnwitzige umhergespringe zwischen 'wenn dieses nicht geht schalte ich um auf jenes' Wie viel Zeit glaubst Du denn zu haben um diese Auswertung zu machen und immer noch besser zu liegen als ein simpel Ansatz ? Löse Dich bitte endlich von der Vorstellung das Deine PWM mehr vom Netz wissen muss als den zu fahrenden Duty Cycle. Ja, in der Nähe NULL kann es Fehltrigger geben. Das wird aber nur schlimmer je mehr analoges gemurkse da drin ist. Mit ein wenig C oder einer 'Entprellung' in der IRQ bügelst Du das weg. Löse Dich von dem ganzen analogen rumgefriggel das schon in der Simu nicht geht. Was glaubst Du was mit dem Murks geschieht wenn Du dreiphasig mit ordentlich Wumms auf dem Netz bist ? Du versuchts da Genauigkeiten an Stellen reinzubekommen die völlig irrelevat sind und verballerst damit Zeit und Energie die Du noch brauchen wirst um die 20 anderen Baustellen in den Griff zu bekommen.
Michael K. schrieb: > Ja, in der Nähe NULL kann es Fehltrigger geben. > Das wird aber nur schlimmer je mehr analoges gemurkse da drin ist. > Mit ein wenig C oder einer 'Entprellung' in der IRQ bügelst Du das weg. > > Löse Dich von dem ganzen analogen rumgefriggel das schon in der Simu > nicht geht. > Was glaubst Du was mit dem Murks geschieht wenn Du dreiphasig mit > ordentlich Wumms auf dem Netz bist ? > Da sind wir ja schon 2 die von dem analogen Kram nicht viel halten. Ich bringe trotzdem noch mal den ADC Ansatz ins Spiel, wenn schon mit M4 Controllern gearbeitet wird. Die Dinger in einem STM32F3xx oder F4 brauchen keine µs zum Messen und können automatisch im PWM Interrupt getriggert werden. Irgendwann willst du dann den Effektivwert der Eingangsspannung ermitteln Oder Strom, Leistung, Phasenverschiebung... Und wenns nur zum Anzeigen ist. Das fällt dann förmlich nebenbei ab.
temp schrieb: > Das fällt dann förmlich nebenbei ab. Messen würde ich das auch weil es nicht wehtut und fast keine Arbeit ist. Kann ja auch sein das man später mal DC Betrieb (Akku) können will. Im ersten Schritt würde ich aber alles weglassen was nicht auf direktem Weg zum Ziel führt.
@Peter Danke für den Hinweis Peter. Die Kapazität hat den Basisstrompfad unterbrochen. Jetzt tut sie das nicht mehr. Ohne Hystererse hat der Ausgang tatsächlich etwas gezappelt. Eine Hysterese ist jetzt mit dabei. Scheint soweit recht solide mit 6Vpp zu funktionieren. @Simpel Danke für den kleinen Exkurs. Als erster Prototyp soll zwar zuerst ein Gleichrichter mit aktiver PFC entstehen, aber Wechselrichten soll er später ja auch können. Denke Deine Empfehlungen treffen auch auf den Gleichrichter zu. Du sagst es -> 3n Elemente. @Michael Dafür wäre es von Vorteil, ein genau dreifaches Vielfaches an PWM Perioden in einer Sinusperiode zu haben. Und dafür wäre es von Vorteil, die PWM aufs Netz zu synchronisieren. @Wolfgang Nee! Kannte ich nicht. Die sieht spannend aus - Danke! Kriege sie leider nicht simuliert, werde sie aber bei Gelegenheit ausprobieren. Jetzt habe ich mich für die ersten Programmierschritte für eine eigene Schaltung (Anhang - 6Vpp-Variante) entschieden. Hier kann man mit R5 die Phasenlage einstellen und am Ausgang recht präzise (zumindest) einen Nulldurchgang erfassen. Gleichspannungsanteile im Sinus sind entkoppelt und eine gewisse Filterwirkung besteht auch (ca. 40dB @ 10kHz) @Michael Was spricht dagegen etwas genauer sein zu wollen? Noch habe ich ja keinen aktiven Filter 4.Ordnung "zusammengemurkst". Aber das überlege ich mir noch :) So groß wäre der Aufwand scheinbar nicht. Je genauer ich bei den einzelnen Komponenten versuche zu sein, desto besser das Endergebnis. Auch wenn das nur geringfügig sein sollte, wäre es den Aufwand meiner nach wert. Besonders die dabei gesammelte Erfahrung. Toleranzen und Abweichungen auf dem Weg wird es ja noch zu genüge geben. Weißt Du, ursprünglich wollte ich so supergenau und Störungsfrei meinen Nulldurchgang haben, weil der Interrupt via Trigger im STM die PWM zurücksetzen sollte - davon bin ich aber abgekommen, weil das zu unkontrollierbar wäre. Dennoch will ich weiterhin genau sein :) Ehrlich gesagt, werde ich für die ersten Versuche beide Ansätze (Messung, Nulldurchgang) ausprobieren, um Erfahrung zu sammeln und beide Ansätze gegeneinander zu stellen. Je genauer ich den Nulldurchgang erfasse, wenn die PWM auf das Netz synchron ist, genau ein dreifaches Vielfaches an PWM-Perioden in den Sinus passt - kenne ich die Sektorübergänge genauer und kann Stromverzerrungen reduzieren. Zudem kann ich konkretere Vorhersagen und Kontrollroutinen im Code implementieren. Oder nicht? Das "Rumgefriggel" mache ich ja Eingangs, damit am Ende etwas besseres als das Gefriggel rauskommt und kein "Murks". Was damit bei ordentlich Wumms geschieht, weiß ich eben noch nicht und versuche deshalb umso gewissenhafter zu sein ;) Weißt Du es? Ein Baby muss doch erstmal rumbrabbeln, bevor es anfängt "richtig" zu sprechen. > Du versuchts da Genauigkeiten an Stellen reinzubekommen die völlig > irrelevat sind Das macht mir aber Freude! Und lernen kann ich dabei zudem etwas. Und "völlig irrelevant" finde ich mittlerweile nicht ganz adäquat. > Im ersten Schritt würde ich aber alles weglassen was nicht auf > direktem Weg zum Ziel führt. Der Weg ist ja das Ziel @temp Hehe :) Ihr seid ja hardcore-digital ;) Die Messung wird auf jeden Fall mit einfließen. Ob zur Regelung, oder eben nur für die Anzeige oder anderweitige Ausgabe. Mit einem EPROM könnte ich später auch begrenzt Langzeitaufzeichnungen vornehmen (hat der STM32f429 nicht...oder?). Auf der ersten (nicht-lochraster) Platine wird evtl ein anderer Typ zum Einsatz kommen. Ich liebäugel ja für die Zukunft immer noch mit einem C2000. Evtl kann ich sogar mehrfach in der Update-INT Routine der PWM messen und mitteln, bevor der neue PWM-Wert berechnet wird(?). Im Augenblick finde ich die Ausreißer in der Messung nämlich ziemlich übel. Wie könnte ich Ausreißer in der Messung denn noch "ausbügeln? Die Zwischenkreisspannung und den Ausgangsstrom würde ich gerne mit externen parallelen ADCs messen, falls die PFC über Messung der Strangspannungen geregelt wird.
:
Bearbeitet durch User
Wenn du den PWM-Takt exakt auf ein gerades Vielfaches der Netzfrequenz syncronisieren willst, solltest du dir über ein paar Randbedingungen im klaren sein. 1. Welche Auflösung soll die PWM haben. Angenommen 10Bit bei 20kHz. Das bedeutet ca. 20MHz Eingangstakt der PWM. Jetzt musst du entscheiden an welcher Schraube du drehen willst um die Niederfrequenz zu ändern. Den Eingangstakt von 20MHz wirst du mit den gängigen Controllern nicht so erzeugen können dass er fein genug verstimmbar wäre. Um da 1% jitterfrei ausregeln zu können brauchst du schon 2GHz! Bleibt also nur die Länge der PWM-Zyklen z.B. im Bereich von 900 - 1100 zu verstellen. Damit ist aber dein Ansatz mit festem Raster und Tabellen zu arbeiten nicht mehr haltbar. Ausser mit einem DDS Ansatz, der bringt dann aber Jitter mit sich. Die Auswahl deines Controllers wird sich auch danach richten was du hier wie willst. 2. Den Stm32F429 ö.ä. halte ich hier für alles was mit Wandlern zu tun hat nicht für die beste Wahl. Für sowas gibst die Stm32F3xx Serie mit HighResolution-Timer. Die sind speziell für sowas gemacht. Christof K. schrieb: > Mit einem EPROM > könnte ich später auch begrenzt Langzeitaufzeichnungen vornehmen (hat > der STM32f429 nicht...oder?). Da kann ich dir nur raten den Ansatz von industriellen Photovoltaik-Wandlern zu benutzen. Die haben für die DC-Seite und die AC-Seite häufig separate Controller und für den ganzen Rest wie Menü, Logging, Kommunikation u.s.w noch einen. Der f429 ist was für die Kommunikation aber nicht für die Wandler. Die Wandler sollten überschaubaren Code haben und nichts anderes machen. Maximal mit einem Master und einem simplen Protokoll kommunizieren um Registerinhalte für die Parameter auszutauschen. Vor allem weil bei der Entwicklung von Code für den Wandler das Debuggen im Betrieb nicht möglich ist. Außer man steht gern im Nebel. Der Code für Menu und Schnittstellen nach draußen ist in der Regel viel aufgeblähter und komplexer, da ist es sehr von Vorteil wenn es nicht raucht weil irgendwas im Ethernet-Stack klemmt. Dein ganzes Mühen nach extremer Genauigkeit wird nichts nützen. Jedenfalls nicht wenn du das am Netz betreiben willst. Bei 20khz hast du ein 50µs Raster. Das sind Lichtjahre in einem Stromnetz. Einspeisewechselrichter müssen auch noch einen Phasenverschiebung von ca.5% reinbringen. Glaubst du da macht sich einer wegen 50µs Gedanken? Das wichtige ist, dass dir das Ding nicht abraucht. Auch nicht bei einem Phasensprung von 90 oder 180Grad. Da hilft sowieso nur die Überstromschnellabschaltung.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.