So wie ich es verstanden hab, muss man hier die Direction angeben:
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
Was genau bewirkt das DIRECT und was das REVERSE?
Was ich vorhabe:
Heizung soll mit voller Leistung (255) anfangen zu Heizen.
Mit DIRECT fängt es erst bei 80 an, also dachte ich muss es mit REVERSE bei 255 anfangen.
Also geändert und nun zeigts kurz 130 an und springt auf 0.
Sind diese Werte (DIRECT und REVERSE) nicht für sowas gedacht?
Ist Input < Setpoint wird Output > wenn DIRECT
Ist Input < Setpoint wird Output < wenn REVERSE
Ist Input > Setpoint wird Output < wenn DIRECT
Ist Input > Setpoint wird Output > wenn REVERSE
Man sagt damit dem Regler in welche Richtung er laufen soll wenn die Regelabweichung positiv oder negativ ist. Die Regelabweichung ist die Differenz aus Input und Setpoint .
Wenn der Regler erst mal mit einem großen Wert an Output anfangen soll, musst du ihm eine große Regelabweichung vorgaukeln. Z.B. Setpoint erst mal hoch ansetzen und dann nach einer gewissen Zeit auf den eigentlich Sollwert herabsetzen.
Ähm, versteh ich noch nicht ganz,egal, also löst das REVERSE mein "problem" nicht.
Wenn der Regler erst mal mit einem großen Wert an Output anfangen soll, musst du ihm eine große Regelabweichung vorgaukeln. Z.B. Setpoint erst mal hoch ansetzen und dann nach einer gewissen Zeit auf den eigentlich Sollwert
So ähnlich hatte ich es vor, den Output auf 255 setzen.
Es gibt auch die Möglichkeit erst mal über "myPID.SetOutputLimits( 250.0, 255.0);" den Ausgangsbereich einzuschränken und später einen größeren Bereich zuzulassen. ("myPID.SetOutputLimits( 0.0, 255.0);").
skorpi08:
Ne das ist nicht dass was ich brauche, denke ich.
Danke!
Was willst du denn Regeln und welches Problem hast du dass du den Regler auf 255 Ausgang haben willst?
Den PID-Regler kann man vielfältig beeinflussen um ihm das beizubringen was man will. Was brauchst du denn?
Ich will eben dass die Heizung anfängt mit 100% Leistung und sobald es dem Ziel nähert, runterfahren soll.
So dachte ich es zu machen:
double gap = abs(Temp_set-Temp); //distance away from setpoint
if (gap < 5)
{ //we're close to setpoint, use conservative tuning parameters
myPID.SetTunings(consKp, consKi, consKd);
}
else
{
//we're far from setpoint, use aggressive tuning parameters
myPID.SetTunings(aggKp, aggKi, aggKd);
}
myPID.Compute();
if (Temp < Temp_set-7) {leistung=255;}
analogWrite(RELAY_PIN, leistung);
Nur was passiert wenn Temp_set=21 ist, welche leistung gilt dann?
int Temp=15, Temp_set=27;
myPID.Compute();
leistung = Output;
if (Temp < Temp_set-7) leistung=255;
analogWrite(RELAY_PIN, leistung);
Die PID Lib fängt also bei leistung=80 an und rechnet immer hoch.
Da ich leistung=255 angegeben habe, überschreibt es den Wert 80.
Rechnet die Lib "im Hintergrund" weiter ab 80 oder ist die schon bei 255 angekommen?
Wenn Temp_set=21 ist, fängt die PID Lib wieder bei 80 an oder geht von 255 runter oder wartet bis Temp_set erreicht wurde?
Hallo,
mein Vorschlag: Vorsteuerung einfügen, dann braucht man den Regler nicht "vergewaltigen" und er kann das tun wozu er da ist. Die Vorsteuerung kann über der Sollistdifferenz geführt werden.
Grüße MKc
Ich denke auch, eine Vorsteuerung ist das, was du brauchst.
Der PID-Reger wird immer als Ausgang 0 habe, wenn beim Einschalten Sollwert = Istwert.
Abweichungen regelt er aus, in dem er über den I-Anteil langsam den Ausgang hochfährt.
Du solltest eine Leistungsvorsteuerungskennlinie ermitteln.
z.B. für 50°C 100W; 100°C 220W, 200°C 500W
Dann stellst du deinen Ausgang, wenn Solltemperatur 100°C gewünscht wird, schonmal auf 220W.
Auf dieses Ausgangssignal wird dann der PID aufaddiert.
So hast du beim Einschalten schonmal die Leistung, die du ungefähr brauchst, der PID regelt dann den Rest.
Der PID-Reger wird immer als Ausgang 0 habe, wenn beim Einschalten Sollwert = Istwert.
Ist nie der Fall bei mir.
Ich schätze mal ich hab maximal 300 Watt und maximal 60°.
Die Temperatur soll schnellstmöglich erreicht werden, da macht es doch Sinn mit 300W anzuheizen und den Rest soll dann der PID regeln.
Dann wäre das doch genau das richtige?
if (Temp < Temp_set-7) {leistung=255;} else { leistung=Output; }
Ich dachte eigentlich dass man es mit DIRECT und REVERSE regeln kann.
Also zuerst auf volle Leistung und wenns dem Ziel nähert, schon mal die Leistung runterregeln und dann auf sollwert langsam rantasten, es darf den sollwert nicht überschreiten.
EDIT: Ich hab bei den PID Werten noch nichts verändert, vielleicht stell ich die erstmal ein und dann weitersehen.
Gibt es irgendwelche Faustregeln wie man den PID Wert ermittelt?
Wikipedia stellt das nur wieder recht kompliziert dar.
Das Aufheizdiagramm aufnehmen.
Heizung einschalten (oder mit fester Leistung, falls es sonst zu heiß wird) und die Temperaturkurve aufnehmen. Mit Arduino, oder einfach mit Bleistift und Papier.
Dann hast du die blaue Linie
In das Diagramm zeichnest du dann die Wendetangente ein. Du macht also einen Strich an die Stelle, an der die Kurve die Richtung von immer steiler werdend auf immer flacher werdend ändert.
Dann kannst du die beiden Zeiten Tu und Tg einzeichnen und aufschreiben. Die brauchst du später.
Dann brauchst du noch Ks. Das ist einfach deine Temperaturänderung (erreichte Temperatur - Zimmertemperatur) dividiert durch deine Stellgrößenänderung.
Deine Stellgröße ist dein Ausgang im Arduino.
Nehmen wir mal an, dein Ofen erreicht im Test 475°C. Wenn du im Arduino mit PWM 0..255 arbeitest dann ist Ks = (475°C -25°C)/255 = 1.765
Und dann kannst du deine Reglerparameter ausrechnen:
Kp = 0.6 * Tg / (Tu * Ks)
Ki = Kp / Tg
Kd = Kp / (Tu / 2) (P-Anteil brauchst du bei trägen Systemen (wie ein Ofen) meist nicht)
Du kannst aber mal die die Autotune-Funktion ausprobieren.
edit: In den Formeln waren mal wieder Tipfehler drin. Hab's korrigiert...