Pages: [1]   Go Down
Author Topic: Temperaturmessung bei PI-Regler spielt verrückt  (Read 1634 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Jr. Member
**
Karma: 2
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset



glaskugel ?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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);
}
« Last Edit: July 23, 2012, 05:57:42 am by sodaholic » Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 82
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
int y;
float z;

y=int(z+0.35421);


Wundert mich das da überhaupt was funktioniert
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 262
Posts: 21580
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

glaskugel ?
Entschuldigt, war mal 2 Tage auf dem Berg.
Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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
Logged

Pages: [1]   Go Up
Jump to: