Probleme Temperatur auszulesen und mit PID zu Regeln

Hallo zusammen,
ich bin noch recht neu in diesem Gebiet und würde mich freuen wenn ihr mir helfen könntet. Ich möchte mit einem PT1000 Sensor den ich an einen PT1000 Messwandler von Pollin angeschlossen habe auslesen und Regeln. Nunja mein Problem fängt schon damit an, die Temperatur richtig auszulesen. Ich habe dieses mit dem map befehl jetzt gemacht, aber ich denke mal das ist falsch, da ich die auflösung von dem sensor nicht kenne. Das zweite problem was ich habe ist, dass mein PID-Regler zwischen zwei werten andauernd springt und sich verhakt. So sieht es zumindest im seriellen Monitor aus

#include <PID_v1.h>


#define PIN_INPUT A0
#define PIN_OUTPUT 3 /// ändern



float voltage;


//Define Variables we'll be connecting to
double Setpoint, Input, Output;

//Define the aggressive and conservative Tuning Parameters
double aggKp=4, aggKi=0.2, aggKd=1;
double consKp=1, consKi=0.05, consKd=0.25;

//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);

void setup() {
  Serial.begin(9600);
  
  //initialize the variables we're linked to
  Input = analogRead(PIN_INPUT);
  Setpoint = 100; // mom fest, zu ändern
  //turn the PID on
  myPID.SetMode(AUTOMATIC);

   
}

void loop() {
  Input = analogRead(PIN_INPUT);
  Serial.print("Sensor Value: ");
  Serial.print(Input);

  float voltage = (Input/1024.0)*5.0;
  Serial.print(", Volts: ");
  Serial.print(voltage);

  Serial.print(", degrees C: ");
  float temperatur= map(Input, 0, 1024, 0, 250);
  Serial.println(temperatur);

  double gap = abs(Setpoint-temperatur); //distance away from setpoint
  if (gap < 10)
  {  //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();
  analogWrite(PIN_OUTPUT, Output);

  delay(1000);
}

Für jede eurer Hilfen wäre ich dankbar. Sowohl fürs richtige temperatur auslesen, als auch für die richtige regelung :smiley:

.... erstmal die Soll und Istwerte erfassen und auswerten.
Dann erkennen, wie die Parameter für den PID Regler angepasst werden müssen, damit dieser sinnvoll arbeitet.
Das beschriebene Verhalten läßt darauf schließen, dass die Parameter nicht passen.

Weitere Hilfe ist nur mit Kenntniss der Soll- und Istwerte sowie der Details der kompletten Regelschleife.
-> NEED INPUT!

Solange die Temperaturmessung komplett spinnt, brauchst du dich um Regeln nicht zu kümmern...

Der map Befehl setzt voraus, dass der Spannungswert den du am Messwandler messen kannst, linear mit der Temperatur zusammenhängt. Das sollte eigentlich, nach der hier verlinkten Beschreibung möglich sein. Ich wüsste aber nicht, wie wir dir dabei helfen können, was über die Beschreibung hinausgeht...

Was die Regelung angeht: "Zwischen 2 Werten hin und her" ist schonmal besser als gar nicht reagieren :wink:
Aber wenn man nicht weiss, wie der PID-Ausgang die gemessene Temperatur überhaupt beeinflussen soll, kann man natürlich nicht helfen...

  1. Zuerst mußt du deine Temperaturmessung in Ordung bringen.
    Dazu brauchst du vom deinem Messumformer die Kennlinie, die steht bestimmt im Datenblatt. Wenns ein Bausatz ist, wirst du den wahrscheinlich vermessen müssen.

  2. KEIN DELAY IM CODE!!!

der PID-Regler lebt davon, dass er im Hintergrund ständig arbeitet. Mit einem Delay blockierst du den Arduino und damit auch den PID-Regler.

  1. Kenne deine Regelstrecke.
    elementar ist, dass du weißt, wie deine Regelstrecke reagiert. Also, wie schnell sich die Temperatur ändert, wenn du die Heizung einschaltest. Die Temperatur eines Glühdrahtes zu regeln erfordert völlig andere Parameter als die Regelung eine Hauses...

  2. PID einstellen: es gibt viele Methoden. (lass übrigens das mit den 2 Parametersätzen weg. Für eine Temperaturregelung reicht einer völlig aus)
    Eine sehr einfache empirische Methode:
    alle Parameter zu Null.
    dann langsam den Kp erhöhen, bis sich ein leichtes Überschwingen einstellt.
    Nun Ki langsam erhöhen (Achtung: fang mit 0,0001 an! Ki ist sehr empfindlich), bis sich die Regelung am besten einpendelt. Jetzt, falls nötig, kannst du noch Kd dazunehmen, aber das ist meist nicht nötig.

das ist, gerade bei Thermischen Regelungen, sehr langwierig und die AUFZEICHNUNG der Regelgrößen ist unerlässlich. Das kannst du über den Seriellen Monitor machen. Bastel dir eine Ausgabe z.B. so:

 // Ausgabe der Messwerte in konstanten Zeitabständen
  static unsigned long Zeitscheibe = 0; 
  if (millis()- Zeitscheibe > 10000 ) {          // Zeitscheibe wird alle 10 sek  aufgerufen
      Zeitscheibe  = millis();  
      Serial.print(millis()/1000.0/3600.0/24.0,6);Serial.print("\t");  // Ausgabe Systemzeit im Excel-Format
      Serial.print(Input);Serial.print("\t");
      Serial.print(Output);Serial.println);
  }

so kannst du den Inhalt des Seriellen Monitors kopieren und in Excel grafisch anzeigen lassen.

Wenn das mit den Versuchen zu lange dauert, kannst du auch aus der Sprungantwort nach den Einstellregeln von Ziegler/Nichols die Parameter ermitteln. Das ist auch in Wikipedia beschrieben und funktioniert ganz gut.

Noch was fiel mir auf: du fütterst deinen Regler direkt mit dem Signal des AD-Wandlers, du musst also auch deinen Sollwert (Setpoint) in AD-Werten eingeben.
Beispiel: du willst auf 50°C regeln, 50°C entsprechen dem AD-Wert 324, also muss der Setpoint auf 324 gesetzt werden.