digitaler PID-Regler

M

Michael Rübig

Guest
Hi Leute,
ich muss für meine Diplomarbeit per PC-Software einen PID-Regler
realisieren.
Programmiersprache ist C.

Dazu habe ich mir erst mal ein "Schieberegister" programmiert, das in
meinem Fall 10 Messwerte aufnehmen kann.

Jetzt benötige ich die Übertragungsunktion eines PID-Reglers in der
k-Ebene mit den Parametern Vorhaltezeit, Nachstellzeit,
Proportionalitätsfaktor.
Meine Vorlesungsmitschriften sind dummerweise gerade nicht greifbar.

Es gibt doch bestimmt so Standardformen für PID-Regler.
Ich brauche ne Formel für den Stellwert in Abhängigkeit der letzten
Messwerte und der letzten Stellwerte.
Parameter sind dann Vorhaltezeit, Nachstellzeit, Proportionalitätsfaktor.

Kann mir von Euch jemand einen Tip geben?

Michael
 
Michael Rübig schrieb:

Jetzt benötige ich die Übertragungsunktion eines PID-Reglers in der
k-Ebene mit den Parametern Vorhaltezeit, Nachstellzeit,
Proportionalitätsfaktor.
Meine Vorlesungsmitschriften sind dummerweise gerade nicht greifbar.

Es gibt doch bestimmt so Standardformen für PID-Regler.
Ich brauche ne Formel für den Stellwert in Abhängigkeit der letzten
Messwerte und der letzten Stellwerte.
Parameter sind dann Vorhaltezeit, Nachstellzeit, Proportionalitätsfaktor.

Kann mir von Euch jemand einen Tip geben?
Hallo,

gehe in eure Bibliothek, suche geeignete Bücher und schlage darin nach.
Etwas Literatur solltest Du bei der Diplomarbeit sowieso gelesen haben
und auch angeben.

Bye
 
gehe in eure Bibliothek, suche geeignete Bücher und schlage darin nach.
Etwas Literatur solltest Du bei der Diplomarbeit sowieso gelesen haben
und auch angeben.
Genau! In "Regelungstechnik für Ingenieure" steht sogar der komplette
Algorithmus für einen PID Regler...


Gruß,
Artur
 
http://www.embeddedFORTH.de Heft 2
mit Blick auch parallele Anordnung und simpele Varianten für
I und D. Das Programm ist weniger gut.

mit den Parametern Vorhaltezeit, Nachstellzeit, Proportionalitätsfaktor.
Ich hatte nie den Eindruck, daß deren Definition so völlig
einheitlich ist. Theoretische DIN-Normen mal abgesehen.

Wenn man Einstellregeln orginal Ziegler & Nichols will: die der
Analogschaltung entsprechende Form ist seriell und der Diffenerenzierer
DT1. Muß man also Schaltung biegen.
Bezüglich der "digitalen" Einstellregeln a la Takahashi: ich kann den
Orginal-Artikel scannen wie er mal in der akademiologischen
Zeitschrift rt erschienen ist. Ich wäre damit vorsichtig: wird gern
in Lehrbüchern zitiert, in der Praxis glaube ich nicht so oft verwendet.

Dazu habe ich mir erst mal ein "Schieberegister" programmiert, das in
meinem Fall 10 Messwerte aufnehmen kann.
Hat bezüglich Glättung mit FIR was für sich, wenn man später
tatsächlich D-Anteil verwendet. Aber eigentlich nicht für PID nötig.
Es sei denn, man will den PID als FIR-Filter implementieren und hat
integrierende Strecke dafür. Oder klebt den I-Anteil ans FIR ran.

MfG JRD
 
Uwe Hercksen schrieb:
Michael Rübig schrieb:

Jetzt benötige ich die Übertragungsunktion eines PID-Reglers in der
k-Ebene mit den Parametern Vorhaltezeit, Nachstellzeit,
Proportionalitätsfaktor.
Meine Vorlesungsmitschriften sind dummerweise gerade nicht greifbar.

Es gibt doch bestimmt so Standardformen für PID-Regler.
Ich brauche ne Formel für den Stellwert in Abhängigkeit der letzten
Messwerte und der letzten Stellwerte.
Parameter sind dann Vorhaltezeit, Nachstellzeit, Proportionalitätsfaktor.

Kann mir von Euch jemand einen Tip geben?


Hallo,

