Forum: Mikrocontroller und Digitale Elektronik Regelung einer Sinuskurve per PWM


von Sebastian Handke (Gast)


Lesenswert?

Nabend,

probiere seit einiger Zeit eine Sinusspannung per PWM zu erzeugen.

Bin soweit das ich für 90 grad eine LU-Tabelle habe und die Werte
auf zwei verschiedene PWM-Ausgänge eines MCU legen kann.
(PWM0->0-90, 90-180 Grad; PWM1->180-270, 270-0 grad)
Das ganze soll mit einer H-Brücke aus einer konstanten Gleichspannung
ein Sinus erzeugen. LC-Filter ist selbstverständlich...
Funktioniert soweit schon ganz gut...

Das Problem ist, das ich die Amplitude des Sinus regeln muss !
Erfasse die Ausgangsspannung über einen Differential-AD.
(-3V - 0 - +3V)
Bisherige Versuche sachen wie folgt aus :
Pulsweite aus tab. holen und an PWM Ausgang ausgegeben.
Dann folgt für eine feste Zeit (damit die Frequenz stimmt) eine
Korrekturschleife, in der ich die momentane Spannung über den
AD-Wandler einlese und mit einer LU-Tab. verglichen habe. Wert zu klein
-> Pulsweite (Duty) vergrössert, Wert zu groß -> Duty verringert.

Der Regelkreis funktionierte bei kleinen Frequenzen (<10Hz) recht gut.
Mein Ziel sind aber 50 Hz. Habe schon davon Abstand genommen, die
Sinuskurve 64 mal abzutasten und zu korrigieren (pro Vollwelle !)...

Nun wäre ich schon zufrieden, wenn ich alle 20ms (eine Vollschwingung)
einen Korrekturwert erhalten würde, den ich auf die ganze Sinus-Tabelle
anwenden würde. Da bei den vorherigen Versuch doch die Kurvenform zu
sehr gelitten hat (kein Sinus mehr).
Die besten Ergebnise erbrachte bisher das mul/div der Tabelle, um
entsprechende Dutys zu bekommen und die Kurvenform zu erhalten.

Also ich suche nicht nach einem fertigen Code...eher nach einem
Denkanstoss, beschäfftige mich schon knappe 2 Monate mit dem prob,
wills aber lösen....und stecke im mom. völlig fest 8-(

Bissel einfacher ausgedrückt, ich will eine stabile 50Hz
Sinusschwingung haben. Alles in allem wirds eine OnlineUSV die
unabhängig von der Last (ind., kap., ohm) eine echte Sinusschwingung
erzeugt und hält !
Daher würde ich am liebsten den Sinus nach jedem LU-Tab.-Wert auf genau
den Spannungwert einregeln, der nötig ist. Mit 64 Stufen bei 20ms
bleiben also rund 300µs um jeden einzelnen Wert auszuregeln.

Als MCU habe ich einen Freescale DSP56F801FA60 mit 30 Mips.
Programmiert wird das ganze in C. Leistungshardware ist vorhanden,
ebenso Iso-Meßverstärker (Fa.Knick) zum genauen und sicheren erfassen
der Ausgangspannung.

Vielleicht hat einer ne Idee...DANKE schonmal vorweg...

Grüsse...Sebastian

von Kupfer Michi (Gast)



Lesenswert?

Ich versteh noch nicht so ganz warum du die PWM Information in einer LU
Tabelle festlegst. Das Tastverhältniss ergibt sich doch automatisch aus
dem Komperatorvergleich von Ausgangsfehler(sin.soll-sin.ist) und einem
Dreieckssignal das die PWM Grundfreq. festlegt. Zumindestens machen das
Class D Verstärker so, oder versteh ich da was falsch?

www.irf.com/product-info/audio/classdtutorial.pdf

Vielleicht helfen die Links zu Class D Verstärker weiter. Bei 50Hz kann
man ja die ganzen analogen Komponenten durch ADC + SW nachbilden.

von Olaf (Gast)


Lesenswert?

So wie ich das verstehe willst du einen schnellen Regler bauen
der mit einer langsamen Fuehrungsgroesse in sinusform beaufschlagt
wird.
Probier es mal mit diesem Ansatzpunkt.

Olaf

von Sebastian Handke (Gast)


Lesenswert?

Danke erst einmal das noch jemand was gepostet hat....

Also bisher habe ich das so gemacht :
die Pwm-Modulationsfrequenz ist 20 kHz (muss noch gesenkt werden, da
meine IGBTS zu lahm sind...)
Dann wird mit der SW über FOR-Schleifen einer der 4 Bereiche
(0-90-180-270-360/0 grad) bestimmt. Innerhalb der Schleife wird die
"Norm"-Pulsweite für die entsprechende Position auf den ersten
PWM-Ausgang des MCU gelegt. Danach war gedacht, das innerhalb dieser
Position eine Korrekturschleife aufgerufen wird, die das Signal an der
H-Brücke
per AD-Wandler erfasst und mit einem Wert aus einer Weiteren Tab.
(Soll-Wert, Spannung) vergleicht und die Pulsweite entsprechend
nachregelt. Funktioniert nur nicht, da aufgrund des LC-Filters am
Ausgang die Spannung so gut wie immer höher ist, und eine Reduzierung
der Pulsweite keine verringerung der Spannung mehr erreicht (wo soll
sie auch hin).
Nun habe ich das geändert, ich lasse erstmal den Norm-Wert der
Pulsweite ausgeben und erfasse erst nach einer Vollwelle die
gleichgerichtete Ausgangsspannung und lasse dann per Korrekturschleife
die gesamte Sinustabelle runter rechnen (mul 0,93) und ausgeben.
So bleibt die Sinusform erhalten und die Ausgangsspannung (230V AC)
bleibt konstant.
Also nix mehr mit jeden der 64 Werte pro Vollwelle nachregeln...
Da gab es böse Verzerrungen besonders im Kopfbereich der Kurve.
Zumal ja übergeordnet ein Timer mit läuft der dafür sorgt, das alle
315µs der nächste Wert aus der Tabelle geholt wird, egal ob die
Regelung schon den momentanen Wert erreicht hat oder nicht...
Entweder ist der DSP zu lahm dafür oder die Erfassung der
Ausgangsspannung ist nicht präzise genug (weshalb er zuviel regelt).
Dachte ja auch an Class-D Verstärker....die können das ja wohl bis über
20kHz...aber ich bin mir nicht sicher ob die nicht nur die Pulsweite
regeln in abhängigkeit der Eingangsspannung gegen Sägezahn.
Ich will ja das die Spannung auch genau die Kurvenform behält. Also das
die ausgegebene Spannung noch geregelt wird nach Sollwert, dazu müsste
wohl auch die Spannung "abgezogen" werden können. Aber ich kann ja
nur die Pulsweite auf 0 schrauben, wenn aber noch Spannung im LC-Filter
liegt oder gar von einer reaktiven Last kommt, müsste die
kurzgeschlossen werden oder per Impuls auf der anderen (H-)Brückenseite
abgezogen werden....
Das ist das ganze Problem.....aber ich denke mit dem anpassen der
Sinus-LU-Tabelle komme ich noch am besten hin....

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
Noch kein Account? Hier anmelden.