Forum: Mikrocontroller und Digitale Elektronik Was steckt hinter der "Abtastzeit" beim digitalen PID Regler?


von W. M. (muhh)


Lesenswert?

Hey Leute,

ich möchte einen digitalen PID Regler auf einem Arduino Due, aber mit 
dem ASF, realisieren. Geplant ist einen Timer einzusetzen, der mit einer 
Zeit Ttim periodisch ein Interrupt auslöst, in dem die Berechnung für 
den Regler erfolgt. Die Abtastrate Ta des AD-Wandlers soll 1MS/s 
betragen.

Ich habe im Artikel Regelungstechnik von RN-Wissen nachgelesen, dass die 
Zeit Ta/2 für einen quasi-kontinuierlichen Betrieb viel kleiner sein 
sollte, als die dominierende Zeitkonstante der Regelstrecke (ich glaube 
in meinem Fall liegt ein einfaches PT1 Glied vor).

Nun meine Frage, die hoffentlich nicht zu doof gedacht ist.

Wenn ich die Periodendauer Ttim des Timers auf 1ms festlege und beim 
Auslösen des Interrupts gleichzeitig AD wandle, ist die eigentliche 
Abtastrate zwar immer noch 1MHz, aber um abzuschätzen, ob ich mit dem 
Regler quasi-kontinuierlich Arbeite, muss ich doch die Periodendauer 
Ttim mit meiner Zeitkonstante T1 der Regelstrecke vergleichen oder liege 
ich da flasch?
Habt ihr vielleicht ein paar Erfahrungswerte für mich, um welchen Wert 
ich meine "Abtastrate" kleiner als die Zeitkonstante T1 machen muss?

Vielen Danke und einen schönen Abend
Willy :)

von Dispol (Gast)


Lesenswert?

>um welchen Wert ich meine "Abtastrate" kleiner als die Zeitkonstante T1 machen 
muss?
Man sagt so Faktor 10.

von grüner Krauterer (Gast)


Lesenswert?

Ich empfehle eine Simulation um dies zu erforschen. Wichtig dabei sind 
auch die Nichtlinearitaeten. Fuer Nilchtlineare System kann man 
uebrigens einen Grossteil der Theorie ueber Bord schmeissen. Ich sag mal 
Faktor 10 schneller als Tau ist ein guter Anfang.

Das Stellglied sollte es dann auch bringen...

von Amateur (Gast)


Lesenswert?

... im Grunde nichts anderes, als der zeitliche Abstand zwischen zwei 
Messungen bzw. Regelvergleichen.

Da die digitale Regelung nichts anderes ist als ein Zyklus aus:
Zeit ermitteln + messen + berechnen.

Man kann mit diesem Zyklus eine Vollbeschäftigung der CPU erreichen oder 
im anderen Extrem, Reglerbedingt, einige tolle Überläufe produzieren.

Keiner kann Dir verwehren, die Temperatur einer großen Masse (z.B. Raum) 
im Mikrosekundentakt zu erfassen. Nur tut sich dabei nichts.
Auch kann Dir Keiner verwehren die Bahn eines Flugkörpers alle Sekunde 
zu prüfen. Dabei sollte man aber die Beschleunigungssensoren im "Auge" 
behalten, sonst bekommst Du den Crash gar nicht mit.

von W. M. (muhh)


Lesenswert?

grüner Krauterer schrieb:
> Ich empfehle eine Simulation um dies zu erforschen.

Meine Ausgangsgröße ist der DutyCycle einer PWM. Muss ich um die 
Sprungantwort des Systems aufzunehmen einfach nur die Regelstrecke mit 
einem normalen Sprung beaufschlagen oder muss ich die Sprungantwort 
durch die PWM mit plötzliche Erhöhung des DutyCycle aufnehmen?

von W. M. (muhh)


Lesenswert?

Amateur schrieb:
> Man kann mit diesem Zyklus eine Vollbeschäftigung der CPU erreichen oder
> im anderen Extrem, Reglerbedingt, einige tolle Überläufe produzieren.

