Temperaturmessung bei PI-Regler spielt verrückt

Hey Arduino Board,

hab gerade ein Problem das mich schon seit ein paar Tagen zum verzweifeln bringt:

Ich bau gerade einen PI-Regler für eine mobile Wasserstoffbrennzelle. Temperatur messen, funktioniert. Lüfter per PWM ansteuern ist auch kein Problem. Wenn ich beides aber in einem Projekt reinhacke und nebenbei meinen geschriebenen PI-Regler laufen lasse bekomm ich auf einmal seltsame Ergebnisse für die Temperatur per Serial.print. Der erste Wert, den ich erhalte macht Sinn, die anderen darauffolgenden Werte sind alle ca. 8 Grad Celsius zu hoch. Das Ganze sieht dann zum Beispiel so aus:

16.89 25.19 25.19 25.19 25.19 25.68 25.19 25.19 25.19 25.19 25.68 25.68 . . .

Woran liegt das und wie kann ich das Problem umgehen?

Vielen Dank schonmal, sodaholic

glaskugel ?

int pwm = 0;
int Tsoll = 30;
int esum = 0;
int Kp = 3;
int Begrenzer = 200;
int y = 0;
int Tabt = 0.1;
int Tempin = 0;
int PwmOut = 5;

void setup(){
  Serial.begin(9600);
  pinMode(PwmOut, OUTPUT);
  pinMode(Tempin, INPUT);
}

void loop(){
  y = PIR();
  luefterspeed(y);
  delay(100);
}

int PIR(){
  float e = Tempmess() - Tsoll;
  esum = esum + e;
  if(esum < Begrenzer*(-1)){
    esum = Begrenzer * (-1);
  }
  if(esum > Begrenzer){
    esum = Begrenzer;
  }
  int pwm = Kp * e + 0.00 * Kp * esum * Tabt;
  if(pwm > 255){
    pwm = 255;
  }
  if(pwm < 0){
    pwm = 0;
  }
  return pwm;
}
  
//Messen der Temp in Celsius
float Tempmess(){
  float Celsius = 0;
  Celsius = analogRead(Tempin) * 0.004882812 * 100 - 273.15;
  Serial.println(Celsius);
  return Celsius;
}

//PWM-Signal Verarbeitung und Einstellung
void luefterspeed(int speed){
  speed = 255 - speed;
  analogWrite(PwmOut, speed);
}

Hast Du die anderen unbenutzten analogen Eingänge mal auf Masse gelegt? Analoge Messungen streuen teilweise, wenn die restlichen Pins unbeschaltet sind. Evtl. reicht ja schon Dein PWM-Signal oder der rotierende Lüfter, um die Messwerte zu beeinflussen.

int Tabt = 0.1;

Was soll das? int sind Ganzzahlige Werte

int pwm = Kp * e + 0.00 * Kp * esum * Tabt;

0,00 mal irgendwas ist immer Null! Außerdem hast du pwm schon mal global deklariert.

Deklariere bitte alle Variablen entsprechend ihrer Verwendung. Wandle die Variablen mit den Entsprechenden Funktionen um!

int y;
float z;

y=int(z+0.35421);

Wundert mich das da überhaupt was funktioniert

Yeahuno: glaskugel ?

Entschuldigt, war mal 2 Tage auf dem Berg. Uwe

@mkl0815 Danke, hab die anderen analogen Kanäle mal auf Masse gelegt, bringt leider nichts.

@circuit99 Hast du vollkommen recht! Zu der Sache mit dem 0.00 will ich aber anmerken, dass das Absicht war, ich will erstmal Kp-kritisch für den P-Regler bestimmen und hab deswegen mit der 0 Multiplikation das I-Glied rausgenommen.

Gestern ist mir per Twitter noch der reingeflogen den 2k Ohm Widerstand für den LM335 durch 2 1k Ohm Widerstände zu ersetzen und zwischen den Widerständen einen 1uF Kondensator an Masse zu legen. Auch das ist leider ohne Erfolg.

Viele Grüße, sodaholic