Hallo,
ich habe eine Schaltung implementiert, die mit einem solid-state relais
(SSR) eine Herdplatte ansteuert.
Ich moechte nun die Temperatur der Herdplatte mit einem PID Regler
regeln, wobei der Temperaturbereich bei 0-250°C liegen soll.
An der Unterseite der Herdplatte ist dazu ein Thermoelement angebracht,
ueber welches ich die aktuelle Temperatur der Herdplattenmitte bekomme.
Basierend auf der Atmel Appnote AVR221 habe ich einen PID Regler
implementiert und moechte nun nach Ziegler–Nichols die PID Werte
ermitteln.
Bevor ich damit beginne, habe ich allerdings noch einige offene Fragen:
1) In dem AVR221 PID Regler gibt es eine Funktion
1
pid_Reset_Integrator()
die den Integrator zurueck setzt.
* Wann muss ich diese Funktion aufrufen ?
* Immer wenn ich die PID Regelung "abdrehe" und danach wieder verwenden
will ?
(Diese Frage wurde auch schon im
[Beitrag "Hilfe bei: AppNote AVR221 - PID-Regler"] gestellt.)
2) Ich rufe aktuell den PID Regler in einer Timer ISR alle 250ms auf.
* Ist das adaequat fuer eine traege Temperaturregelung ?
3) Der AVR221 PID Regler gibt mir einen Temperatur-Regelwert zurueck.
Wenn also beispielsweise der Proportional-Anteil auf 1 ist und I=0 sowie
D=0 ist, dann wuerde der Regler bei einem Sollwert von 20 und einem
Istwert von 10 eine Differenz von (20-10=) 10 zurueck liefern.
Nun moechte ich allerdings einen PWM Wert (etwa einen Prozentsatz 0-100)
erhalten, den ich zur Heizungssteuerung verwenden kann.
Aus diesem Grund habe ich derzeit eine Art Hysteresensteuerung
implementiert:
- PID Wert <=0 : PWM Prozentsatz=0
- PID Wert >=50: PWM Prozentsatz=100
- PID Wert (>0 && <50): PWM Prozentsatz=PIDWert/50 * 100
Wenn also die Temperaturdifferenz >= 50°C ist, dann soll die Heizung
maximal heizen.
Ist die Differenz kleiner als 50°C, so wird entsprechend des PID
Regelwerts die PWM skaliert.
Die 50°C habe ich dabei "aus dem Bauch heraus" gewaehlt. Je nach den
Versuchsergebnissen muesste dieser Wert vermutlich angepasst werden.
* Kann das so funktionieren ?
* Wahrscheinlich waere es besser die PID Anteile so zu waehlen, dass
direkt vom Regler der Prozentsatz zurueckgegeben wird ?
* Wie muesste ich dazu den AVR221 PID code anpassen ? Einfach den
Wertebereich von -MAX_INT und MAX_INT auf 0 und 100 verkleinern ??
4) Da die Heizung sehr traege ist, verwende ich fuer die PWM aktuell
eine Periodendauer von 3,2 Sek.
Der PID Regler wird allerdings alle 250ms ausgefuehrt, womit auch alle
250ms der PWM Prozentsatz aktualisiert wird.
Der Regler kann somit die PWM nicht wirklich alle 250ms regeln, sondern
lediglich alle 3,2 Sek.
* Ist das ein Problem, oder ist das eher unproblematisch zu sehen ?
* Waere es besser wenn die PID und PWM Periodendauer gleich sind ? Das
SSR Relais hat eine Schaltdauer von 10ms. Bei minimaler PWM (=1%) sollte
die "Ein-Zeit" also nicht unter 10ms liegen. Somit waere die minimale
PWM Periodendauer (bei prozentualer PWM Steuerung) 100*10ms = 1000ms = 1
Sek. Entsprechend koennte ich das PID Intervall ebenfalls auf 1Sek
setzen.
Lg,
Stefan
Volker Zabe schrieb:> Kann dein SSR PWM ?
Ich nutze ein Sharp S202S02 zero-crossing SSR (Datenblatt:
[http://sharp-world.com/products/device/lineup/data/pdf/datasheet/s102s02_e.pdf]),
ueber welches ich die Heizung ein- und ausschalten kann.
Die Ein- und Ausschaltzeiten sind jeweils mit maximal 10ms angegeben
(worst-case).
Wenn der kuerzeste PWM Impuls somit >10ms ist, sehe ich kein Problem
damit.
Bei meiner aktuellen PWM Periode (3,2 Sek) ist ein Impuls minimal
3200ms/100=32ms.
Ich sehe daher keinen Grund warum man das Ding nicht mit einer
entsprechend langsamen PWM ansteuern koennen sollte.
Wenn du sie noch langsamer machst, koenntest du sogar ein normales
Relais verwenden und es wuerde ggf. fuer die Heizungssteuerung noch
immer brauchbar sein :)
> Zweipunkt-Regler reicht!
Zweipunktregler reicht leider nicht.
In dem Heizgeraet (in welchem ich die eingebaute Regelung durch meine
eigene ersetze), war eine Zweipunktregelung verbaut.
Die schaltete die Heizung so lange ein, bis die eingestellte Temperatur
erreicht wurde.
Leider steigt jedoch die Temperatur aufgrund der Traegheit der
Heizplatte noch nach dem Abschalten der Heizung an.
Stellt man also etwa 30°C ein, so schaltet sich zwar beim Erreichen der
30°C die Heizung aus, jedoch steigt die Temperatur der Platte
anschliessend noch auf annaehernd 60°C (das ist das Doppelte des
Sollwerts !).
Aus diesem Grund habe ich ueberhaupt erst meine PID Temperaturregelung
entwickelt.
Lg,
stefan
Egal schrieb:> Zu 3):> http://de.wikipedia.org/wiki/Faustformelverfahren_...
Danke fuer deine Antwort. Unter dem wikipedia Link ist neben der
Ziegler-Nichols Methode auch eine Methode nach Chien, Hrones und Reswick
beschrieben.
Mir ist klar, dass ich mit diesen Methoden passende Werte fuer P,I und D
finden kann, jedoch bin ich mir nach wie vor nicht sicher wie ich daraus
einen geeigneten PWM-Prozentualanteil bekomme.
Der Wertebereich des AVR221 PID Reglers ist ja -MAX_INT bis MAX_INT und
nicht 0 bis 100.
Desweiteren ist mir auch nicht klar, ob meine PID Hysteresensteuerung
(siehe oben) entsprechend korrekte Ergebnisse liefern kann.
Ist eine derartige Steuerung zulaessig, oder muss der gesamte Bereich
mit dem PID Regler abgedeckt sein ?
Das starke Überschwingen (100%) zeigt erstmals nur, das dein Heizelement
zu stark bzw. die thermische Kopplung nicht ausreichend für die
Heizleistung ist.
Ein Regler verbessert die Situation (er regelt vor erreichen der
Solltemperatur runter), aber mehr als ausschalten kann er auch nicht.
Was nützt dir ein 1000W Heißer, den der Regler auf 600W begrenzt.
Die verschiedenen Zeiten von PWM (32 ms Auflösung) und SSR(10ms) wird
zwar gehen, ist aber nicht Schön. Besser du synchronisierst beide. Also
detektiere den Nulldurchgang und zähle mit wie viele Halbperioden du
ein/aus haben möchtest. Nennt sich glaube ich Voll-Paket-Steuerung.
Den Regler schneller als das Stellglied zu haben ist eher
kontraproduktiv.
Dies erhöht deine Totzeit, von der du ja mehr als genug hast. Warum soll
der Regler eine neuen Stellwert berechnen, wenn der alte noch gar nicht
umgesetzt wurde und somit keine Auswirkung haben kann. Besser ihn
synchron laufen lassen. Langsamer sollte bei deiner thermischen
Zeitkonstante auch kein Problem sein.
Was genehmigst Du denn als Überschwingen?
Ist die thermische Kopplung gut und Heizleistung nicht
überdimensioniert, bleibt das Überschwingen in akzeptablen Bereich, auch
bei einem 2-Punkt-Regler. Bzw. ist eine gute thermische Kopplung auch
Voraussetzung für einen gut funktionierenden PID-Regler.
Offensichtlich geht es nicht darum, mit der Herdplatte Suppe zu kochen.
Irgendwas anderes soll mit einer Herdplatte erwärmt werden, ohne
allzugrosse Überschwinger.
Man kann das (vielleicht) mit so einen PID Zauber machen,
wissenschaftlich und mit ganz viel Ziegler–Nichols. Brauchste dazu
meinen alten Schinken namens Föllinger ?
Oder --viel einfacher-- mit der bewährten Bauern-Technik (oder dessen
Prinzip):
http://www.ziehl-abegg.com/ww/download-185.html
Arbeite dioch einfach in Packeten von 1 Sekunde oder so.
Nimm die Temperaturdiffernz als Multiplikator zum Grundpaket (natürlich
nur positive Differenz da du nicht Kühlen kanst).
Soll=200°C Ist=199°C Differenz=1°C also 1 Sekunde Anschalten
Messintervall=Regelstrecke z.B. 10 Sekunden.
Habe ich schon mal gemacht hat echt Super ergebnisse Geliefert vor allem
bai Größeren Rgelstrecken da leicht an die Regelstrecke Adaptierbar.
Könnte man auch Selbstadaptierend Programmieren durch Durchmessen der
Regelstrecke.
Volker Zabe schrieb:> Das starke Überschwingen (100%) zeigt erstmals nur, das dein Heizelement> zu stark bzw. die thermische Kopplung nicht ausreichend für die> Heizleistung ist.> Ein Regler verbessert die Situation (er regelt vor erreichen der> Solltemperatur runter), aber mehr als ausschalten kann er auch nicht.> Was nützt dir ein 1000W Heißer, den der Regler auf 600W begrenzt.
Ja, das kann sein. Das Heizelement hat 250W, aber die Platte ist
ziemlich klein. Ist so ein China-Muell :(
Konkret handelt es sich um:
[http://cgi.ebay.at/MAGNETRUHRER-STIRRING-HOT-PLATE-MAGNET-RUHRER-ZF5-/180671989898?pt=Laborger%C3%A4te_instrumente&hash=item2a10e3c88a]
Nachdem die urspruengliche Regelung die Temperatur einer Fluessigkeit
auf der Platte gemessen hat, ich aber jetzt direkt die Temperatur an der
Platte messe, sollte die Verzoegerung zwischen Heizung Ein/Ausschalten
und Temperaturmessung geringer werden. Somit verbessere ich die von dir
angesprochene thermische Kopplung.
Wie viel Leistung dann wirklich von der Platte "verwendet" wird ist mir
nicht so wichtig, da die Temperaturregelung vordergruendig ist.
Natuerlich macht es einen Unterschied ob die Temperatur der Fluessigkeit
auf der Platte bzw. die Temperatur der Platte selbst gemessen wird.
Ich denke jedoch, dass der Temperaturunterschied zwischen Platte und
kleinen Glasbehaeltern mit Fluessigkeiten nicht so gravierend ist.
Hat die Platte 100°C, wird wohl frueher oder spaeter auch die
Fluessigkeit im Glasbehaelter frueher oder spaeter annaehernd 100°C
bekommen.
(Praezise erreichen wird die Fluessigkeit die 100°C aber wohl nicht, da
der Behaelter ja wieder von der umgebenen Luft gekuehlt wird. Solange
das aber innerhalb einer Toleranz, ist es fuer mich ok.)
> Die verschiedenen Zeiten von PWM (32 ms Auflösung) und SSR(10ms) wird> zwar gehen, ist aber nicht Schön. Besser du synchronisierst beide. Also> detektiere den Nulldurchgang und zähle mit wie viele Halbperioden du> ein/aus haben möchtest. Nennt sich glaube ich Voll-Paket-Steuerung.>> Den Regler schneller als das Stellglied zu haben ist eher> kontraproduktiv.> Dies erhöht deine Totzeit, von der du ja mehr als genug hast. Warum soll> der Regler eine neuen Stellwert berechnen, wenn der alte noch gar nicht> umgesetzt wurde und somit keine Auswirkung haben kann. Besser ihn> synchron laufen lassen. Langsamer sollte bei deiner thermischen> Zeitkonstante auch kein Problem sein.
Danke, das dachte ich mir schon.
> Was genehmigst Du denn als Überschwingen?
Mehr als 5°C sollten es nicht sein.
> Ist die thermische Kopplung gut und Heizleistung nicht> überdimensioniert, bleibt das Überschwingen in akzeptablen Bereich, auch> bei einem 2-Punkt-Regler. Bzw. ist eine gute thermische Kopplung auch> Voraussetzung für einen gut funktionierenden PID-Regler.
Wie wuerdest du denn den Stellwert des Reglers auf eine prozentuelle PWM
umrechnen ?
Mit einer Hysteresensteuerung (so wie oben) ?
Lg,
Stefan
Erich schrieb:> Offensichtlich geht es nicht darum, mit der Herdplatte Suppe zu kochen.> Irgendwas anderes soll mit einer Herdplatte erwärmt werden, ohne> allzugrosse Überschwinger.
Es geht um eine Laborheizplatte in einem Magnetruehrer. (Siehe
vorheriger Post).
Nachdem die eine oder andere Chemikalie aufgewaermt werden soll, sollten
die Ueberschwinger nicht zu gross sein, da das evt unangenehm ausgehen
koennte ;)
> Man kann das (vielleicht) mit so einen PID Zauber machen,> wissenschaftlich und mit ganz viel Ziegler–Nichols. Brauchste dazu> meinen alten Schinken namens Föllinger ?
Ich probiert mal mit dem Ziegler-Nichols, interessant isses allemal.
> Oder --viel einfacher-- mit der bewährten Bauern-Technik (oder dessen> Prinzip):> http://www.ziehl-abegg.com/ww/download-185.html
Ich hab mir schon meine Platinen fuer die Regelung gebaut, da moechte
ich jetzt nicht mehr umsatteln.
Ausserdem: Etwas zu PID lernen ist doch frueher oder spaeter immer
brauchbar :)
Lg,
Stefan
Uwe schrieb:> Arbeite dioch einfach in Packeten von 1 Sekunde oder so.> Nimm die Temperaturdiffernz als Multiplikator zum Grundpaket (natürlich> nur positive Differenz da du nicht Kühlen kanst).> Soll=200°C Ist=199°C Differenz=1°C also 1 Sekunde Anschalten> Messintervall=Regelstrecke z.B. 10 Sekunden.> Habe ich schon mal gemacht hat echt Super ergebnisse Geliefert vor allem> bai Größeren Rgelstrecken da leicht an die Regelstrecke Adaptierbar.> Könnte man auch Selbstadaptierend Programmieren durch Durchmessen der> Regelstrecke.
Und das funktioniert ?
Versuchen kann ichs ja mal.
den negativen anteil des ausgabewertes kannst du verschmeißen. gekühlt
wird nicht. dann musst du nur noch von 0-100 skalieren. den integrator
setzt du zurück, wenn du die funktion aufrufst, oder wenn ein überlauf
droht (besser ist aber ein oberer anschlag)
stell dir vor du stellst einen topf wasser auf den herd. es kocht und
kocht, aber die temperatur wird im topf nie über 100 und an der
herdplatte nie über 160 steigen. da darf der regler sich nicht zu tode
integrieren, da er die eingestellten 200 nie erreicht. ziehst du den
topf jetzt aber von der platte, kann es sein dass der regler
überschwingt. (ich lasse den integrator bei so trägen systemen erst von
der leine, wenn der P anteil nicht mehr ausreicht um 100 % zu erreichen
und stoppe ihn bei erreichen der 100%, um bei veränderten
systembedingungen keinüberschwingen zu provozieren)
wozu der aufwand mit den 50? wähle besser den P anteil richtig, dann
stellt sich das von ganz alleine ein (mit deiner methode riskierst du
unter umständen ein überschwingen, oder ein langsamerers
regelverhalten=> P optimum suchen und verwenden)
die periodenzeiten sollten gleich lang sein, ob es eine sec sein muss
oder deine 3,2 ausreichenist aus der ferne nicht zu sagen.
Quatsch da war noch nen bischen mehr z.B. Ein- Ausschaltpunkt
(Hysterese).
Nach dem Ersten Einschalten gab es einen Überschwinger danach jedoch auf
+-0.2°C genau. Habe ich NICHT erwartet ich hatte mit +-3°C gerechnet.
Die Regelstrecke bestand aus 1m^3 Luft. Die Heizung aus einem Heizlüfter
der für mehrere 50Hz Perioden angeschaltet wurde (weniger als ne Sekunde
hat nichts gebracht). Ein anschalten war dann halt ein kurzes pusten und
hat die Temperatur um ca. 0.1°C angehoben wenn die Temperaturdifferenz
größer war hat er halt mal für 5 Sekunden gepustet und die Temperatur in
dieser Zeit so um 4°C angehoben danach ist die umgebung und der Sensor
auf die Temperatur gekommen und hat nichts mehr gemacht (weil 4°C über
Soll) und ist langsam abgekühlt. Wenn dann die Temperatur 0.1°C unter
Soll gefallen ist hat er halt kurz gepustet und die Temperatur um 0.1°C
angehoben.
Stefan schrieb:> kleinen Glasbehaeltern> 250W Kochplatte
Wie viel Flüssigkeit musst du Aufheizen? 100 ml?
Glas ist ein schlechter Wärmeleiter!!!
Berechne erstmals die benötigte Leistung!!!
Ein Regler (PID oder nicht) kann nicht die Physik ändern.
Je nach Leistung nimm Heißbänder, Leistungswiederstände oder wickle dir
aus Widerstandsdraht deinen eigene Heizung und befestige sie an ein
Metallgefäß.
Volker
Volker Zabe schrieb:> Stefan schrieb:>> kleinen Glasbehaeltern>> 250W Kochplatte>> Wie viel Flüssigkeit musst du Aufheizen? 100 ml?
Eher 50ml oder weniger
> Glas ist ein schlechter Wärmeleiter!!!
Mag sein, aber ich moechte ja nicht einen grossen Klotz Glas aufheizen,
sondern eine Fluessigkeit in einem duennwandigen Glaskolben.
Tatsache ist, dass ich bereits mit der alten (eingebauten) Regelung ohne
Probleme Wasser in einem Glaskolben (Erlenmeyerkolben) auf 100°C
aufheizen konnte, die 250W Leistung der Heizplatte sind also definitiv
fuer meine Zwecke ausreichend .
> Berechne erstmals die benötigte Leistung!!!
Angenommen ich moechte 50mL Wasser auf 100°C aufheizen:
Die spezifische Waermekapazitaet von 1Kg Wasser ist etwa 4,187
[kJ/(kg.K)].
Um also 1L Wasser um 1°C zu erwaermen sind 4187 J notwendig.
Sind es aber nur 50mL, so werden ca 210J benoetigt.
Starten wir bei 20°C Raumtemperatur, so sind 80°C zu ueberwinden, das
ergibt einen Energiebedarf von 16,8 kJ.
Nun ist aber
Die benoetigte Leistung ist also abhaengig davon wie schnell ich die
50mL Wasser erhitzen will.
Formt man das auf die 250W der Herdplatte um
so wuerde ich bei voller Leistung etwa 68 Sekunden mit der gegebenen
Heizplatte benoetigen (wobei ich hier den duennwandigen Glaskolben
ausser Acht gelassen habe).
> Ein Regler (PID oder nicht) kann nicht die Physik ändern.
Muss er auch nicht:
1) Es hat bereits praktisch funktioniert (siehe oben)
2) obiges Rechenbeispiel zeigt, dass es physikalisch funktioniert> Je nach Leistung nimm Heißbänder, Leistungswiederstände oder wickle dir> aus Widerstandsdraht deinen eigene Heizung und befestige sie an ein> Metallgefäß.>> Volker
Clemens S. schrieb:> den negativen anteil des ausgabewertes kannst du verschmeißen. gekühlt> wird nicht. dann musst du nur noch von 0-100 skalieren.
Und das mache ich, indem ich etwa den P Anteil hoch setze, den PID
Stellwert aber limitiere ?
wobei
Angenommen P=1, I=0, D=0, dann waere bei 50°C Temperaturdifferenz die
PWM bei 50%, das ist sicherlich zu wenig.
Setze ich P hoeher (etwa auf 2), dann waere bei 50°C Differenz die PWM
auf 100%, das klingt schon eher plausibel.
Stelle ich nun aber den Sollwert noch hoeher (etwa auf 100 °C
Differenz), dann waere der PID Stellwert schon bei 200, also nicht mehr
im Bereich 0-100. Ich wuerde also in diesem Fall den Stellwert auf 100
limitieren, da ich ja die Heizung nicht mehr wie 100% der PWM
Periodendauer einschalten kann.
Daher ergibt sich aus meiner Sicht nun erst Recht wieder eine Art
Hysteresensteuerung:
* Ist der Stellwert <0, limitiere ich auf 0% PWM (kuehlen kann ich ja
nicht)
* Ist der Stellwert >100, limitiere ich auf 100, weil mehr wie 100% PWM
geht ja nicht
* Ist der Wert dazwischen, so verwende ich ihn direkt fuer die PWM
Der korrekte P Wert muss natuerlich entsprechend erst z.B. mittels
Ziegler Nichols ermittelt werden.
> den integrator> setzt du zurück, wenn du die funktion aufrufst, oder wenn ein überlauf> droht (besser ist aber ein oberer anschlag)
Wenn ich welche Funktion aufrufe ?
Jedesmal wenn ich die PID Funktion aufrufe macht ja keinen Sinn, dann
koennte ich ja den I Anteil gleich weglassen.
> stell dir vor du stellst einen topf wasser auf den herd. es kocht und> kocht, aber die temperatur wird im topf nie über 100 und an der> herdplatte nie über 160 steigen. da darf der regler sich nicht zu tode> integrieren, da er die eingestellten 200 nie erreicht.
OK, hier ist das limitieren des I Anteils wichtig.
> ziehst du den> topf jetzt aber von der platte, kann es sein dass der regler> überschwingt. (ich lasse den integrator bei so trägen systemen erst von> der leine, wenn der P anteil nicht mehr ausreicht um 100 % zu erreichen> und stoppe ihn bei erreichen der 100%, um bei veränderten> systembedingungen keinüberschwingen zu provozieren)
Ok, das macht Sinn, danke.
> wozu der aufwand mit den 50? wähle besser den P anteil richtig, dann> stellt sich das von ganz alleine ein (mit deiner methode riskierst du> unter umständen ein überschwingen, oder ein langsamerers> regelverhalten=> P optimum suchen und verwenden)
Und die PWM mache ich dann so, wie im Absatz oben beschrieben ?
> die periodenzeiten sollten gleich lang sein, ob es eine sec sein muss> oder deine 3,2 ausreichenist aus der ferne nicht zu sagen.
Mach ich, danke.
Lg,
Stefan
Stefan schrieb:> Wenn ich welche Funktion aufrufe ?> Jedesmal wenn ich die PID Funktion aufrufe macht ja keinen Sinn, dann> koennte ich ja den I Anteil gleich weglassen.
bei der initialisierung, ich kenne die lib nicht und wollte nur darauf
hinweisen dass dieser SICHER 0 gesett werden muss. btw, verlink doch die
appnote oder das handbuch zu der funktion, sonst ist das alles ein
bischen viel glasgekugle...
Stefan schrieb:> Und das mache ich, indem ich etwa den P Anteil hoch setze, den PID> Stellwert aber limitiere ?wobei> Angenommen P=1, I=0, D=0, dann waere bei 50°C Temperaturdifferenz die> PWM bei 50%, das ist sicherlich zu wenig.
dein programm soll den ausgabewert so skalieren (dividieren), dass der
maximale rückgabewert der funktion PID 100% entspricht.
danach bestimmst du die Anteile. der p anteil legt dann bereits fest, ab
welcher temperaturdifferenz dein regler voll aussteuert. das ist das
optimum und sicher nicht 50°!!
der maximalanteil des pid reglers steht sicher irgendwo, ansonsten schau
in die variablendeklaration.
sg clemens
Clemens S. schrieb:> Stefan schrieb:>> Wenn ich welche Funktion aufrufe ?>> Jedesmal wenn ich die PID Funktion aufrufe macht ja keinen Sinn, dann>> koennte ich ja den I Anteil gleich weglassen.>> bei der initialisierung, ich kenne die lib nicht und wollte nur darauf> hinweisen dass dieser SICHER 0 gesett werden muss. btw, verlink doch die> appnote oder das handbuch zu der funktion, sonst ist das alles ein> bischen viel glasgekugle...
Gerne.
Appnote: [http://www.atmel.com/dyn/resources/prod_documents/doc2558.pdf]
Code: [http://www.atmel.com/dyn/resources/prod_documents/AVR221.zip]
> Stefan schrieb:>> Und das mache ich, indem ich etwa den P Anteil hoch setze, den PID>> Stellwert aber limitiere ?wobei>> Angenommen P=1, I=0, D=0, dann waere bei 50°C Temperaturdifferenz die>> PWM bei 50%, das ist sicherlich zu wenig.>> dein programm soll den ausgabewert so skalieren (dividieren), dass der> maximale rückgabewert der funktion PID 100% entspricht.> danach bestimmst du die Anteile. der p anteil legt dann bereits fest, ab> welcher temperaturdifferenz dein regler voll aussteuert. das ist das> optimum und sicher nicht 50°!!>> der maximalanteil des pid reglers steht sicher irgendwo, ansonsten schau> in die variablendeklaration.
Im Augenblick ist der Wertebereich des Reglers -MAX_INT bis MAX_INT,
wobei das definiert ist als:
1
#define MAX_INT INT16_MAX
2
#define INT16_MAX 32767
Aber mit
werde ich wohl nicht gluecklich werden, es sei denn der P Anteil ist
extrem hoch.
Vielleicht geht es allerdings einfach MAX_INT neu zu definieren:
1
#define MAX_INT 100
Dann waere der Wertebereich -100 bis 100.
Lg,
Stefan
Stefan schrieb:> werde ich wohl nicht gluecklich werden, es sei denn der P Anteil ist> extrem hoch.
warum soll dieser (multipliziert mit dem skalierungsfaktor) nicht hoch
sein dürfen (den genauen wert ergibt die messung; das ergebniss der
messung beinhaltet dann bereits einen skalierungsfaktor, der aber für
dich unwichtig ist)
Stefan schrieb:> Vielleicht geht es allerdings einfach MAX_INT neu zu definieren:> #define MAX_INT 100
wenn kannst du an der konstante SCALING_FACTOR eingreifen, würde ich
aber bleiben lassen, da du damit überläufe und die genauigkeit
beeinflusst.
lass besser eine binärpotenz und dividiere den ausgangswert durch
bitschieben auf 255 mit denen du dann das pwm register füllst.
hast du die note überhaupt gelesen/ahnung von regelungstechnik? ist
jetzt nicht bös gemeint, aber ich habe gerade das gefühl, dass du noch
nicht ganz verstanden hast wie ein regler funktioniert.
die parameter und sogar die skalierung sind schön beschrieben.
1
int16_t D_Factor
2
The Derivative tuning constant, multiplied with SCALING_FACTOR.
3
int16_t I_Factor
4
The Integral tuning constant, multiplied with SCALING_FACTOR.
5
int16_t lastProcessValue
6
Last process value, used to find derivative of process value.
7
int16_t maxError
8
Maximum allowed error, avoid overflow.
9
int32_t maxSumError
10
Maximum allowed sumerror, avoid overflow.
11
int16_t P_Factor
12
The Proportional tuning constant, multiplied with SCALING_FACTOR.
13
int32_t sumError
14
Summation of errors, used for integrate calculations.
Hallo,
ich habe jetzt mal meine Platinen eingebaut und erste Versuche mit der
Heizplatte durchgefuehrt.
Das Ergebnis ist verblueffend: Obwohl ich die Steuerung noch wie ganz
oben beschrieben mache und die PID Parameter noch (P=1, I=0, D=0) sind,
funktioniert die Regelung jetzt schon auf wenige °C genau.
Dass es jetzt schon so gut funktioniert haette ich mir nicht gedacht :)
Dennoch, jetzt wo ich schon einen PID habe, moechte ich ihn auch nutzen
und rausholen was geht ;)
schön dass die hw funktioniert.
das ist jetzt ein p regler, der in 50 schritten die temperatur regeln
kann.
stell mal dein programm ein.
als notiv hätte ich gerne: wie skalierst du die temperatursensoren ich
nehme an ADC und dann umrechnen?
sollwertvorgabe: welche variable und welche skalierung (°C nehme ich an)
ausgabe: Pwm Register und dessen skalierung
danke
den PI Regler kriegen wir auch zum laufen. ich fürchte nur, dass wir
gerade ein wenig aneinander vorbei reden.
sg clemens
hast du ein oszi, mit dem du die temperaturkurve mitzeichnen kannst?
ansonsten die werte vom ADC als optimierungskriterium mitloggen.
Clemens S. schrieb:> Stefan schrieb:>> werde ich wohl nicht gluecklich werden, es sei denn der P Anteil ist>> extrem hoch.>> warum soll dieser (multipliziert mit dem skalierungsfaktor) nicht hoch> sein dürfen (den genauen wert ergibt die messung; das ergebniss der> messung beinhaltet dann bereits einen skalierungsfaktor, der aber für> dich unwichtig ist)>> Stefan schrieb:>> Vielleicht geht es allerdings einfach MAX_INT neu zu definieren:>> #define MAX_INT 100>> wenn kannst du an der konstante SCALING_FACTOR eingreifen, würde ich> aber bleiben lassen, da du damit überläufe und die genauigkeit> beeinflusst.>> lass besser eine binärpotenz und dividiere den ausgangswert durch> bitschieben auf 255 mit denen du dann das pwm register füllst.
Ja, das geht auch.
> hast du die note überhaupt gelesen/ahnung von regelungstechnik? ist> jetzt nicht bös gemeint, aber ich habe gerade das gefühl, dass du noch> nicht ganz verstanden hast wie ein regler funktioniert.
Ja, ich habe die Appnote durchgelesen, recht lange ist sie ja nicht.
Desweiteren habe ich auch noch den Artikel
[http://www.eetimes.com/ContentEETimes/Documents/Embedded.com/2000/f-wescot.pdf
PID without a PhD] gelesen, indem insbesondere auch auf
Temperaturregelung eingegangen wird.
Ich kann den Aktikel empfehlen, da er aus meiner Sicht gut die Materie
sowie die P, I und D Anteile veranschaulicht.
Die dortige Implementation ist allerdings anders als die in AVR221.
Auch die Seiten [http://www.jashaw.com/pid/tutorial/pid6.html],
[https://controls.engin.umich.edu/wiki/index.php/PIDTuningClassical#Ziegler-Nichols_closed-loop_tuning_method],
[http://www.rn-wissen.de/index.php/Regelungstechnik] und
[Beitrag "Reglerparameter"] waren/sind interessant.
Dennoch ist es meine erste PID Regelung und trotz der genannten
Literatur muss ich erst entsprechende Erfahrungen sammeln.
Also in Kurzfassung: Gelesen ja, Ahnung von Regelungstechnik: noch nicht
allzu viel. (Meine bisherigen Regler waren bis jetzt immer Hysteresen
oder Punktregler.)
> die parameter und sogar die skalierung sind schön beschrieben.int16_t D_Factor> The Derivative tuning constant, multiplied with SCALING_FACTOR.> int16_t I_Factor> The Integral tuning constant, multiplied with SCALING_FACTOR.> int16_t lastProcessValue> Last process value, used to find derivative of process value.> int16_t maxError> Maximum allowed error, avoid overflow.> int32_t maxSumError> Maximum allowed sumerror, avoid overflow.> int16_t P_Factor> The Proportional tuning constant, multiplied with SCALING_FACTOR.> int32_t sumError> Summation of errors, used for integrate calculations.
Ja, das ist die interne PID Datenstruktur.
Die jeweiligen Werte legt man allerdings mit den #defines fest:
1
* The K_P, K_I and K_D values (P, I and D gains)
2
3
* need to be modified to adapt to the application at hand
4
5
*/
6
7
//! \xrefitem todo "Todo" "Todo list"
8
9
#define K_P 1.00
10
11
//! \xrefitem todo "Todo" "Todo list"
12
13
#define K_I 0.00
14
15
//! \xrefitem todo "Todo" "Todo list"
16
17
#define K_D 0.00
18
* Specify the desired PID sample time interval
19
20
* With a 8-bit counter (255 cylces to overflow), the time interval value is calculated as follows:
Die Werte in der internen PID Datenstruktur werden dann mit
1
Init_PID()
befuellt, das steht auch so in der Appnote.
Zum SCALING_FACTOR steht in der Appnote:
"To increase accuracy the p_factor, i_factor and d_factor are scaled
with a factor 1:128. The result of the PID algorithm is later scaled
back by dividing by 128. The value 128 is used to allow for optimizing
in the compiler."
In der Appnote steht aber nichts davon, den SCALING_FACTOR zu aendern.
Genausowenig wird erwaeht, wie man den PID Wert korrekt fuer die
Anwendung skaliert.
Ebenso hab ich die doxygen doku des Codes gelesen (ist im Zip-file
enthalten).
Dort steht:
"Todo:
Put in own code in: Get_Reference(void), Get_Measurement(void) and
Set_Input(int16_t inputValue)
Specify the sampling interval time TIME_INTERVAL
Todo:
Modify the K_P (P), K_I (I) and K_D (D) gain to adapt to your
application"
Das ist nach der Appnote alles, was man tun muss um den Regler zu
verwenden.
1. Auch ein Zweipunktregler kann vom pid - Größen gesteuert werden.
2. Abtastzeit von 250 ms bei einer Heizplatte ist zu kurz. Differenziert
man, erhält man nur Rauschen.
3. Schätze ein PD Regler ist besser. Dass ie Temperatur im Mittel nicht
abweicht (das macht der I Anteil) ist nicht nötig. PD Regler gibt dann
mehr Phasenreserve.
Clemens S. schrieb:> schön dass die hw funktioniert.>> das ist jetzt ein p regler, der in 50 schritten die temperatur regeln> kann.
Wenn ich das von 50 auf 100 aendere, habe ich dann nicht ohnehin schon
meinen PWM Prozentsatz ?
> stell mal dein programm ein.
[http://paste.ideaslabs.com/show/rf75N8iZiW]
> als notiv hätte ich gerne: wie skalierst du die temperatursensoren ich> nehme an ADC und dann umrechnen?
Ich verwende den MAX6675, der Liefert schon den fertigen Temperaturwert
des Thermoelements.
> sollwertvorgabe: welche variable und welche skalierung (°C nehme ich an)
set_temperature in °C
> ausgabe: Pwm Register und dessen skalierung
PWM Register gibts keines weil ich aufgrund der Pinbelegung die PWm in
Software generiere (siehe timer2 ISR).
> danke
Danke fuers helfen !
> den PI Regler kriegen wir auch zum laufen. ich fürchte nur, dass wir> gerade ein wenig aneinander vorbei reden.
Mag sein ;)
> hast du ein oszi, mit dem du die temperaturkurve mitzeichnen kannst?> ansonsten die werte vom ADC als optimierungskriterium mitloggen.
Ja, hab ich.
Einfacher ist es aber die Werte mitzuloggen, da ich dies bereits in den
Code implementiert habe.
Mein Plan war/ist es die Werte mitzuloggen und dann z.b. mittels gnuplot
oder matplotlib zu plotten, damit man etwas mehr sehen kann.
Lg,
Stefan
Ahja, noch eine Anmerkung zum Code:
Ich habe in den aktuellen Code noch nicht die hier vorgeschlagenen
Aenderungen eingearbeitet. Sobald ich dazu komme, werde ich das noch
erledigen.
Lg,
Stefan
Stefan schrieb:> so wuerde ich bei voller Leistung etwa 68 Sekunden mit der gegebenen> Heizplatte benoetigen
Soweit so Gut.
Jetzt beginnt der spannende Teil.
Ein Erlenmeyerkolben hat z.B. einen Durchmesser von 64mm und eine
Wandstärke von 3,3mm (kein Ahnung ob es deinem entspricht).
Macht A= 0,0032 m².
Quarzglas hat einen Leitwert von 1,38 W/Km
spec. Leitwert = Leitwert * Fläche / Dicke
G = 1.345 W/K
mit dT = Q / G ergibt das eine delta T von 186°K.
In Worten: Die Herdplatte muss ca. 190° heißer sein als deine
Flüssigkeit, um 250 Watt Wärmeleistung durch zu kriegen.
Umgekehrt: Setzt man deine 5° Überschwingen gleich dem dT, so ergibt das
eine max. Leistung von:
Q= dT * G = 6,7 W
Die Zeit die du jetzt benötigst, kannst Du selber ausrechnen.
Dein PD-Regler kann jetzt irgend ein Kompromiss aus den beiden
Extremwerten machen. Mehr nicht!
In Wirklichkeit wird es nicht ganz so schlimm, da die Kühlwirkung der
Luft, das Überschwingen dämpfen wird.
Volker
Hallo,
Volker Zabe schrieb:> Stefan schrieb:>> so wuerde ich bei voller Leistung etwa 68 Sekunden mit der gegebenen>> Heizplatte benoetigen>> Soweit so Gut.> Jetzt beginnt der spannende Teil.> Ein Erlenmeyerkolben hat z.B. einen Durchmesser von 64mm und eine> Wandstärke von 3,3mm (kein Ahnung ob es deinem entspricht).> Macht A= 0,0032 m².> Quarzglas hat einen Leitwert von 1,38 W/Km>> spec. Leitwert = Leitwert * Fläche / Dicke> G = 1.345 W/K>>> mit dT = Q / G ergibt das eine delta T von 186°K.>> In Worten: Die Herdplatte muss ca. 190° heißer sein als deine> Flüssigkeit, um 250 Watt Wärmeleistung durch zu kriegen.>> Umgekehrt: Setzt man deine 5° Überschwingen gleich dem dT, so ergibt das> eine max. Leistung von:> Q= dT * G = 6,7 W> Die Zeit die du jetzt benötigst, kannst Du selber ausrechnen.>> Dein PD-Regler kann jetzt irgend ein Kompromiss aus den beiden> Extremwerten machen. Mehr nicht!
danke fuer deine Informationen.
Ich koennte das jetzt auf meinen Glaskolben (mit einer duenneren
Wandstaerke) umrechnen, jedoch reden wir glaube ich am Problem vorbei.
Mit dem China-Magnetruehrer konnte ich ja bereits in einer annehmbaren
Zeit z.B. Wasser im Kolben auf 100°C erhitzen, das ist ja nicht das
Problem.
Vielmehr war das Problem, dass ich bei dem Magnetruehrer eine Temperatur
(z.B. 30°C) eingestellt habe, die erreichte Temperatur aber dann doppelt
so hoch war (also etwa 60°C am aktuellen Beispiel).
Ich will also nicht die Heizleistung verbessern, indem ich etwa eine
neue Heizplatte einbaue (falls es die ueberhaupt fuer mein China-Produkt
gibt), sondern ich will lediglich die Regelung verbessern damit die
eingestellte Temperatur nicht so extrem ueberschwingt.
Mir ist auch klar, dass ein anstaendiges Produkt eine staerkere
Heizplatte und sicherlich auch eine bessere Regelung hat.
Nur wollte ich nicht ~ 700 EUR fuer eine Heizplatte ausgeben, die ich im
Jahr vielleicht 10 Mal verwende.
Jetzt bin ich halt bei meiner eigenen Loesung gelandet und lerne als
Bonus daran noch etwas ueber PID Temperaturregelung ;)
Mann muss das schliesslich positiv sehen.
Lg,
Stefan
Stefan schrieb:> jedoch reden wir glaube ich am Problem vorbei.
Nicht wirklich.
Es ist nicht die Heizleistung direkt. Es ist die gesamte Regelstrecke
die nicht optimal ist, bestehend aus Heizleistung Wärmekapazität der
Platte bzw. Flüssigkeit und dem thermischen Widerstand.
Ich wollte dir nur verdeutlichen das dein Regler keine Wunder
vollbringen wird. Und bevor du an deinen Programmierkünsten zweifelst
oder einen Wutausbruch, beim finden der Regelparameter bekommst, wollte
ich dich nur Warnen.
Eine Lösung (Reduzierung des Überschwingens), eine unter mehreren, wäre
die Reduzierung der Heizleistung, unter Beibehaltung des
Zwei-Punkt-Reglers.
>Jetzt bin ich halt bei meiner eigenen Loesung gelandet und lerne als>Bonus daran noch etwas ueber PID Temperaturregelung ;)
Sei dir ungenommen. Du wirst aber auch was über Regelstrecken lernen.
Volker
Ist schon jemandem die Idee gekommen, ein PID waere Muell hier? Ein
wenig Ueberlegen, und man kommt selbst drauf. Der statische Teil wird
dem I-Teil zugemutet. Das muss nicht so sein.
Ich habe jetzt mal ein bisschen mit den Parametern gespielt.
Zuerst haette ich die Ziegler-Nichols Methode versucht, jedoch konnte
ich mein System nicht wirklich gut zum Schwingen bekommen.
Jetzt habe ich einfach mal mit dem P und D Anteil etwas gespielt und ich
finde, dass das Ergebnis gar nicht so schlecht aussieht.
Meinen I Anteil habe ich bei 0 belassen, da ich damit keinen Erfolg
verbuchen konnte.
Es handelt sich bei meinem Regler also um einen PD Regler.
Interessant finde ich, dass die Regelung bis etwa 70°C sehr gut
funktioniert, die Platte bei hoeheren Temperaturen aber dann nicht mehr
ganz auf den Sollwert kommt.
Durch die Hitze aendert sich sicherlich der Widerstand der Heizplatte,
sodass dann mein Modell nicht mehr genau zur Heizplatte passt.
Hallo Stefan,
das liegt daran, dass Dir der I - Anteil fehlt, um die bleibende
Regelabweichung auszugleichen. Je höher die Temperatur, desto höher auch
die, an die Umgebung abgegebene Wärme. Somit hättest Du bei einer
Solltemperatur von 60 Grad nur z.B. 40 Grad auf die Umgebungstemperatur
(z.B. 20°). Bei 180°C Soll und 160° ist sinds jedoch schon 140° zur
Umgebungstemperatur, jedoch bei gleichem Regelfehler ...
Eine Möglichkeit wäre jetzt die letzten paar Grad mit einem I-Anteil
"nachzuziehen". Dabei den I-Anteil des Regler erst "freigeben", wenn der
Temperaturfehler (Soll - Ist) unterhalb einer definierten Schwelle ist.
Wenn ich mich recht erinnere, nennt sich das ganze Anti-Windup.
Grüße,
Michael
Hallo Michael,
danke fuer den Tip.
Ich aktiviere den Integrator jetzt
1) wenn |Sollwert-Istwert| <= ANTI_WINDUP_BEREICH
2) Sollwert==Istwert
wobei ich ANTI_WINDUP_BEREICH derzeit auf 20°C gesetzt habe.
Ansonsten setze ich den Integrator jedesmal zurueck.
Desweiteren habe ich den maximalen aufsummierten Fehler limitiert,
sodass der Integrator nicht zu weit in eine Richtung wandern kann.
Gleichzeitig limitiert mir das auch wie sehr der summierte I-Term den
Gesamtterm beeinflussen kann.
Ist etwa der maximale summierte I-Term mit 20 limitiert, so bedeutet
das, dass der Integrator mit maximal 20% PWM Anteil wirken kann.
Das Resultat schaut schon vielversprechend aus (die 100°C werden
mittlerweile auch erreicht), aber das ganze fuehrt nun zu leichten
Oszillationen.
Also die 100°C werden immer um 2-3 °C ueberschritten und danach mit
derselben Periodendauer wieder um 2-3 °C unterschritten.
Ich denke, dass hier einfach noch mein I-Faktor zu hoch gewaehlt ist
(also der summierte Fehler zu schnell waechst).
Ich werde heute abend noch etwas damit experimentieren.
Interessant finde ich auch, dass der Integrator durch das
Auf-Integrieren den Fehlers nuetzlich ist, wenn die Heizplatte (etwa
durch einen aufgestellten Glaskolben belastet wird).
In diesem Fall kommt die Heizplatte erst mal nicht auf die eingestellte
Temperatur (z.b. 100°C), da sie ja durch den Glaskolben gekuehlt wird.
Aber durch den Integrator wird dann die Heiz-PWM erhoeht, sodass mehr
Leistung fuer das Aufheizen verwendet wird.
Das ganze hat natuerlich seine Grenzen.
ich habe in meinen Versuchen einen Ventilator verwendet um die Platte
immer wieder abkuehlen zu koennen.
Wenn man den Ventilator einschaltet und die Heizplatte noch heizt, sieht
man sehr schoen wie die Temperatur einbricht und die Heizplatte nicht
mehr an den Sollwert herankommt.
Ich denke das laesst sich noch durch ein Erhoehen des maximal summierten
Fehlers etwas verbessern, jedoch stosse ich hier sehr schnell an die
Grenzen der verfuegbaren Heizleistung.
Grosser Ventilator vs. kleine 250W Heizplatte geht eher schlecht fuer
die kleine Heizplatte aus ;)
Lg,
Stefan
Hallo Stefan,
Das klingt doch sehr gut. Wenn die Temperatur schwingt, dann schau Dir
auch mal die zugehörigen Regelanteile an, also P, D und I. Daran kannst
Du in der Regel schon gut erkennen, wer für die Schwingungen sorgt. Ich
tippe mal auf I --> also Gain kleiner machen, oder ggf. den D - Anteil
erhöhen. Ich denke Dein Ziel sollte sein, ein kritische Dämpfung von 1
zu erreicht ==> keine Überschwinger mehr.
Viel Erfolg,
Michael
Hi,
ich stehe aktuell etwas an.
Ich komme jetzt auf die eingestellten Temperaturen, allerdings hab ich
Oszillationen (siehe Bild).
Ich habe schon versucht die P, I und D Anteile zu variieren, ich komme
aber leider auf keinen gruenen Zweig :(
Michael K. schrieb:> Wenn die Temperatur schwingt, dann schau Dir> auch mal die zugehörigen Regelanteile an, also P, D und I. Daran kannst> Du in der Regel schon gut erkennen, wer für die Schwingungen sorgt.
genau das hab ich bis jetzt noch nicht gemacht.
Ich bin mir sicher das hilft, danke fuer den Tip.
Hi,
probiers mal so:
0. Alle Gains auf null.
1. P aufdrehen bis das System ca 10% (Anteil vom Sprungeingang)
überschwingt.
2. D aufdrehen bis die Dämpfung kritisch ist und die Überschwinger
verschwinden. Sprich der Ist-Wert läuft asymtotisch in den Soll Wert
bzw. liegt konstant drunter.
3. I sachte reinfahren und wenn's schwingt wieder reduzieren und ggf.
die Dämpfung weiter hochdrehen.
Wenn Deine Anforderung ist, sehr genau die Temp zu halten und eher träge
auf Umwelteinflüsse zu reagieren, dann I klein wählen. Soll der Regler
schnell auf die Umgebung reagieren, dann I wieder ein wenig aufdrehen
und die Oszillationen hinnehmen.
Welche Amplitude haben denn die Schwingungen?
Grüße,
Michael
Stefan schrieb:> Michael K. schrieb:>> Wenn die Temperatur schwingt, dann schau Dir>> auch mal die zugehörigen Regelanteile an, also P, D und I. Daran kannst>> Du in der Regel schon gut erkennen, wer für die Schwingungen sorgt.>> genau das hab ich bis jetzt noch nicht gemacht.> Ich bin mir sicher das hilft, danke fuer den Tip.
Gern. Durchhalten ;-)
Hab heute auch "geregelt": http://www.youtube.com/watch?v=X1IF8H2ti18
Grüße,
Michael
Hallo Michael,
cooler Tricopter ! Ich hab einen Mikrokopter, macht auch Spass ;)
Der Uebeltaeter scheint wirklich das I zu sein.
Allerdings ist es etwas schwierig: Wenn ich die Parameter fuer den
niedrigeren Temperaturbereich optimiere, dann ist im oberen
Temperaturebereich wieder gar nichts mehr so wie es sein soll.
Ich habe jetzt eine Tradeoff-Loesung, die fuer mich relativ
zufriedenstellend ist (siehe Graph).
Deine zuletzt vorgestellte Tuning-Methode moechte ich dennoch
ausprobieren, allerdings nicht mehr heute ;)
Lg,
Stefan
Hallo Stefan,
Stefan schrieb:> Hallo Michael,>> cooler Tricopter ! Ich hab einen Mikrokopter, macht auch Spass ;)
danke ;-) An dem Teil schraube und hacke ich seit fast nem Jahr. Heute
wars endlich soweit und am So gehts ab auf die Wiese .... Hatte anfangs
auch überlegt mit nen Mikrocopter zuzulegen, aber irgendwie hat mich
dann doch der Ergeiz gepackt das Projekt "from scratch" anzugehen.
Wollte auch meinem XMega-Board mal was zum tun geben ...
>> Der Uebeltaeter scheint wirklich das I zu sein.> Allerdings ist es etwas schwierig: Wenn ich die Parameter fuer den> niedrigeren Temperaturbereich optimiere, dann ist im oberen> Temperaturebereich wieder gar nichts mehr so wie es sein soll.
Ich denke, dass die Strecke einfach zu nichtlinear ist, für Deinen
linearen PID. Was eine relativ einfache Möglichkeit ist, dass Du
bestimmte Arbeitspunkte definierst, wie beispielsweise 50, 100, 150 und
200 Grad. Dann stellt Du die Reglerparameter ein, damit es genau für
diese Temperatur schön passt und Du Dein gewünschtes Regelergebnis
bekommst. Dann machst "einfach" nen 4er-Array der Reglerparameter und
interpolierst zwischen den P,I und D Werten abhängig Deines Sollwerts
....
>> Ich habe jetzt eine Tradeoff-Loesung, die fuer mich relativ> zufriedenstellend ist (siehe Graph).
Sieht doch schon klasse aus! Mit dem obigen Vorgehen, kannst es dann
weiter verbessern und musst keine allzu großen Kompromissen eingehen.
>> Deine zuletzt vorgestellte Tuning-Methode moechte ich dennoch> ausprobieren, allerdings nicht mehr heute ;)
Cool! Dann gute Nacht und sag Bescheid wie's läuft!
> Lg,> Stefan
LG,
Michael
Schaut doch schon ganz gut aus.
Ein PID-Regler funktioniert wesentlich besser, wenn er auch kühlen kann.
Um das Regelverhalten noch besser zu verstehen, trage in Deine Diagramme
die 4 Regelgrößen (P, I, D, out) mit ein.
Der D-Anteil ist ja der dynamische, der soll hauptsächlich eine schnelle
Änderung auf Umweltveränderungen bewirken. Ich denke, dass diese jedoch
bei Dir eher konstant sind, Du deshalb evtl. gar kein D brauchst.
Wichtig ist das physikalische Verständnis:
Elektrisch sieht das so aus:
U-------R4---------R5---------R6-------
| | | | | | |
| R1 C1 R2 C2 R3 C3
| | | | | | |
Gnd------------------------------------
U : Wärmequelle
R : Wärmewiderstand (k-Wert)
C1: Wärmekapazität des Heizelements
C2: Wärmekapazität des Übertragungsmediums
C3: Wärmekapazität der Flüssigkeit
Parallel zu den Cs hast Du parasitäre Rs, das sind Abstrahlungs- und
Konvektionsverluste.
Im Gleichgewichtsfall muss die Heizung die Verluste ausgleichen, das
soll der I-Anteil bewirken.
Darunter muss die Heizung zusätzlich Energie für das Erwärmen zur
Verfügung stellen, die aber auch in C1 und C2 gespeichert wird
(die Rs bilden einen Spannungsteiler).
D.h. selbst wenn Du die Heizung bei Erreichen der Endtemperatur
ausschaltest, wird nachgewärmt, weil C1 und C2 noch höher als C3 geladen
sind.
D.h. Du musst bereits mit dem Heizen aufhören, wenn die in C1 und C2
gespeicherte Energie ausreicht, die Flüssigkeit auf Endtemperatur zu
bringen.
Nun wird es klar, warum C1-C3, R4-R6 möglichst klein und R1-R3 möglichst
groß sein sollen: Damit das Spannungteilerverhältnis möglichst groß ist,
damit in den Cs möglichst wenig Energie gespeichert wird.
Der Punkt, an dem die Temperatur gemessen wird, ist ebenfalls
entscheidend, Bei Dir ist das ja am C1 oder C2, für einen klassischen
PID sollte jedoch am C3 gemessen werden.
Hallo,
danke fuer die Ratschlaege.
Ich habe jetzt mal versucht etwas Wasser im Kolben aufzuheizen.
Wie ihr bereits mehrfach angesprochen habt ist meine Regelstrecke nicht
optimal.
Um also etwa 50mL Wasser in meinem Kolben auf 100°C zu erhitzen, muss
ich die Platte auf etwa 190°C aufheizen (Berechnung siehe oben).
Das funktioniert so weit auch ziemlich gut, jedoch moechte ich jetzt
auch noch die Regelung mit einem Temperaturfuehler in der Fluessigkeit
selbst versuchen (wie empfohlen).
Der beiliegende Temperaturfuehler scheint allerdings kein Typ-K
Thermoelement zu sein, weshalb ich erst einen passenden bestellen muss.
(Mein MAX6675 kann nur Typ-K.)
Die Thermoelemente die ich gefunden habe sind alle aus Edelstahl, was
eine relativ gute Bestaendigkeit gegenueber Saeuren und Laugen ergeben
sollte.
Wie gut die Bestaendigkeit dann wirklich ist wird sich zeigen.
Ich arbeite hier mir hohen Saurekonzentrationen ...
Sobald der neue Thermofuehler angekommen ist, werde ich wieder
berichten.
Lg,
Stefan
Hallo,
mittlerweile ist ein geeignetes Typ-k Thermoelement angekommen und ich
konnte meine Regelung weiter verfeinern.
Mittlerweile bin ich sehr zufrieden, da beim initialen Aufheizen in
allen Temperaturbereichen (auch mit unterschiedlichen Fluessigkeiten,
Mengen und Kolben) nur minimal ueber die Solltemperatur geheizt wird.
Mein Regler (vielmehr der Integral-Anteil) pendelt sich dann relativ
schnell ein und die Temperatur wird um etwa +/- 0.5°C gehalten.
Der D Anteil ist bei meinem Regler sehr wichtig, allerdings musste ich
ihn ueber einen groesseren Zeitbereich berechnen.
Das System ist schliesslich sehr traege und bei einer D Berechnung ueber
1 Sekunde faengt man sich praktisch nur Rauschen ein.
Desweiteren lasse ich meinen D Anteil nicht auf den Regler selbst
wirken, sondern vielmehr auf das I.
Ich weiss nicht ob dieses vorgehen verbreitet ist, bei meiner Anwendung
hat es allerdings mit den richtigen Parametern Wunder bewirkt.
Erst durch den I Anteil und den Summen-Fehler kann ich das ausserst
traege System gut modellieren.
Um die Probleme mit Rauschen und Sensor-Ungenauigkeiten weg zu bekommen
filtere ich mittlerweile an vielen Stellen in meiner Implementation.
lg,
Stefan
Hallo Stefan,
erstmals Glückwunsch!
> Desweiteren lasse ich meinen D Anteil nicht auf den Regler selbst> wirken, sondern vielmehr auf das I.
Wie hängt das dann zusammen?
Grüße,
Michael
Michael K. schrieb:>> Desweiteren lasse ich meinen D Anteil nicht auf den Regler selbst>> wirken, sondern vielmehr auf das I.>> Wie hängt das dann zusammen?
Naja, ich verwende den I Anteil fuer 2 Zwecke:
1) Wenn das P Anteil zu zu gering ist um ueberhaupt auf die
Soll-Temperatur zu kommen (z.B. weil die Soll-Temperatur sehr hoch ist),
dann integriert sich I mit der Zeit auf und der Regler kommt auf die
Soll-Temperatur.
2) Ich verwende I ebenfalls zum Halten der Temperatur.
Beim Testen habe ich die besten Ergebnisse erhalten, wenn der I-Faktor
mit der Geschwindigkeit der Temperaturveraenderung variiert:
Erhitzt sich die Heizplatte schnell, so ist die Steigung der
Temperaturkurve (D) hoch und I soll sich schneller nach unten
integrieren (also weniger werden). Gleiches gilt auch in die andere
Richtung.
Nun wuerde sich I allerdings normalerweise auf-integrieren bis der
Sollwert erreicht ist. Erst beim ueberschreiten der Solltemperatur
wuerde I negativ werden. Damit kann ich allerdings nichts anfangen, weil
ich ja nur heizen und nicht kuehlen kann.
Somit habe ich auch meinen Integrator so modifiziert, dass er bereits je
nach Steigung vor dem Erreichen der Solltemperatur wieder nach unten
integriert ;)
Das liefert dann mit meiner Heizplatte gute Ergebnisse, auch wenn
Fluessigkeit, Fluessigkeitsmenge oder der Glaskolben variiert werden.
Negativ ist allerdings, dass ich meinen Temperaturfuehler in ein
Glasrohr stecken muss, weil er sonst weg-geaetzt wird :(
Dadurch ergibt sich eine Messverzoegerung die durch das Filtern sogar
noch hoeher wird. Ohne Filtern gehts allerdings auch nicht.
Dennoch: Fuer meine Zwecke reichts und ich bin zufrieden ;)
lg,
Markus