Go Down

Topic: Temperaturmessung bei PI-Regler spielt verrückt (Read 1 time) previous topic - next topic

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


#2
Jul 23, 2012, 12:47 pm Last Edit: Jul 23, 2012, 12:57 pm by sodaholic Reason: 1
Code: [Select]

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

mkl0815

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.

circuit99

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!
Code: [Select]
int y;
float z;

y=int(z+0.35421);



Wundert mich das da überhaupt was funktioniert

uwefed


@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

Go Up