gehe in eure Bibliothek, suche geeignete Bücher und schlage darin nach.
Etwas Literatur solltest Du bei der Diplomarbeit sowieso gelesen haben
und auch angeben.
Ich sitze aber grad in der Firma, in der ich mein Dipl.Arbeit mache und
die Bibliothek ist weit. Den Algorithmus brauche aber am besten heute noch.
Ich habe unter
http://www.technik-elite.de/klausuren/rt_02-03_14.pdf
was gefunden.
Ich glaube, der Geschwindigkeitsalgorithmus ziemlich unten ist das
richtige für mich.
Über das Delta Uk bin ich noch ein wenig am grübeln.

Was muss ich dafür einsetzen?

Momentan hab ich mir selbst einen Algorithmus ausgedacht, der auch
funktioniert.
Aber ich denke, dass ein Standardalgorithmus da deutlich besser ist,
zumal, das Projekt nach meiner Arbeit jemand anderes weiterführen muss.

Michael
 
Rafael Deliano schrieb:

http://www.embeddedFORTH.de Heft 2
mit Blick auch parallele Anordnung und simpele Varianten für
I und D. Das Programm ist weniger gut.
Ich hab das jetzt mal so implementiert (0 ist jeweils der neueste Wert):

D =((MeasBuf[0]-MeasBuf[1])+
(MeasBuf[1]-MeasBuf[2])+
(MeasBuf[2]-MeasBuf[3])) /3;

I = (Sollwert-MeasBuf[0]+
Sollwert-MeasBuf[1]+
Sollwert-MeasBuf[2]+
Sollwert-MeasBuf[3]+
Sollwert-MeasBuf[4]+
Sollwert-MeasBuf[5]) /6;

if (I > 1) I = 1;
if (I < -1) I = -1;

P = Sollwert-MeasBuf[0];


Y = kd * D + ki * I + kp *P;

Den D-Anteil filtere ich deshalb, um das Rauschen ein wenig wegzukriegen.

Den I-Anteil hab ich jetzt mal als Mittelwertfilter gelöst.
Bin mir nicht sicher, ob das das richtige Vorgehen ist.
Ich könnte ihn auch als IIR mit 2 Koeffizienten lösen, was der analpgen
Lösung deutlich näher kommt. Was ist besser.

Im Prinzip hat der Regler jetzt 5 Parameter:
kd, ki, kp, Anzahl Messwerte für d-Anteil (3), und Anzahl Messwerte
i-Anteil(6).

Damit werde ich es jetzt mal probieren.

Ich hatte zwar schon vorher was leidlich funktionierendes
zusammengebastelt. Das war aber saumäßig unübersichtlich.

Danke für den Link

Michael
 
Rafael Deliano schrieb:

http://www.embeddedFORTH.de Heft 2
mit Blick auch parallele Anordnung und simpele Varianten für
I und D. Das Programm ist weniger gut.

Ich hab das jetzt mal so implementiert (0 ist jeweils der neueste Wert):

D =((MeasBuf[0]-MeasBuf[1])+
(MeasBuf[1]-MeasBuf[2])+
(MeasBuf[2]-MeasBuf[3])) /3;

I = (Sollwert-MeasBuf[0]+
Sollwert-MeasBuf[1]+
Sollwert-MeasBuf[2]+
Sollwert-MeasBuf[3]+
Sollwert-MeasBuf[4]+
Sollwert-MeasBuf[5]) /6;

if (I > 1) I = 1;
if (I < -1) I = -1;

P = Sollwert-MeasBuf[0];


Y = -kd * D + ki * I + kp *P;

Den D-Anteil filtere ich, um das Rauschen ein wenig wegzukriegen.

Den I-Anteil hab ich jetzt mal als Mittelwertfilter gelöst.
Bin mir nicht sicher, ob das das richtige Vorgehen ist.
Ich könnte ihn auch als IIR mit 2 Koeffizienten lösen, was der analpgen
Lösung deutlich näher kommt. Was ist besser.

Im Prinzip hat der Regler jetzt 5 Parameter:
kd, ki, kp, Anzahl Messwerte für d-Anteil (3), und Anzahl Messwerte
i-Anteil(6).

Damit werde ich es jetzt mal probieren.

Später wird das Integrieren dann natürlich über Schleifen laufen.

Ich hatte zwar schon vorher was leidlich funktionierendes
zusammengebastelt. Das war aber saumäßig unübersichtlich.

Danke für den Link

Michael
 
)+
(MeasBuf[1]-MeasBuf[2])+
(MeasBuf[2]-MeasBuf[3])) /3;
Übliches, glättendes FIR eher wie im PID-Artikel:
D = 1,5 * MeasBuf[0] + -2 * MeasBuf[1] + -0,5 * MeasBuf[2]

Weitere Differenzierer in Heft 6 Seite 18 Tabelle 2.
Obige Formel ist der 3 Taps in ersten Zeile, Schätzung an y0.
( Im Text ist Fehler es ist Schätzung an y0 nicht y2 ).

Den I-Anteil hab ich jetzt mal als Mittelwertfilter gelöst.
Bin mir nicht sicher, ob das das richtige Vorgehen ist.
Wohl nicht. Integrator ist eben Integrator.
Einfache Formel ca.:

I = I + MeasBuf[0]

Trapez:

I = I + ( MeasBuf[0] + MeasBuf[1] ) / 2

Man beachte die in der Praxis nötige Abschaltung bei Sättigung:
wenn Y auf Anschlag sollte Integrator gestoppt bleiben.
Also mit if ... überspringen.

MfG JRD
 
Hi,
)+
(MeasBuf[1]-MeasBuf[2])+
(MeasBuf[2]-MeasBuf[3])) /3;
Das war auch mehr als dämlich (umständlich), weil
=(MeasBuf[0]-MeasBuf[3]) /3

Übliches, glättendes FIR eher wie im PID-Artikel:
D = 1,5 * MeasBuf[0] + -2 * MeasBuf[1] + -0,5 * MeasBuf[2]
Da ist was faul.

Sind alle drei Werte identisch (z.B. 5), dann ist die Ableitung=0 und es
müsste folglich 0 rauskommen, tut es aber nicht, sondern -5.
Wenn man den 3. Koefizient = +0,5 macht, wirds schon besser, aber
irgendwie stimmts immer noch nicht.
Bei
MeasBuf[0]=5
MeasBuf[1]=3
MeasBuf[2]=1
müsste 2 rauskommen, es kommt aber 1 raus.

Denkfehler bei mir?

Weitere Differenzierer in Heft 6 Seite 18 Tabelle 2.
Obige Formel ist der 3 Taps in ersten Zeile, Schätzung an y0.
( Im Text ist Fehler es ist Schätzung an y0 nicht y2 ).
Seltsames Satzkonstrukt, verstehe ich nicht ganz.

Den I-Anteil hab ich jetzt mal als Mittelwertfilter gelöst.
Bin mir nicht sicher, ob das das richtige Vorgehen ist.

Wohl nicht. Integrator ist eben Integrator.
Einfache Formel ca.:
Klar, manchmal bin ich selten dämlich.

Trapez:

I = I + ( MeasBuf[0] + MeasBuf[1] ) / 2
Was mir aber an meiner Variante doch besser gefällt:
Ein echter Integrierer führt zwandgsweise zum Überschwingen, damit das
Integral irgendwann 0 wird. In meinem Fall ist Überschwingen extrem
unerwünscht, da der Steller nur in eine Richtung ziehen kann.
Überschwingt das ganze, kommt das System nur sehr langsam auf den
Sollwert zurück.

Anwendung:
In Wasser wird eine flüchtige Flüssigkeit (Alkohol) zudosiert. Diese
verschwindet langsam und muss nachdosiert werden. Alkohol entnehmen geht
nicht und Wasser zudosieren geht auch nicht.

In meinem falschen Integrator werden die ganz alten Fehler einfach nicht
mehr berücksichtigt und wenn der D-Anteil groß genug ist, nähert sich
die Konzentration dem Sollwert ausschließlich von unten an.

Der bleibende Regelfehler, der dabei entsteht, ist nicht so tragisch. 1%
Genauigkeit reichen aus. Oder gibts ne andere Lösung führ das Problem?

Ich beschäftige mich hier das erste mal mit digitalen Reglern und
Filtern in der Praxis, man verzeihe mir meine Fehler und falschen
Denkansätze.

Man beachte die in der Praxis nötige Abschaltung bei Sättigung:
wenn Y auf Anschlag sollte Integrator gestoppt bleiben.
Also mit if ... überspringen.
Ich lade den Integrator jetzt nur, wenn ich schon relativ nahe am
Sollwert dran bin.

Danke für die Hilfe, bin schonmal ein großes Stück weiter.

Michael
 

Welcome to EDABoard.com

Sponsor

Back
Top