Forum: Mikrocontroller und Digitale Elektronik Grundlage PID-Regler


von Peter H. (Gast)


Lesenswert?

Hallo,

wie gehe ich grundlegend an folgendes Problem und wo finde ich 
vielleicht einige Beispiele:

Mein Regler erhält einmal pro Millisekunde sowohl einen Istwert, als 
auch einen neuen Sollwert. Daraus soll nun ein analoges Ausgangssignal 
zur Ansteuerung einer Motorelektronik erzeugt werden.

Was muss ich jetzt in meiner Software mit den einstellbaren P-, I- und 
D-Reglerparametern machen, damit ein typischer PID-Regler entsteht?

von wil (Gast)


Lesenswert?

Als näcstes benötigst du die Stellgröße, dass ist bei einem Motor zB die 
PWM mit der die Geschwigkeit oder Drehmoment bestimmt wird.

Jetzt benötigst du einen mathematischen zusammenhang über den Fehler, 
also Abweichung zwischen Ist und Sollwert und der Stellgröße.

Am einfachsten ist der P-Regler, da multiplizierst du den Fehler eben 
mit deinem P und das skalierst du diretk auf die PWM, um dann den 
statischen Restfehler zu bewältigen nimmt man den I-Teil, der reduziert 
diesen konstanten Anteil mehr oder weniger schnell gen 0 und schon hat 
man das richtige Ergebnis :)

D-Anteil habe ich selber noch nicht benutzt, ich glabue der ist eher was 
für Sprunghafte Änderungen, also ich glaub mit PI solltes du bei einem 
Motor erstmal zurechtkommen.

von Michel M. (elec-deniel)


Lesenswert?

google mal "PID Motor auf Position"

von tom (Gast)


Lesenswert?

>> Was muss ich jetzt in meiner Software mit den einstellbaren P-, I- und
>> D-Reglerparametern machen, damit ein typischer PID-Regler entsteht?

Entsteht? Wenn du einen Regler hast, bei dem du P, I und D einstellen 
kannst, hast Du schon einen PID Regler. Die Kunst ist es, die Parameter 
entsprechend an die Strecke anzupassen. Dazu solltest Du die 
Übertragungsfunktion der Strecke kennen. Was hat denn Deine Stecke für 
einen Charakter?

von Peter H. (Gast)


Lesenswert?

tom schrieb:
> Was hat denn Deine Stecke für einen Charakter?

Der Regler soll über seine Einstellparameter an unterschiedliche 
Strecken angepaßt werden können.

von Michael (Gast)


Lesenswert?

Peter H. schrieb:
> tom schrieb:
>> Was hat denn Deine Stecke für einen Charakter?
>
> Der Regler soll über seine Einstellparameter an unterschiedliche
> Strecken angepaßt werden können.

Ja das ist uns schon klar. kp, ki und kd sind die Parameter die 
angepasst werden müssen. Aber um diese Parameter für die verschiedenen 
Strecken herauszubekommen brauchst du die Übertragungsfunktion, 
Systemfunktion. Wenn man nach der Charakteristik frägt, dann geht es 
darum den Typ der Systemfunktion zumindest grob zu erkennen. 
http://www.rn-wissen.de/index.php/Regelungstechnik#Die_Regelstrecke
PT1, PT2, Totzeit, ...

von wil (Gast)


Lesenswert?

Übertragungsfunktion ist manchmal komplex herauszubekommen und sich von 
daher dann als Einsteiger die PArameter richtig auszurechnen nahezu 
unmöglich.
Ich hhab mir damals meine erste regelstrecke eher mit gesundem 
Menschenverstand hergeleitet. Stell dir mal die Fragen vor, mit welcher 
Stellgröße willst du Einfluss auf deinen Aufbau nehmen, also einer PWM 
einer Spannung , einem Strom etc, udn dann als nächsten Schritt wo hast 
du vor einzugreifen isn System, mal das mal auf erklärs dir logisch dann 
kannste das ja auchheir posten, dann fällts den Leuten einfacher dir zu 
helfen.

von amateur (Gast)


Lesenswert?

Falls Du mit den Atmels werkelst, da gibt's fertige Bibliotheken.

von Peter H. (Gast)


Lesenswert?

wil schrieb:
> dann fällts den Leuten einfacher dir zu helfen.

Ich bekomme jede Millisekunde sowohl eine Ist-, als auch eine 
Sollposition. Mein Antrieb kann ein Elektromotor mit Frequenzumrichter, 
wie auch ein Pneumatikzylinder mit Ventil (incl. Ventilelektronik) sein. 
Die Übertragungsfunktionen sind je nach verwendeter Strecke 
unterschiedlich und vorweg nicht bekannt.

Die Istposition sollte möglichst gut der vorgegebenen Sollposition 
folgen, wobei ein Schwingen sicher verhindert werden muß. Eine sich 
nicht ändernde Sollposition muß mit kleinem Fehler erreicht werden. Der 
Regler soll über seine Parameter an die verschiedenen Regelstecken von 
Elektrofachkräften (d.h., keine Regelungsprofis) angepaßt werden können.

von Karl H. (kbuchegg)


Lesenswert?

Peter H. schrieb:
> wil schrieb:
>> dann fällts den Leuten einfacher dir zu helfen.
>
> Ich bekomme jede Millisekunde sowohl eine Ist-, als auch eine
> Sollposition. Mein Antrieb kann ein Elektromotor mit Frequenzumrichter,
> wie auch ein Pneumatikzylinder mit Ventil (incl. Ventilelektronik) sein.
> Die Übertragungsfunktionen sind je nach verwendeter Strecke
> unterschiedlich und vorweg nicht bekannt.

Was dir nicht klar sein dürfte.

Ein PID Regler ist algorithmisch immer gleich aufgebaut. Die Formeln 
sind immer dieselben.
Die Anpassung an die konkrete Regelstrecke wird durch die Werte für Kp, 
Ki, Kd erreicht! Mach die einstellbar und du hast deine Anpassbarkeit.

(und eventuell sind noch ein paar Hilfsgrößen notwendig bzw. sinnvoll, 
die man als Antiwindup-Begrenzungen einsetzt, damit sich der Regler bei 
großer Regelabweichung nicht selbst mit seinem Integralteil so weit ins 
Abseits aufschaukelt, dass er nur mit großen zeitlichen Versatz wieder 
in den eigentlichen Regelbereich zurückkommt.

Aber vom Prinzip her sind Kp, Kd und Ki die Parameter, mit denen der 
Regler angepasst wird und sonst nichts.

von Schlumpf (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Aber vom Prinzip her sind Kp, Kd und Ki die Parameter, mit denen der
> Regler angepasst wird und sonst nichts.

Und genau hierin liegt die große Kunst.
Wenn das jemand machen soll, der davon keine Ahung hat, dann wird er 
scheitern.
Man kann natürlich selbstlernende Regler programmieren, die dann durch 
Auswerten von Sprungantworten etc sich selbst diese Parameter bestimmen, 
aber derjenige, der so ein System programmiert, braucht dann umso mehr 
Erfahrung in Regelungstechnik und anhand deiner Fragestellung scheint es 
so, dass dir diese Erfahrung fehlt (Ohne dir auf die Füße stehen zu 
wollen)

von Karl H. (kbuchegg)


Lesenswert?

Schlumpf schrieb:
> Karl Heinz Buchegger schrieb:
>> Aber vom Prinzip her sind Kp, Kd und Ki die Parameter, mit denen der
>> Regler angepasst wird und sonst nichts.
>
> Und genau hierin liegt die große Kunst.
> Wenn das jemand machen soll, der davon keine Ahung hat, dann wird er
> scheitern.

Nicht zuletzt aufgrund dieser Aussage ...
> Was muss ich jetzt in meiner Software mit den einstellbaren P-,
> I- und D-Reglerparametern machen, damit ein typischer PID-Regler
> entsteht?
... denke ich mitlerweile, dass das Problem des TO darin besteht, in 
Google die Suchworte "PID Regler C Code" einzugeben und sich aus den 
x-tausend Beiträgen sich den Code rauszusuchen, der ihm am besten 
gefällt bzw. die ersten 10 Links mal anzuklicken und die Erläuterungen 
zu PID durchzulesen.

von Peter H. (Gast)


Lesenswert?

Und wie bekomme ich jetzt einen Regler hin, der den Anforderungen 
entspricht (bzw. möglichst nahe kommt)?

von Karl H. (kbuchegg)


Lesenswert?

Peter H. schrieb:
> Und wie bekomme ich jetzt einen Regler hin, der den Anforderungen
> entspricht (bzw. möglichst nahe kommt)?


Ich seh jetzt ehrlich gesagt nicht, was in der ganzen Diskussion noch 
nicht angesprochen wurde. Zu faul zum googeln?

Programmieren musst du schon alleine. Die 5 Zeilen Code sind ja jetzt so 
schwer auch wieder nicht aus einer Vorlage zu extrahieren. Davon sind 
hier eigentlich alle ausgegangen, dass du den Teil alleine schaffst.

von Schlumpf (Gast)


Lesenswert?

Peter H. schrieb:
> Und wie bekomme ich jetzt einen Regler hin, der den Anforderungen
> entspricht (bzw. möglichst nahe kommt)?

Indem du das Wort "Ich" aus dem Satz streichst und durch "gute bezahlte 
Fachkraft" ersetzt...

Es ist offensichtlich, dass du von Regelungstechnik nichtmal den Hauch 
einer Ahung hast und daher erlaube ich mir zu behaupten, dass du das 
Problem nicht lösen kannst.
Entweder du machst dich mit den Grundlagen der Materie vertraut (Es gibt 
nahezu unendlich viel Literatur darüber), oder du machst deinen 
Geldbeutel auf und engagierst jemanden, der das für dich macht.

von Thomas (Gast)


Lesenswert?

>> Aber vom Prinzip her sind Kp, Kd und Ki die Parameter, mit denen der
>> Regler angepasst wird und sonst nichts.
>
> Und genau hierin liegt die große Kunst.
> Wenn das jemand machen soll, der davon keine Ahnung hat, dann wird er
> scheitern.

Das stimmt so nicht.
Einen PID Regler einzustellen ist keine große Kunst.
Dazu muss man im Prinzip auch nichts über das System wissen.
Jedenfalls nicht, so lange man nichts kaputt machen kann.

Ein experimenteller Weg wie er im Tietze Schenk empfohlen wird geht so:
* Ki = Kd = 0
* Kp so lange hochdrehen, bis eine schwach gedämpfte Sprungantwort 
resultiert.
* Kd hochschrauben, das System das gewünschte Einschwingverhalten hat.
* Ki hochschrauben, bis die Regelabweichung in minimaler Zeit 
ausgeglichen wird.

Kann jeder angelernte Laie erledigen.

Ob Peter das auch schafft werden wir sehen.

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Weiter oben hatte doch schon jemand rn-wissen verlinkt. Der Artikel über 
die Regelungstechnik ist echt gut. Da wird super beschrieben, wie du auf 
die Werte kommst. Lesen musst du wirklich selbst.

http://www.rn-wissen.de/index.php/Regelungstechnik , falls du auch zu 
faul bist, den Thread nochmal danach zu durchsuchen..

MfG Dennis

von Schlumpf (Gast)


Lesenswert?

Thomas schrieb:
> * Kp so lange hochdrehen, bis eine schwach gedämpfte Sprungantwort
> resultiert.
> * Kd hochschrauben, das System das gewünschte Einschwingverhalten hat.

Setzt aber voraus, dass derjenige zumindest weiss, was ein PID-Regler 
ist und was ihn kennzeichnet. Außerdem sollten dann Begriffe wie 
Sprungantwort und Einschwingverhalten geläufig sein, bzw. mehr als nur 
"Begriffe" :-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Thomas schrieb:
> Ein experimenteller Weg wie er im Tietze Schenk empfohlen wird geht so:
> ...
Und das Ganze dann auch mal mit anderer Belastung, anderer 
Versorgungsspannung usw. ausprobieren. Denn Änderungen dort wirken sich 
dann durch andere Konstanten auf die Regelstrecke aus...

von Schlumpf (Gast)


Lesenswert?

Lothar Miller schrieb:
> Und das Ganze dann auch mal mit anderer Belastung, anderer
> Versorgungsspannung usw. ausprobieren. Denn Änderungen dort wirken sich
> dann durch andere Konstanten auf die Regelstrecke aus...

Abgesehen davon sind Antriebsregler meist geschachtelte Regler, die eine 
gewisse Komplexität aufweisen, die man mit einer Faustformal garantiert 
nicht mehr in den Griff bekommt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Schlumpf schrieb:
> Abgesehen davon sind Antriebsregler meist geschachtelte Regler
Es geht hier offenbar um einen relativ einfachen einstufigen 
PID-Regler. Ob der allerdings für die Aufgabe ausreicht und warum 
Andere viel mehr Aufwand treiben (müssen) steht auf einem anderen 
Blatt...

von Schlumpf (Gast)


Lesenswert?

@ Lothar:
:-)

von Michael (Gast)


Lesenswert?

Thomas schrieb:
> Einen PID Regler einzustellen ist keine große Kunst.
> Dazu muss man im Prinzip auch nichts über das System wissen.
> Jedenfalls nicht, so lange man nichts kaputt machen kann.

Einen einstufigen vielleicht ja. Ansonsten ist diese Aussage per se eine 
Beleidung der Regelungstechnik. Das was du da schreibst ist eine 
"Fausformel" und funktioniert bei einfachen einstufigen halbwegs 
linearen Systemen. Das ist die Quick n' Dirty Variante.

von Klaus Wowereit (Gast)


Lesenswert?

Hier mal ein PID-Regler nach Brett Beauregard. Der Regler hat 
Vorkehrungen gegen Derivative Kick, Sprungänderungen bei on/off bzw. 
Parameteränderung. Leider gibt's die Webseite mit der Erklärung  nimmer, 
zumindest fand ich sie nicht mehr, bei Bedarf kann ich aber helfen, ich 
hab sie mir mal für offline-Betrieb gesichert.

Die Abtastzeit ist für den Sekundenbereich vorgesehen, wenn du alle 
Millisekunde abfragen wöchtest mußt du das entprechend anpassen. 
Prinzipiell ändert sich dadurch am Algorithmus aber nichts.

1
C-Code
2
3
/*working variables*/
4
unsigned long lastTime;
5
double Input, Output, Setpoint;
6
double ITerm, lastInput;
7
double kp, ki, kd;
8
int SampleTime = 1000; //1 sec
9
double outMin, outMax;
10
bool inAuto = false;
11
 
12
#define MANUAL 0
13
#define AUTOMATIC 1
14
 
15
void Compute()
16
{
17
   if(!inAuto) return;
18
   unsigned long now = millis();
19
   int timeChange = (now - lastTime);
20
   if(timeChange>=SampleTime)
21
   {
22
      /*Compute all the working error variables*/
23
      double error = Setpoint - Input;
24
      ITerm+= (ki * error);
25
      if(ITerm> outMax) ITerm= outMax;
26
      else if(ITerm< outMin) ITerm= outMin;
27
      double dInput = (Input - lastInput);
28
 
29
      /*Compute PID Output*/
30
      Output = kp * error + ITerm- kd * dInput;
31
      if(Output> outMax) Output = outMax;
32
      else if(Output < outMin) Output = outMin;
33
 
34
      /*Remember some variables for next time*/
35
      lastInput = Input;
36
      lastTime = now;
37
   }
38
}
39
 
40
void SetTunings(double Kp, double Ki, double Kd)
41
{
42
  double SampleTimeInSec = ((double)SampleTime)/1000;
43
   kp = Kp;
44
   ki = Ki * SampleTimeInSec;
45
   kd = Kd / SampleTimeInSec;
46
}
47
 
48
void SetSampleTime(int NewSampleTime)
49
{
50
   if (NewSampleTime > 0)
51
   {
52
      double ratio  = (double)NewSampleTime
53
                      / (double)SampleTime;
54
      ki *= ratio;
55
      kd /= ratio;
56
      SampleTime = (unsigned long)NewSampleTime;
57
   }
58
}
59
 
60
void SetOutputLimits(double Min, double Max)
61
{
62
   if(Min > Max) return;
63
   outMin = Min;
64
   outMax = Max;
65
    
66
   if(Output > outMax) Output = outMax;
67
   else if(Output < outMin) Output = outMin;
68
 
69
   if(ITerm> outMax) ITerm= outMax;
70
   else if(ITerm< outMin) ITerm= outMin;
71
}
72
 
73
void SetMode(int Mode)
74
{
75
    bool newAuto = (Mode == AUTOMATIC);
76
    if(newAuto && !inAuto)
77
    {  /*we just went from manual to auto*/
78
        Initialize();
79
    }
80
    inAuto = newAuto;
81
}
82
 
83
void Initialize()
84
{
85
   lastInput = Input;
86
   ITerm = Output;
87
   if(ITerm> outMax) ITerm= outMax;
88
   else if(ITerm< outMin) ITerm= outMin;
89
}

von Thomas (Gast)


Lesenswert?

Das ganze gilt natürlich nur für einfache Regelstrecken, die zumindest 
im Arbeitsbereich einigermaßen linear sind.
Da funktioniert diese Methode aber auch sehr gut.

Bei komplexen Prozessen und hochgradig nichtlinearen Strecken ist ein 
einfacher PID Regler dann vielleicht doch nicht die richtige Wahl.
Dazu zähle ich jetzt auch eine Antriebsregelung, mit großen 
Laständerungen.
Da hilft dann evtl. eine übergeordnete Steuerung oder Beobachter, der 
die Regelparameter kontinuierlich anpasst.

Ich habe mal eine Antriebsregelung entwickelt in der bei jeder 
unerwarteten Abweichung die Streckenparameter neu identifiziert wurden.
Damit wurde dann der Regler so neu berechnet, dass die Closed Loop 
Übertragungsfunktion stets gleich blieb.

> Ansonsten ist diese Aussage per se eine Beleidung der Regelungstechnik.
Na na, komm mal runter von deinem hohen Ross.

> Das was du da schreibst ist eine "Fausformel" und funktioniert bei
> einfachen einstufigen halbwegs linearen Systemen.
Das ist aber die absolut größte Masse der Systeme.
Und bei allen anderen Systemen reicht ein simpler PID Regler eh nicht 
mehr.

> Das ist die Quick n' Dirty Variante.
Nein, diese Lösung liefert für einfache Systeme eine halbwegs optimale 
Einstellung.

von Thomas (Gast)


Lesenswert?

@Klaus Pobereit:
So wie ich Peter verstanden habe hat er bereits einen Regler.
Dieser muss nur noch parametriert werden.

von Peter H. (Gast)


Lesenswert?

Thomas schrieb:
> So wie ich Peter verstanden habe hat er bereits einen Regler.

Bisher habe ich noch keinen Regler. Ich möchte (einfach ausgedrückt) 
einen Regler erstellen, der unter den gegebenen Randbedingungen so gut 
es eben geht arbeitet. Natürlich wird er meist nicht so perfekt wie 
speziell auf die verschiedenen Regelstrecken abgestimmten Regler 
arbeiten, dafür soll er aber möglichst einfach (u.a. mit Kp, Ki, Kd) zu 
parametrieren sein.

von Thomas (Gast)


Lesenswert?

Schon mal daran gedacht einen fertigen Regler zu kaufen?

von Schlumpf (Gast)


Lesenswert?

Peter H. schrieb:
> Ich möchte (einfach ausgedrückt)
> einen Regler erstellen, der unter den gegebenen Randbedingungen so gut
> es eben geht arbeitet.


Und genau diese Randbedingungen sind offensichtlich doch sehr 
universell..

Thomas schrieb:
> Natürlich wird er meist nicht so perfekt wie
> speziell auf die verschiedenen Regelstrecken abgestimmten Regler
> arbeiten

Der Regler ist, wenn du ihn aus der Schachtel packst, dumm wie 10m 
Feldweg..
die Abstimmung auf die Regelstrecke musst DU mittels Ki, Kp und Kd 
selbst vornehmen.
Und genau daran wird es scheitern!

von Peter H. (Gast)


Lesenswert?

Thomas schrieb:
> Schon mal daran gedacht einen fertigen Regler zu kaufen?

Neben vielen anderen Dingen soll der Regler mit in einem PIC32 laufen, 
der in einer "Motorsteuerung" mit recht spezieller Hardwarebeschaltung 
eingebaut ist.
Zumindest eine Hardwarelösung wäre unvorteilhaft. Über eine gekaufte 
Softwarelösung denke ich durchaus nach.

von Karl H. (kbuchegg)


Lesenswert?

Peter H. schrieb:

> Bisher habe ich noch keinen Regler. Ich möchte (einfach ausgedrückt)
> einen Regler erstellen, der unter den gegebenen Randbedingungen so gut
> es eben geht arbeitet. Natürlich wird er meist nicht so perfekt wie
> speziell auf die verschiedenen Regelstrecken abgestimmten Regler
> arbeiten, dafür soll er aber möglichst einfach (u.a. mit Kp, Ki, Kd) zu
> parametrieren sein.


Auf Deutsch:

Unter der Annahme, dass ein PID Regler für deine Aufgabenstellung das 
Richtige ist, suchst du jemanden der dir das Programm schreibt, weil du 
aus der RN-Code-Vorgabe eines PID_Reglers
1
  e = w - x;          //Vergleich
2
  esum = esum + e;        //Integration I-Anteil
3
  y = Kp*e + Ki*Ta*esum + Kd/Ta*(e  ealt);  //Reglergleichung
4
  ealt = e;

keine komplette Funktion in der von dir benutzten Progammiersprache 
erstellen kannst.

Nenn doch die Dinge beim Namen und hör auf um den heißen Brei 
herumzureden.

von PICfan (Gast)


Lesenswert?

Peter H. schrieb:
> Zumindest eine Hardwarelösung wäre unvorteilhaft. Über eine gekaufte
>
> Softwarelösung denke ich durchaus nach.

dann nimm doch einfach die PID() function vom Microchip !!
Es ist bestandteil ihrer dsp Bibliothek von pic30F/33F.  wird aber auch 
aufm pic32 mit anpassungen laufen.

HTH

von PICfan (Gast)


Lesenswert?

noch was:

schau dir die Code Example CE019 mal an.  Es handelt um einem PID regler 
mit software dabei.

von Bronco (Gast)


Lesenswert?

Peter H. schrieb:
> Bisher habe ich noch keinen Regler. Ich möchte (einfach ausgedrückt)
> einen Regler erstellen, der unter den gegebenen Randbedingungen so gut
> es eben geht arbeitet. Natürlich wird er meist nicht so perfekt wie
> speziell auf die verschiedenen Regelstrecken abgestimmten Regler
> arbeiten, dafür soll er aber möglichst einfach (u.a. mit Kp, Ki, Kd) zu
> parametrieren sein.

Nochmal:
Grundsätzlich basiert jeder PID-Regler basiert auf dem identischen 
Algorithmus (Berechungsvorschrift):
Man berechnet den P-Anteil, den I-Anteil und den D-Anteil und addiert 
diese.
Was das Regelverhalten ausmacht, sind die Parameter.
(Vorausgesetzt, Du machst bei der Implementierung keine Fehler wie 
Variablenüberlauf.)

Ähnlich einer ganz simplen Addition:
Der Algorithmus ist immer der gleiche C = A + B.
Das Ergebnis ändert sich, wenn Du A und B änderst, aber der Algorithmus 
ist immer identisch.

Dein Annahme, daß Du den PID-Algorithmus auf die Regelstrecke anpassen 
mußt, ist gänzlich falsch: Der Algorithmus bleibt immer gleich.

Eine ganz andere Frage ist, ob der PID für Deine Regelstrecke geeignet 
ist, oder ob es besser Regler gäbe (z.B. einen simplen 2-Punkt-Regler).

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.