Weis keiner eine Lösung? Ich will doch nur aus ner gemessenen Spannung und nem Sollwert einen PWM Wert ermitteln, den ich einstellen muss! Der Algorithmus muss ja nicht perfekt sein! Hauptsache die Schwingungen treten nicht mehr so massiv auf!
hallo!
Ich hatte eigentlich vor, mir ein Schaltnetzteil zu bauen, bei dem durch ein PWM Signal ein TTL-Mosfet angesteuert wird. Durch das Verhältnis der Einschalt- zur Ausschaltzeit sollte man eine Gleichspannung zwischen 0V und 30V einstellen können. Jetzt konnte ich wunderschön die Pulsweite verändern und so die unterschiedlichen Spannungen erhalten. Mein Problem ist jetzt aber die Regelung des ganzen. Über nen 10bit AD vom Wandler (AtMEGA32) erfasse ich die Ist Spannung. Bis jetzt hab ichs immer einfach verglichen:
IstSpannung < Sollspannung -> PWM erhöhnen
und andersrum....
Dabei fängt die Ausgangsspannung verständlicherweise enorm zum schwingen an. Deswegen wollte ich einen PID Regler (softwaremäsig) realisieren. Ich hab mich im Wiki schon eingelesen und bin auf das hier gestoßen:
e = w - x
esum = esum + e
y = Kp * e + Ki * Ta * esum + Kd * (e – ealt)/Ta
ealt = e
Dabei ist w meine Sollspannung X mein ist Wert und Ta die Tastrate.
Das ganze hab ich eigentlich auch schon verstanden. Nur wie verwandel ich das Y, also die Stellgröße, in die Abtastrate um. Denn eigentlich stellt ja das Y eine Spannung da, die angestrebt werden soll.
Ok ich weis ziemlich viel Text, aber ich hoffe ich hab nichts vergessen und alles genau genug erklärt.
Vielen Dank für eure Hilfe!
Weis keiner eine Lösung? Ich will doch nur aus ner gemessenen Spannung und nem Sollwert einen PWM Wert ermitteln, den ich einstellen muss! Der Algorithmus muss ja nicht perfekt sein! Hauptsache die Schwingungen treten nicht mehr so massiv auf!
Software ist eine Komponente, Hardware die Andere.
Poste mal das Schaltbild.
Gruß Hartmut
Planung ersetzt Zufall durch Irrtum
Gruß aus dem Ruhrgebiet Hartmut
Hallo Martin,
ich habe so etwas noch nie gemacht, aber vielleicht hilft dir meine Vorstellung weiter:
Warum solltest du das wollen? Die Abtastrate ist gegeben durch deinen AD-Wandler.Nur wie verwandel ich das Y, also die Stellgröße, in die Abtastrate um
Ich würde Y als Stellgröße verwenden. Der Wert von Y muss dabei nur auf den Bereich deiner PWM skaliert werden. D.h.
wenn y=0 --> pwm=0
wenn y=y_max --> pwm = pwm_max
und der rest dazwischen linear skaliert. So schwierig ist das nicht, musst nur schauen welche Werte rauskommen können und dann fröhlich teilen.
Also erstmal vielen Dank! Des werd ich gleich mal ausprobieren! Hab mich da eh ein bisschen verschrieben ich meinte, icht Abtastrate, sondern Verhältnis zwischen High und Low!
Deine Gedanken hatte ich auch schon, aber ich dachte nicht, dass die Funktion U in Abhängigkeit des PWM Signals linear verläuft. Ich dachte, des Wäre irgendeine Kurve.
So ich bin nun endlich wieder dazugekommen, an meinem regelungsprogramm weiterzuarbeiten.
Leider funktioniert es immer noch nicht. Konkret schaut es nun so aus:
Ich hab mich dabei mit an dem Bascom Beispiel orientiert. Darum auch die 50ms Verzögerung am Anfang. Ich hab mir auch den anderen Beitrag im Forum zu dem Beispiel durchgelesen und weis, dass es nicht das beste ist. Mein Problem ist immer noch folgendes, dass der Stellwert teilweise negativ wird. Kp und Ki hab ich absichtlich weggelassen um ersteinmal Ki einzustellen. Nur wie bring ich jetzt den Stellwert in Verbindung mit dem PWM wert. Der Stellwert kann ja auch negativ werden. Ich wäre für vorschläge sehr dankbar. Achja: der Faktor 0.05 stellt die Abtastrate (50ms Verzögerung dar, und der Faktor 20 der Kehrwert)Code:Dim E As Single , Esum As Single , Ealt As Single Cls Start Adc Dim Sollwert As Single Dim Istwert As Single Dim Stellwert As Single Dim W As Word Stellwert = 0 Sollwert = 3.00 Ealt = 0 Cyclic: Waitms 50 Gosub Regulator Goto Cyclic Regulator: Pwm1a = Stellwert Const Kp = 0.0 Const Ki = 0.0 Const Kd = 1 Dim Panteil As Single Dim Ianteil As Single Dim Danteil As Single W = Getadc(0) Istwert = W / 1023 Istwert = Istwert * 50 E = Sollwert - Istwert Esum = Esum + E Panteil = Kp * E Ianteil = 0.05 * Esum Ianteil = Ianteil * Ki Danteil = E - Ealt Danteil = Danteil * Kd Danteil = Danteil * 20 '1 / Ta = 20, da Ta = 0.05ms' Stellwert = Panteil + Danteil Stellwert = Stellwert + Ianteil Ealt = E Locate 1 , 1 Lcd Stellwert Locate 2 , 1 Lcd Fusing(istwert , "#.##") Return
Vielen Dank für eure Hilfe.
Martin
Um das ganze jetzt mal zum abschluss zu bringen:
Ich habe mich jetzt doch für die alte brachiale Methode ohne I oder D Regler entschieden. Es läuft schon nicht schlecht! Falls jemand noch nen Bascom code braucht, für ne Spannungsquelle bzw. Konstantstromquelle, bitte sehr:
Code:Dim W As Word Dim Spannung As Single Dim Strom As Single Dim A As Word Dim Sollspannung As Single Dim Sollstrom As Single Cls Start Adc A = 0 Sollspannung = 0.0 Sollstrom = 0.10 Do Locate 1 , 1 Lcd Fusing(spannung , "#.##") Locate 2 , 1 Lcd Fusing(strom , "#.###") W = Getadc(0) Spannung = W / 1023 Spannung = Spannung * 50 W = Getadc(1) Strom = W / 1023 Strom = Strom * 5 If Sollspannung <> 0 Then If Spannung < Sollspannung Then If A < 1023 Then A = A + 1 End If End If If Spannung > Sollspannung Then If A > 0 Then A = A - 1 End If End If End If If Sollstrom <> 0 Then If Strom < Sollstrom Then If A < 1023 Then A = A + 1 End If End If If Strom > Sollstrom Then If A > 0 Then A = A - 1 End If End If End If Pwm1a = 1023 - A Pwm1b = A Waitms 50 Loop
Ist aber eher ein I Regler als ein P Regler.
I Regler?
Ich summier doch gar nichts auf?
Ich vergleich ja bloß und dem entsprechend, unabhängig von Ta wird eine Regelung betrieben. Ich denke nicht, dass es ein I Regler ist.
Hallo, ich möchte noch einmal auf deinen anfänglichen Beitrag zurückkommen: Die Regleralgorithmen ergeben einen Wert für die Stellgröße. Ich würde zum ersten Erproben zunächst nur den P-Anteil verwenden:
Y=kp*e. Wenn der P-Anteil richtig funktioniert, bleibt zwar eine Regeldifferenz , aber du weisst, dass die Funktion schon mal da ist.
Da du mit Puls-Weiten-Modulation arbeitest, musst du aus dem Wert von Y die Pulsdauer gewinnen (deine eigentliche Frage?)
Das müsste m.E so funktionieren:
Die Max Pulsdauer hat einen bestimmten Wert, z.B. 50ms.
Wenn Y seinen max.Wert hat (z.B. entsprechend dem Wertebereich deiner Variablen Y), dann entspricht dies der max. Einschaltimpulsdauer = 50ms.
Andere Werte von Y werden dann linear umgerechnet: TPuls = TPulsmax * Y / Ymax.
KP musst du jetzt durch experimentieren so einstellen, dass der Regler ohne zu schwingen möglichst weit an den Sollwert heranregelt.
Wenn das funktioniert, bist du ein ganzes Stück weiter, denn du weisst, dein Regler funktioniert grundsätzlich.
Jetzt programmierst du dir den I-Anteil wie im ersten Beitrag dazu und stellst ki so ein, dass möglichst schnell der Sollwert erreicht wird, ohne kp nocheinmal zu verändern.
Ob du dann noch den D-Anteil brauchst, musst du erproben. Wahrscheinlich nicht.
Viel Glück - Grüße von Jens
Lesezeichen