Forum: Mikrocontroller und Digitale Elektronik diskreter PID Regler fuer Temperatursteuerung und PWM


von Stefan (Gast)


Lesenswert?

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

von Volker Z. (vza)


Lesenswert?

Kann dein SSR PWM ?

Zweipunkt-Regler reicht!

von Stefan (Gast)


Lesenswert?

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

von Egal (Gast)


Lesenswert?


von Stefan (Gast)


Lesenswert?

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 ?

von Volker Z. (vza)


Lesenswert?

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.

von Erich (Gast)


Lesenswert?

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

von Uwe (Gast)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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.

von Clemens S. (zoggl)


Lesenswert?

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.

von Uwe (Gast)


Lesenswert?

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.

von Uwe (Gast)


Lesenswert?

Die meißten E-Herde haben auch nur nen Bimetall drin

von Volker Z. (vza)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von Clemens S. (zoggl)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von Clemens S. (zoggl)


Lesenswert?

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.

sg clemens

von Stefan (Gast)


Lesenswert?

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 ;)

von Clemens S. (zoggl)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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:
21
22
 * TIME_INTERVAL = ( desired interval [sec] ) * ( frequency [Hz] ) / 255
23
24
 */
25
26
//! \xrefitem todo "Todo" "Todo list"
27
28
#define TIME_INTERVAL   157

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.

von max (Gast)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Und so sieht die Platine aus.

von Volker Z. (vza)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von Volker Z. (vza)


Lesenswert?

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

von Purzel H. (hacky)


Lesenswert?

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.

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Michael K. (mmike)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von Michael K. (mmike)


Lesenswert?

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

von Stefan (Gast)



Lesenswert?

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 :(

von Stefan (Gast)


Lesenswert?

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.

von Michael K. (mmike)


Lesenswert?

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

von Michael K. (mmike)


Lesenswert?

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

von Stefan (Gast)



Lesenswert?

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

von Michael K. (mmike)


Lesenswert?

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

von eProfi (Gast)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von Michael K. (mmike)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

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.