Könntest du auf die Überlaufe genauer eingehen? Meinst du den Integrator 
der Überlaufen kann? Ich habe da irgendwann mal gehört, dass es da zu 
Problemen kommen kann.

von grüner Krauterer (Gast)


Lesenswert?

>Meine Ausgangsgröße ist der DutyCycle einer PWM.

Dabei wuerde ich pro Zyklus, falls moeglich, auf Ueberstrom pruefen, und 
den PWM Wert alle Reglerperioden aendern. Wenn das 1000 PWM Perioden 
sind, was solls. Massgebend ist das Zeitverhalten des Systems.

von Karl H. (kbuchegg)


Lesenswert?

W. M. schrieb:
> Amateur schrieb:
>> Man kann mit diesem Zyklus eine Vollbeschäftigung der CPU erreichen oder
>> im anderen Extrem, Reglerbedingt, einige tolle Überläufe produzieren.
>
> Könntest du auf die Überlaufe genauer eingehen? Meinst du den Integrator
> der Überlaufen kann? Ich habe da irgendwann mal gehört, dass es da zu
> Problemen kommen kann.

Überleg mal logisch.

Wenn dein Regler eine Heizung betreut und alle Zehntelsekunde die 
Reglergleichung laufen lässt. Er detektiert, dass es zu kalt ist und aus 
diesem Grund dreht er die Heizung auf. Dumm an der ganzen Sache ist nur, 
dass es 4 Stunden dauert, bis die Produktionshalle auch nur um 2 Grad 
wärmer geworden ist. Der Regler vergleicht aber alle 1 Zehntelsekunden 
die Solltemperatur mit der Isttemperatur und da das eine halbe Stunde 
dauert, bis er überhaupt mal eine Temperaturzunahme feststellen kann, 
dreht er die Heizung immer weiter und immer weiter und immer weiter auf. 
Das Spielchen geht so lange, bis sich seine Fehlersumme in astronmische 
Höhe aufgeschaukelt hat und dann endlich nach 4 STunden das gegenteilige 
Problem entsteht: Der Regler braucht erst mal wieder eine halbe Stunde 
bis er die Fehlersumme soweit wieder reduziert hat, dass er dann das 
erste mal die Heizung wieder ausschaltet. Nur halt leider eine halbe 
Stunde zu spät, in der die Halle weiter geheizt wurde, obwohl es 
eigentlich schon warm genug ist.

anderes, biologisches Beispiel: wenn du beim Autofahren eine nervöse 
Hand hast und sofort rasend schnelle Lenkbewegungen machst, dann wirst 
du keine einzige Kurve vernünftig durchfahren können sondern dauern im 
Zickzack um die Kurve rumschleudern.

zu langsam regeln ist nichts. zu schnell regeln aber auch nicht. Die 
Anzahl der Korrekturen muss in einem vernünftigem Verhältnis zur 
Reaktion des Systems stehen. Das genannte Steuer Beispiel ist gar nicht 
so realitätsfern. Wer das erste mal am Steuerrad eines SChiffes steht 
hat meistens genau dieses Problem, dass er viel zu schnelle Korrekturen 
macht auf die das Schiff gar nicht reagieren kann. Da keine Reaktion 
kommt dreht er noch mehr am Ruder und noch mehr, bis dann endlich die 
Drehung einsetzt - natürlich viel zu schnell wodurch er wieder in die 
andere Richtung korrigieren muss. Diese Leute erkennt man daran, dass 
sie es nicht schaffen ganz einfach gerade aus zu fahren.

: Bearbeitet durch User
von Ulrich H. (lurchi)


Lesenswert?

Zum testen des System könnte man auch die normale Sprungantwort messen. 
Das ist ja ein Sprung von 0% auf 100% PWM Wert. Es kann allerdings sein, 
das damit die Antwort zu groß wird und so etwas wie maximal zulässige 
Grenzen des Systems erreicht werden. Von daher muss man beim Sprung ggf. 
doch einen kleineren Sprung machen.

