Go Down

Topic: Temperaturmessung bei PI-Regler spielt verrückt (Read 2093 times) 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy