www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Regelungsalgorithmus?


Autor: joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin.

Es geht um eine Temperaturregelung. Von Automatisierungstechnik hab ich 
leider wenig Ahnung. Ich habe ein Heizelement und einen 
Temperatursensor. Das Heizelement wird über PWM angesteuert. Man kann 
einen Temperatursollwert einstellen und ein µC soll die PWM Aussteuerung 
so ändern, dass der Temperaturmesswert möglichst schnell den Sollwert 
erreicht.
Im Moment habe ich einfach die Temperaturdifferenz von Mess-Soll 
ausgerechnet und wenn sie negativ ist, wird die Aussteuerung erhöht und 
wenn sie positiv ist, verringert und weil das Heizelement recht träge 
ist, passiert das hochzählen etwa in 100ms Abständen, damit er quasi 
nicht nur 100% und 0% Aussteuerung fährt.

Das Problem bei dieser Lösung ist, dass das Abkühlen langsamer ist als 
das Aufheizen, d.h. beim Hochfahren auf T_soll wird T_soll etwa um 10° 
überschritten. Danach geht er wieder runter und erreicht fast direkt den 
Sollwert. Allerdings dauert das ganze ca 1,5 Minuten bis der Wert stabil 
ist.
Wenn man direkt mit 100% heizt, wird der Maximalwert des Elements recht 
schnell erreicht. Ich schätze mal 20-30s.
Was für eine Regelung könnte ich relativ einfach Implementieren, die mir 
meinen Sollwert schneller bringt? Ich benutze einen Atmega8 mit 
Assembler, also es sollte kein zu komplizierter Algorithmus sein.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probiers doch mal mit einer "Gradientenbegrenzung" beim Aufheitzen, d.h. 
nicht mehr heizen, wenn der Gradient X °C/s überschreitet. Weiterhin 
musst du deine 100% Ansteuerung "frühzeitig = X °C vor Erreichen der 
Soll-Temperatur " auf Werte kleiner 90% drosseln.

Autor: doll (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das richtig gelesen habe,
benutzt Du einen P(roportional)-regler.

Die neigen zum von Dir beschriebenen Überschwingen.

Stichwort wäre PID.

Dazu findet sich auch einiges im Netz.

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was für eine Regelung könnte ich relativ einfach Implementieren,
> die mir meinen Sollwert schneller bringt? Ich benutze einen
> Atmega8 mit Assembler, also es sollte kein zu komplizierter
> Algorithmus sein.

Natuerlich kann man soetwas auch in Assembler machen, auch wenn es
Unsinn ist sich das Leben unnoetig schwer zu machen. Wie kompliziert
dein Regler wird haengt aber allein von deiner Strecke ab und nicht
von deiner Faulheit.

Deine Strecke duerfte wahrscheinlich PT1 Verhalten zeigen, vielleicht
sogar PT2 wenn dein Temperaturfuehler nicht direkt neben deinem
Heizwiderstand ist. Letzteres solltest du dringenst vermeiden.

Es empfiehlt sich in der Tat einen PID-Regler zu verwenden. Dann 
solltest du einmal einen Eingangssprung anlegen und so die Parameter 
deiner Strecke messen. Desweiteren empfiehlt es sich mal an 
auszuprobieren wieviel
Prozent Heizleistung du fuer deine Solltemperatur brauchst.
Wenn du deine Hardware so ausgelegt hast das du etwa 70-80% Heizleistung 
fuer die Solltemperatur benoetigt dann kannst du die Parameter des PID 
Reglers erstmal mit den ueblichen Verfahren berechnen. Danach noch ein 
bisschen von Hand optimieren und das ganze laeuft.


Solltest du verschiedene Sollwerte anfahren wollen die weit auseinander 
liegen so wirst du wohl einen adaptiven Regler brauchen. Im einfachsten 
Falle dann an mehreren Stellen die Parameter ausprobieren/messen, eine 
Ausgleichgerade zeichnen. Pruefen ob man mit einer Funktion 2, 3 oder 
gar 4 Ordnung hinkommt und dann je nach Sollwert andere Regelparameter 
berechnen. Du musst zur Berechnung natuerlich die Werte sinnvoll 
skalieren. Auf einem 8Bit Controller noch dazu in Assembler natuerlich 
ziemlich uebel.
Besonders Funktion zur berechnung des maximalen I-anteils kann 
aufwendiger
werden und ist fuer dein Ueberschwingen sehr wichtig.

Ein PID Regler ist im uebrigen nicht kompliziert. Kompliziert kann es 
dagegen sein die Regelparameter zu ermitteln. Also kann der dumme 
Algorythmus in deinem dummen Mega8 laufen, und die schlauen Parameter 
entstehen in deinem schlauen Kopf. :-)

Ich halte im uebrigen eine Abtastzeit von 0.1s fuer unoetig kurz falls 
du nicht eine sehr kleine thermische Masse regelst oder grobe 
Stoergroessen erwartest. Ich wuerde 1s empfehlen.

Es empfiehlt sich auch sich am Controller einen seriellen Ausgang zu 
schaffen und dort dann einmal pro Sekunde Istwert, Sollwert, Kp, Ki, Kd, 
Imax, PWM-% auszugeben. Das erleichtert es sehr seinen Regler zu 
parametrisieren.

Und bevor du programmierst, alles einmal von Hand durchrechnen und 
pruefen welche Zahlen da vorkommen, damit du weisst mit welchem Faktor 
du skalieren musst, welche Variablenbreiten notwendig sind, und ob es zu 
einem Registerueberlauf kommen kann.

Und ein Buch ueber Regelungstechnik kann auch nicht schaden. .-)

> Dazu findet sich auch einiges im Netz.

Was ich bisher im Netz gesehen habe war alles gut geeignet um einen
die Sache nochmal vor Augen zu fuehren nachdem man die Regelungstechnik-
vorlesung gehoert habe. Aber wenn man noch garkeine Ahnung hat wird man
ohne ein Buch nicht weit kommen.

Und wenn man keine Ahnung hat und daran nichts aendern will, dann
schmeisst man den Mega8 weg und baut sich einen analogen Regler wo
man einfach nach Gefuehl die Werte mit drei Potis einstellt. :-D
Ich glaube im Tietze und Schenk war eine Schaltung die zeigt wie
das unabhaengig geht.

Olaf

Autor: Di Pi (drpepper) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
float regeln(float istWert, float sollWert) {
  float diff = sollWert - istWert;
  esum = esum + diff;
  y = K_P * diff + K_I * T_A * esum + K_D * (diff - diffalt) / T_A;
  diffalt = diff;
  if (y > STELL_LIMIT)
    y = STELL_LIMIT;
  else if (y < -STELL_LIMIT)
    y = -STELL_LIMIT;

  return y;
}

Ersetze float durch einen Typ deiner wahl :) (bei deinen Zeitkonstanten 
wirst du wahrscheinlich aber auch mit 'float' bei 8Bit und 0,5MHz Takt 
eine ausreichende Regelfrequenz erreichen.)

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Deine Strecke duerfte wahrscheinlich PT1 Verhalten zeigen
Mit größer Wahrscheinlichkeit, Ja!

>sogar PT2 wenn dein Temperaturfuehler nicht direkt neben deinem
>Heizwiderstand ist.
Nö, der Tempfühler ändert nix an der Strecke!
Lediglich die Rückführung (Tempfühler) hat halt auch PT1-Charakter.

>Letzteres solltest du dringenst vermeiden.
Seh' ich unkritisch!
2x PT1 (geschlossener Kreis) bedeuten noch lange keine Instabilität!

>Es empfiehlt sich in der Tat einen PID-Regler zu verwenden.
In der Theorie ist der PID dem PI an Schnelligkeit deutlich überlegen. 
Allerdings muss die Geschwindigkeit irgendwo herkommen... und zwar aus 
einer (wenn auch nur kurzzeitig) sehr hohen Heizleistung zu Beginn der 
Regelung, die um ein vielfaches höher ist, als die Heizleistung im 
eingeschwungenen stationären Zustand. Da eine solch hohe Leistung 
vermutlich nicht zur Verfügung steht, wäre der D-Anteil der Regelung eh' 
verschwindend gering, womit man gleich beim PI-Regler bleiben kann. 
Hätte gleich den Vorteil, dass man ohne D-Anteil weniger störanfällig 
wird!
Hinzu kommt noch die beschriebene Trägheit beim Abkühlen. Die kann 
selbst ein PID nicht per "negativer" Heizleistung bechleunigen ;-)

>Ich halte im uebrigen eine Abtastzeit von 0.1s fuer unoetig kurz
Ich halte sie für optimal.
Ich würde Messungen des Temperaturfühlers sowieso noch per gleitendem 
Mittelwert filtern. Dann wäre die Abtastrate trotz Filterung noch 
ausreichen klein gegenüber den domierenden Streckenzeitkonstanten, womit 
man einerseits den Mittelwertfilter als auch das Abtasthalteglied 
veranchlässigen könnte und eine quasi-kontinuierliche Regelung entwerfen 
kann!
-> PI-Regler mit Kompensation der dominierenden Zeitkonstante(n) des 
Systems

>Und wenn man keine Ahnung hat und daran nichts aendern will, dann
>schmeisst man den Mega8 weg und baut sich einen analogen Regler wo
>man einfach nach Gefuehl die Werte mit drei Potis einstellt. :-D
Mit einer digitalen Regelung ist man weitaus besser bedient und sehr 
viel flexibler in der Parametrierung. Die dafür notwendige Ahnung 
braucht man in beiden Fällen!

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> >Letzteres solltest du dringenst vermeiden.
> Seh' ich unkritisch!

Kannst du das mal begruenden? Soweit ich mich erinnere wird
der Abstand Fuehler zum Heizelement in der Fachliteratur als besonders
kritisch angesehen und ich bin mir auch relativ sicher das mein
Regelungstechnikprof darueber auch mal ein Wort verloren hat.

Ich zitiere mal aus Elementare Regelungstechnik/Busch s.187:

   P-T2-Verhalten zeigt z.B eine Temperaturregelstrecke,
   wenn der Messwert nicht direkt an der Heizwicklung
   aufgenommen wird. Zur Verzoegerung der Heizwicklung
   kommt dann noch die verzoegerte Uebertragung einer
   Temperaturaenderung von der Heizwicklung zum
   Messfuehler.


> Da eine solch hohe Leistung vermutlich nicht zur Verfügung
> steht, wäre der D-Anteil der Regelung eh' verschwindend
> gering, womit man gleich beim PI-Regler bleiben kann.

Hast du eigentlich schonmal so einen Regler aufgebaut? Durch richtige, 
und relativ grosse, Wahl des D-Anteil habe ich so eine Regelung schon 
dazu gebracht einen linearen Anstieg bis auf den Sollwert zu machen. 
Also ohne ein nennenswertes Ueberschwingen.
Aber letztlich wissen wir ja garnicht wie die Strecke aussieht. Ich 
wuerde also im Zweifel immer einen PID nehmen, und wenn man wirklich 
ohne D-Anteil auskommt dann wird Kd eben null.

Nochmal ein Zitat aus obigen Buch:

   Auch mit PI-Regler kann das System bei verkehrter Parameterwahl
   instabil werden.
   [..]
   Optimal zur Regelung einer PT2-Strecke ist ein PID-Regler, der
   allerdings kompliziert einzustellen ist.

Bei einer reinen PT1 Strecke geht der Autor zwar auch davon aus das
man keinen D-Anteil braucht, aber wenn man wirklich kein Ueberschwingen
haben will dann waer ich da vorsichtig. Die Frage ist naemlich
ob man wirklich ganz sicher keine zweite Verzoegerungszeit hat sonst
wird man naemlich sein blaues Wunder erleben.

> Ich würde Messungen des Temperaturfühlers sowieso noch per gleitendem
> Mittelwert filtern.

Auch dafuer haette ich gerne mal eine Begruendung. Schliesslich machst 
du damit doch deine Regelstrecker aus der Sicht des Reglers 
komplizierter weil du eine neue zeitabhaengige Groesse einfuehrst. Warum 
willst du das machen?
Ich sehe da keinen Vorteil.

Olaf

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hast du eigentlich schonmal so einen Regler aufgebaut?
Allerdings. Aktuelles Projekt, gerade in der Serieneinführung.

>Kannst du das mal begruenden? Soweit ich mich erinnere wird
>der Abstand Fuehler zum Heizelement in der Fachliteratur als besonders
>kritisch angesehen und ich bin mir auch relativ sicher das mein
>Regelungstechnikprof darueber auch mal ein Wort verloren hat.
Ich denke, jedem ist klar, dass der Fühler so nah wie möglich am 
Heizelement angebracht werden sollte. Insbesondere wenn die Temperatur 
des Heizelements geregelt werden soll. Wenn der Fühler weiter weg ist, 
erhöht sich entsprechend die Zeitkonstante der Rückführung, wodurch der 
Regler insgesamt langsamer ausgelegt werden muss um stabil zu bleiben. 
Genau der Grund, warum sich ein "schneller" PID oft gar nicht lohnt.

>Durch richtige, und relativ grosse, Wahl des D-Anteil habe ich so eine
>Regelung schon dazu gebracht einen linearen Anstieg bis auf den Sollwert
>zu machen.
Wenn die Stellgröße das mitmacht, spricht ja nix dagegen!
Ich kann nur aus eigener Erfahrung sagen, dass mein Regelkreis sich zu 
Beginn der Aufheizphase in der Stellgrößenbegrenzung befindet. Schneller 
geht also gar nicht. Und die Heizleistung so "übermäßig" hoch zu 
dimensionieren, damit ein PID sich wirklich austoben kann, wird 
aufwändiger und teuerer. Wenn man's braucht... tja dann muss man halt 
;-)

>Auch mit PI-Regler kann das System bei verkehrter Parameterwahl
>instabil werden.
Unbestritten, hab ich aber auch nicht behauptet.

>Bei einer reinen PT1 Strecke geht der Autor zwar auch davon aus das
>man keinen D-Anteil braucht, aber wenn man wirklich kein Ueberschwingen
>haben will dann waer ich da vorsichtig.
Ich wusste nicht, dass der TE kein Überschwingen haben darf/will.
Aber nur durch die Wahl eines PID gegenüber einem PI ist das auch noch 
lange nicht gewährleistet!

>> Ich würde Messungen des Temperaturfühlers sowieso noch per gleitendem
>> Mittelwert filtern.
>Auch dafuer haette ich gerne mal eine Begruendung. Schliesslich machst
>du damit doch deine Regelstrecker aus der Sicht des Reglers
>komplizierter weil du eine neue zeitabhaengige Groesse einfuehrst.
Nö, sagte ich doch! Durch die Wahl der kleinen Abtastzeit gegenüber der 
dominierenden Zeitkonstante des Systems kann man das vernachlässigen!

>Warum willst du das machen?
Jede ADC-Messung hat Quantisierungsrauschen. Ausserdem ist jede analoge 
Messung durch digitale Schaltungsteile (µC), durch Schaltvorgänge (PWM) 
und womöglich durch Schaltregler potentiell störgefährdet. Ich mache bei 
ADC-Messungen immer eine Mittelung!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.