Ein Alternative, ist es die Impulsantwort zu messen, also mit einen 
kurzen Puls als Anregung zu messen. Das gibt im Prinzip die Ableitung 
der Sprungantwort und kann ähnlich wie die Sprungantwort zum Abgleich 
des Reglers genutzt werden, teils sogar einfacher. Einstellregeln gibt 
es für beide Fälle.


Das ein zu langsames Abtasten nicht gut geht, kann man sich zu erklären: 
Man verliert mit langer Abtastzeit immer an Reaktionszeit. Das D Glied 
nutzt man um etwa um die Vorhaltezeit in die Zukunft zu schätzen. Es 
sollte der Verlust durch langsames Abtasten also kurz gegen den Gewinn 
durch das D Glied sein.

Die Abtastzeit des Regler gibt so etwas wie eine zusätzliche 
Tiefpassfilterung. Wenn man sehr schnell abtastet, muss man ggf. eine 
passende Filterung zusätzlich explizit einbauen, denn die einfache 
Differenzbildung für die Ableitung gibt zunehmend mehr Rauschen wenn die 
Zeit kürzer wird. Die Filterfrequenz ist ein 4. Parameter für das Tunen 
des PID Reglers, der öfter verschwiegen wird oder einfach über einen 
mehr oder weniger passenden Faktor an die Vorhalte-Zeit gekoppelt wird. 
Je nach System kann eine andere Filterfunktion und damit Abtastzeit 
passend sein. Dabei geht es nicht nur um die Dynamik des Systems, 
sondern auch das Rauschen.

von Falk B. (falk)


Lesenswert?

@ Karl Heinz (kbuchegg) (Moderator)

>zu langsam regeln ist nichts. zu schnell regeln aber auch nicht. Die
>Anzahl der Korrekturen muss in einem vernünftigem Verhältnis zur
>Reaktion des Systems stehen.

Ja. Aber in deiner Erklärung werden zwei Dinge ungünstig vermischt. Die 
Abtastfrequenz des Reglers und die Zeitkonstanten der Reglestrecke.
Man KANN auch eine Heizung mit 10 Hz Abtastfrequenz reglen, ohne dass 
dabei die Reglung schwingt. Man muss so oder so die Zeitkonstanten den 
der Regelung sowohl an die Regelstrecke als auch an die Abtastfrequenz 
anpassen. Sprich, bei 10 Hz addiert dein Integrator pro Schritt nur 
0,001, wo er bei 1 Hz eben 0,01 addiert. In beiden Fällen ist die 
Regelung stabil und auch schnell genug.
Ein zu hohe Abtastfrequenz schadet im Prinzip nie, eine zu niedrige aber 
schon. Die Zeitkonstanten bzw. Gewichtungsfaktoren KP, KI und KD sind 
eine andere Sache.

>so realitätsfern. Wer das erste mal am Steuerrad eines SChiffes steht
>hat meistens genau dieses Problem, dass er viel zu schnelle Korrekturen

Der Mensch als Regler. Dazu hatte ich mal ne Vorlesung ;-)
Dort hieß es, der Mensch hat ca. 4 Hz Bandbreite. Naja.

von Olaf (Gast)


Lesenswert?

>  Wer das erste mal am Steuerrad eines SChiffes steht
> hat meistens genau dieses Problem,

Das ist zwar ein schoenes Beispiel, aber leider falsch. Die Abtastzeit 
gewichtet die Regelparameter. Du kannst beliebig schnell abtasten wenn 
du dafuer deine Regelparameter verkleinerst. Waere es anders wuerden 
lineare Regler nicht funktionieren.
Das es in der Praxis natuerlich keinen Sinn macht und nur unnoetig 
Rechenzeit verschleudert wenn man sehr schnell abtastet ist davon 
natuerlich unberuehrt. Ausserdem muesste man dann auch irgendwann ueber 
Rundungsfehler nachdenken.

Die minimal Abtastzeit kommt daher weil man sich ein quasi analoges 
Verhalten wuenscht um den mathematischen Ueberbau verwenden zu koennen 
um die Regelparameter zu bestimmen. Wuerde man zu langsam abtasten 
haette man irgendwann kein LTI System mehr.

Olaf

von W. M. (muhh)


Lesenswert?

Danke für die vielen Antworten :)

Also ich Taste zwar mit 1MHz ab, aber nur ein Wert pro ms. So war das 
gemeint. Durch die Abtastrate könnte ich Aufwand für den Anti-Aliasing 
Filter reduzieren. Dann reicht vielleicht sogar ein Filter 2. Ordnung.

Ulrich H. schrieb:
> Zum testen des System könnte man auch die normale Sprungantwort messen.
> Das ist ja ein Sprung von 0% auf 100% PWM Wert. Es kann allerdings sein,
> das damit die Antwort zu groß wird und so etwas wie maximal zulässige
> Grenzen des Systems erreicht werden. Von daher muss man beim Sprung ggf.
> doch einen kleineren Sprung machen.

Ich hatte die Sprungantwort vom meiner Regelstrecke (Wastegate Aktor 
eines Turboladers) gemessen, sah sehr nach einem P-T1-T0 Glied aus. 
Allerdings konnte ich die Messergebnisse bisher nicht auswerten. Liegen 
aber als csv vor.

Aber ich möchte das Ganze lieber nochmals mit einem Sprung des 
DutyCycles messen.

grüner Krauterer schrieb:
>>Meine Ausgangsgröße ist der DutyCycle einer PWM.
>
> Dabei wuerde ich pro Zyklus, falls moeglich, auf Ueberstrom pruefen, und
> den PWM Wert alle Reglerperioden aendern. Wenn das 1000 PWM Perioden
> sind, was solls. Massgebend ist das Zeitverhalten des Systems.

Das verstehe ich nicht ganz. Also bei jedem ISR Durchlauf auf Überstrom 
prüfen und ggf. die PWM begrenzen oder komplett ausschalten? Und wie ist 
das gemeint mit den PWM Wert alle Reglerperioden ändern?

Entschuldigt wenn ich gerade ein wenig auf dem Schlauch stehe, digitale 
Regler sind komplettes Neuland für mich, ich brauche glaub ich ein wenig 
bis ich damit warm werde.

von Stefan F. (Gast)


Lesenswert?

Bei einem kleinem Fahr-Roboter (Nibobee) habe ich mit 100ms Intervallen 
gearbeitet, was auf Anhieb gut klappte.

Es gibt dabei keinen Zusammenhang zur PWM Frequenz, de viel höher liegt.

Ich habe mir dabei überlegt, wie lange wohl so ein Motor baucht, um 
seine Drehzahl zu ändern. Das es keine einstelligen Millisekunden sein 
werden, war klar. Und dann habe ich mir überlegt, wie schnell der 
Roboter wohl lenken muss, um eine falsche Fahrtrichtung zu korrigieren. 
Eine Sekunde wäre bei dem verfügbaren Platz zu langsam.

So bin ich dann auf die 100ms gekommen. Wenn es damit nicht geklappt 
hätte, hätte ich 10ms versucht.

von Stefan F. (Gast)


Lesenswert?

> digitale Regler sind komplettes Neuland für mich

Das war es für mich auch. Mir hat es geholfen, erstmal einen analogen 
PID Regler für eine Raumheizung (als Modell) zu implementieren. Und zwar 
alle drei Stufen zuerst einzeln und dann kombiniert.

So konnte ich mit mir vertrauten mitteln die Eigenschaften der drei 
Stufen ausprobieren, was mir sehr geholfen hat, sie zu verstehen.

Die anschließende Umsetzung in Software war danach ein Kinderspiel.

von Olaf (Gast)


Lesenswert?

> Das war es für mich auch. Mir hat es geholfen, erstmal einen analogen
> PID Regler für eine Raumheizung (als Modell) zu implementieren.

Das kann ich nur jedem raten! Es muss noch nichtmal als Modell sein. Man 
kann das auch analog machen. Dann kann man mit den drei Potis fuer Kp, 
Ki und Kd spielen und ein Gefuehl fuer die Wirkung 
bekommen.(Tietze/Schenk)

Und danach sollte man sich dann mal ein paar Fragen stellen:

Wie komme ich an optimale Werte fuer Kp, Ki, Kd?

Wenn es dafuer einfache Herleitungen gibt. (Ziegler/Nichols) Was setzen 
die eigentlich voraus? Linearitaet? Wieso?

Wenn ich von einem analogen in ein digitales System uebergehe, was ist 
da eigentlich der Unterschied? Oder noch besser wie muss ein digitales 
System aussehen damit es nicht mehr von einem analogen zu unterscheiden 
ist? Und warum ist das wichtig.

Wenn der Regelungskram schon so kompliziert ist das man davon nur Teile 
in endlicher Zeit begreifen kann, was fuer Tricks gibt es mit diesen 
Teilen zum Ziel zu kommen. (Kaskadenregelung)

Ich denke wenn man so vorgeht kann man begreifen was Regeln bedeutet und 
warum es so schwer ist. Und immer fleissig spielen! (z.B Gefuehl fuer 
die Bedeutung der Totzeit bekommen)

Der andere Weg ist das Nachrichtentechnikstudium wo dann der 
Mathematische Ansatz durchgezogen wird. Ich sag mal so, dass kann auch 
Spass machen muss aber nicht. :-)

Idealerweise muss man aber beide Wege gehen. Nur Matlab alleine reicht 
nicht! Einfach weil die Modelle nicht unendlich genau/gut sind. Das ist 
genaus wie mit LT/Spice. Es gibt einen Unterschied zwischen Theorie und 
Praxis. .-)

Olaf

von Ulrich H. (lurchi)


Lesenswert?

Sofern die Zykluszeit (also die Zeit zwischen zwei neu berechneten 
Werten des Reglers) kurz genug ist, gibt es keinen wesentlichen 
Unterschied mehr zwischen dem zeitdiskreten digitalen PID Regler und 
einem analogen PID Regler.

Bei der Implementierung des D Gliedes gibt es aber unterschiedliche 
Wege, weil es ein ideales D-Glied beim realen Regler nicht gibt, nicht 
geben kann. Die Zykluszeit hat ggf. einen Einfluss darauf was man als 
Näherung für das D-Glied bekommt bzw. wählt.

Die einfachste Näherung für die Steigung ist die Differenz der letzten 
beiden Werte geteilt durch die Zykluszeit. Bei zu langer Zyklusszeit 
wird die Reaktion zu langsam, weil hohe Frequenzen verloren gehen. Bei 
zu kurzer Zykluszeit bekommt ein Rauschproblem, weil auch auf sehr 
hochfrequente Anteile reagiert wird. Das Rauschproblem kann man durch 
eine zusätzliche Filterung des D-Anteils reduzieren, so dass man ohne 
Einschränkung schnell Abtasten kann. Man hat dann die Filter-Parameter 
(insbesondere Grenzfrequenz) als zusätzlichen Parameter, der nicht mehr 
an die Zykluszeit gekoppelt ist. Meist hat die eher schnelle Abtastung 
mit expliziter Filterung Vorteile gegenüber einer Filterung über die 
Zykluszeit bzw. den Anti-Aliasing Filter.

Ein logische Wahl für die Zyklusszeit des Reglers ist es für jede PWM 
Periode einen neuen Wert zu berechnen, möglichst so das der Wert auch 
ohne große Verzögerung übernommen werden kann, also gerade nicht am 
Anfang der PWM Periode (Überlauf Interrupt beim PWM Timer), sondern eher 
kurz vor dem Ende. Die Frage ist dann ggf. noch ob die PWM Frequenz hoch 
genug ist.

von Stefan F. (Gast)


Lesenswert?

Mit Modell meinte ich, statt Wohnzimmer und Gastherme eine Styroporkiste 
mit Glühlampe als Heizung zu verwenden.

von Olaf (Gast)


Lesenswert?

> Mit Modell meinte ich, statt Wohnzimmer und Gastherme eine Styroporkiste
> mit Glühlampe als Heizung zu verwenden.

Ach so, ein 3D-Modell. :-)

Ist natuerlich auch super. Probier mal aus was es fuer einen Unterschied 
macht wenn der Temperaturfuehler verschieden weit von der Gluehlampe 
entfernt ist. Da kann man eine Menge draus lernen.

Olaf

von grüner Krauterer (Gast)


Lesenswert?

Einen digitalen Regler implementiert man natuerlich kommunizierend. 
Damit kann man Werte zur Laufzeit aendern und anzeigen. Alle Parameter, 
auch die Zykluszeit sind dann veraenderbare Variablen.

von Matu (Gast)


Lesenswert?

Hallo

Um die ganze Sache mal zusammen zu fassen:

1. Ist die Abtastzeit im Regler einstellbar, so kann die Abtastzeit in 
Abhängigkeit der Regelstrecke gewählt werden.Es gibt Faustformeln um Ta 
über Tu, Tg und T95 zu ermitteln.

2. Die Abtastzeit sagt nur aus wie oft die Regelgröße pro Zeiteinheit 
gelesen wird(Shannon) und ist unabhängig von den Einstellparametern Kpr, 
Tn und Tv.

3. Reglereinstellungen nach CHR und ZN lassen sich durchaus auch für 
digitale Regler verwenden wenn die Parameter des Reglers passend sind.
(Im englischen Sprachraum werden für die Parametruierung von PID Reglern 
Ki, Kd und Kpr genutzt. Üblich in Deutschland Kpr, Tn und Tv.

4. Ein Regelkreismodell kann leicht über einen Arduino mit wenig Aufwand 
aufgebaut werden. Analogausgang D11 als Reglerausgang y, A0 zum lesen 
der Regelgröße x. Als Regelstrecke dient im einfachsten fall ein RC 
Tiefpass (1M und 4,7µ) das ergibt eine T1 Regelstrecke einer 
Zeitkonstante von 4,7s.
Graphisch kann die Regelgröße x über den "ComGrapher" via serieller 
Schnittstelle angezeigt werden.



5. Der Sketch für einen einfachen Pi-Regelkreis könnte so aussehen:

/********************************************************
 *PI-Regelkreis
 * Lesen der Regelgröße am Analogeingang0
 * Ausgang der Stellgröße Y ist PWM Ausgang D11
 * Die Führungsgröße ist w , Regeldifferenz e
 *SerialCmGrapher: CH1=260. CH2=260, 9200
 ********************************************************/
//Variablendeklaration
int e=0;
int w=100;
int x=0;
int y=0;
int Kp=2;
int Ki=1;
int esum=0;
float Ta=0.1;    // Abtastzeit 100ms
//Initialisieren


void setup()
{
   analogWrite(11,0);            //Herunterfahren der Regelstrecke
   delay(10000) ;                //Warten bis Regelstrecke unten ist
   Serial.begin(9600);           //Serielle Kommunikation Konfigurieren
  }

void loop()
{
  x = analogRead(0);      // lesen der Regelgröße
  x=x/4;                  // anpassen der Regelgröße 1024->255
  e=w-x  ;                //bilden der Regeldifferenz
  esum=esum + e;
  y=(Kp*e)+(Ki*esum*Ta);             //Regelalgorithmus
    if(y >254)      // begrenzen der Ausgangsspannung des Reglers auf 
255
      {
        y=255;
      }
  analogWrite(11,y);            //Ausgabe der Stellgröße Y
  Serial.print(x);             // Serielle Ausgabe auf ComGrapher
  Serial.print("; ");
  Serial.print(y);
  Serial.println(" ");
delay(100);                //entspricht der Abtastzeit
}

noch Fragen?

Matu

von Ulrich H. (lurchi)


Lesenswert?

Für den Arduino gibt es bereits eine fertige PID library:
http://playground.arduino.cc/Code/PIDLibrary

Da ist auch schon eine Erklärung mit dabei.

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.