PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [gelöst] software PID Regler



Martin.
30.04.2008, 16:39
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!

Martin.
01.05.2008, 09:07
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!

Hessibaby
01.05.2008, 10:35
Software ist eine Komponente, Hardware die Andere.
Poste mal das Schaltbild.

Gruß Hartmut

avion23
01.05.2008, 10:59
Hallo Martin,
ich habe so etwas noch nie gemacht, aber vielleicht hilft dir meine Vorstellung weiter:


Nur wie verwandel ich das Y, also die Stellgröße, in die Abtastrate um
Warum solltest du das wollen? Die Abtastrate ist gegeben durch deinen AD-Wandler.



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.

Martin.
01.05.2008, 11:37
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.

Martin.
07.05.2008, 12:58
So ich bin nun endlich wieder dazugekommen, an meinem regelungsprogramm weiterzuarbeiten.

Leider funktioniert es immer noch nicht. Konkret schaut es nun so aus:



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

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)

Vielen Dank für eure Hilfe.

Martin

Martin.
08.05.2008, 14:58
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:



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

Robotniks
08.05.2008, 15:55
Ist aber eher ein I Regler als ein P Regler.

Martin.
08.05.2008, 16:02
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.

sehreilig
08.05.2008, 16:51
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

dl1akp
09.05.2008, 07:50
Hallo Martin,

kanste mal den Schaltplan posten? Mich interessiert auch, wie mit PWM eine leistungsstarke Gleichspannung regelbar zur Verfügung stellen kann.

Danke, MfG, dl1akp

Martin.
09.05.2008, 10:41
So ich hab jetzt einen teil des Schaltplans mit Eagle umgesetzt. Ich hoffe es passt soweit. Ich hab da nen L293D verwendet, um den MOSFET anzusteuern. In den nächsten Tagen kommt ne Lieferung mit ein paar ICL7667 die ich statt dessen verwenden werde. Die Spannungsmessung usw. ist noch nicht eingezeichnet. Ich weis auch nicht ob nicht noch ne Freilaufdiode beim MOSFET hingehört, eigentlich hat er ja eine von Haus aus? (Vielleicht könnte mir das noch jemand sagen). Da ich noch keine Kühlkörper montiert habe, hab ich die Schaltung auch noch nicht zu stark belastet. Die 15V Versorgung um den Mosfet durchzusteuern, nehm ich im Moment noch von den 24V. Bis jetzt hab ich nämlich nur 10V anstatt den 24 angelegt (ich weis umständlicher Satz a la: Sei P ein Punkt Q, wir wollen ihn R nennen), weshalb ich auch 10V für den L293D hergenommen hab. Da ich des ganze aber mir 24 bis 30V versorgen werde, muss halt noch ein Spannungsteiler her.

Ich hoffe ich hab nichts vergessen.

Achja ich kann für nichts garantieren! Das ganze ist mein eigener Entwurf. So funktioniert es im Moment mit ohmschen Lasten und geringen Strömen. Wenn ich die Kühlkörper hab, kann ichs mal mit höheren ausprobieren!