Go Down

Topic: Temperaturregelung mittels Arduino UNO[UPDATE] (Read 8841 times) previous topic - next topic

agmue

Jetzt verstehe ich Deinen Text mit den Anführungszeichen, wie Du es gemeint hast. Ja, ok, danke :)
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Nanunan

Wenn du tiefer in die Regelungstechnik einsteigen willst, dann kann ich dir nur Bücher wie dieses hier empfehlen:
https://www.amazon.de/Einstieg-die-Regelungstechnik-Vorgehensmodell-Reglerentwurf/dp/3446432612/ref=sr_1_1/256-4128308-7524236?s=books&ie=UTF8&qid=1478861613&sr=1-1&keywords=Philippsen

Damit bist du in der Lage selber digitale Regler zu schreiben. Außerdem kannst du dann alle Spielerein wie Anti-windup Effekt mit reinbringen.

Ansonsten hat fckw den Regler schon ganz gut erklärt ;)

Die Nutzung einer Bibliothek dürfte wohl der einfachere Weg sein dein Projekt umzusetzen!

Marfiosie

Hallo,

danke für all die Ratschläge. Bitte entschuldigt die spräte Rückmeldung, aufgrund der Zeitverschiebung liegt man ein bisschen auseinander. Ich werde mich für den Anfang an einem Zweitpunktregler probieren und die Sache dann wohl als PI verfeinern. Die Semester Reglungstechnik sind bei mir schon eine Weile her...
Wo finde ich die PIDArduino Library ? Oder ist die in der IDE mit drin...

Danke für die Anregungen! Ich werde mich die Tage mal reinfitzen.


skorpi080

playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0


Marfiosie

Hallo nochmal,

es ist jetzt einige Zeit vergangen, aber ich habe die Zeit  genutzt um mich ein bisschen einzuarbeiten und meinen ersten Sketch zu schreiben. Das Auslesen der Thermistoren scheint schon ganz gut zu klappen, wenngleich ich es nur rudimentär mit fixen Widerständen prüfen konnte, da die Thermistoren erst die Woche bei mir eintrudeln...
Der Sketch ist noch nicht ganz fertig. Es soll noch ein zweiter Sensor rein und eine Möglichkeit mittels Potentiometer den Sollwert vorzugeben, aber das denke ich krieg ich gebacken. Woran ich grade etwas zu knabbern habe ist meine Regelung :smiley-confuse: . Aber zunächst der Reihe nach noch mal die Fakten:

Was soll rauskommen:
Eine (PID ?) Regelung einer Heizplatte (12V)...
Dabei handelt es sich um die folgende: HEATBED


Bisher habe ich den folgenden Sketch, welcher an der ein oder anderen Stelle sicherlich noch nicht ganz sauber geschrieben ist:

Code: [Select]


///////////////////////////////
//////// Declaration //////////
///////////////////////////////
// Loading config- File
#include "config.h"
// Loading  Thermistor read function
#include "get_thermistor_temp.h"
#include <LiquidCrystal.h>


LiquidCrystal lcd(7,8,9,10,11,12,13);
///////////////////////////////
//////////// Setup ////////////
///////////////////////////////
void setup()
{

Serial.begin(9600);
Serial.println("Starting Controlling");
 
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("Starting Controlling");
   
}

///////////////////////////////
//////////// Loop /////////////
///////////////////////////////

long T_set=0;
void loop()

{
  // TEMPERARATUR 1
  int T1=get_thermistor_temp(THERMISTOR1_TYPE, THERMISTOR1_PIN);

  // Serial Input Controller Temperature
  if(Serial.available()){ 
    T_set=Serial.parseInt();
  }

  // Seriell Output
  Serial.print("TEMP 1 = ");
  Serial.print(T1);   
  Serial.println(" C");
 
  Serial.print("SET_TEMP = ");
  Serial.print(T_set);   
  Serial.println(" C");

 
  // LCD OUTPUT
  lcd.setCursor(0,0);
  lcd.clear();
  lcd.print("T1: ");
  lcd.print(T1);   
  lcd.print(" C");
  lcd.setCursor(0,1);
  lcd.print("T2: ");
  //lcd.print(T2);   // comming soon
  lcd.print(" C");
  delay(1000);
  lcd.setCursor(0,0);
  lcd.clear();
  lcd.print("T_set: ");
  lcd.print(T_set);   
  lcd.print(" C");
 
  if (T_set-T1 > 2){
    lcd.setCursor(0,1);
    lcd.print("HEATING");
  }
  delay(1000);
 
         

}


Code: [Select]
// CONFIG_ FILE

// Define Thermistor Pins: (max.:2)
  #define NUM_THERMISTOR 1
  #define THERMISTOR1_PIN 0
  //#define THERMISTOR2_PIN 1

// Define Thermocpuple Pins: (max.:2)
  #define NUM_THERMOCOUPLE 0
  //#define THERMOCOUPLE1_PIN 1
  //#define THERMOCOUPLE1_PIN 1

//Define Theristor Typ:
  // 1: Epcos 100K Thermistor
  #define THERMISTOR1_TYPE 1
  //#define THERMISTOR2_TYPE 1

//Define Thermocouple Typ:
  // 1: ...
  //#define THERMOCOUPLE1_TYPE 1
  //#define THERMOCOUPLE2_TYPE 1

//PID
  #define K_P 7
  #define K_I 2
  #define K_D 40



Code: [Select]
// Input: Type, Voltage; Output: Temperature

int get_thermistor_temp(int type, int pin) {
  /////////////////////////
  /// Temperauture Table///
  ////////////////////////

  // TYPE 1: EPCOS 100K
  int steps_THMI_type1 = 20;
  short temptable_THMI_type1[steps_THMI_type1][2] = {
   {1, 841},
   {54, 255},
   {107, 209},
   {160, 184},
   {213, 166},
   {266, 153},
   {319, 142},
   {372, 132},
   {425, 124},
   {478, 116},
   {531, 108},
   {584, 101},
   {637, 93},
   {690, 86},
   {743, 78},
   {796, 70},
   {849, 61},
   {902, 50},
   {955, 34},
   {1008, 3}
  };

  // TYPE 2: ...

  ////////////////////
  /// Interpolation///
  ////////////////////

  int rawtemp = analogRead(pin);
 
  switch (type) {
    case 1: {
        int i;
        for (i = 1; i<steps_THMI_type1; i++){
          if (temptable_THMI_type1[i][0] > rawtemp){
            int realtemp =temptable_THMI_type1[i - 1][1] + (rawtemp - temptable_THMI_type1[i - 1][0]) * (temptable_THMI_type1[i][1] - temptable_THMI_type1[i - 1][1]) / (temptable_THMI_type1[i][0] - temptable_THMI_type1[i - 1][0]);
     
            if (realtemp > 255){
              realtemp = 255;
            }
            return realtemp;
     
            break;
          }
        }
      break;
    }
    case 2: {
      break;
    }
    default: {
      break;
    }
  }
 
   
}


Ich möchte als nächsten Schritt eine PID- Reglung einbauen. Die P,I und D- Glieder habe ich bereits als Anfangswerte. Als Solltemperatur ist T_set und als Isttemperatur T1 vorerst vorgesehen.

Nun zu den Unklarheiten:
- zunächst zur Verkabelung: Es ist bereits das Wort MOFSET gefallen, aber leider habe ich keinen FET da- kann ich für den Zweck auch einen normalen NTC nutzen?
- Ich bin in der PID- Libaray zwangsläufig auch auf diese Funktion gestoßen:
Code: [Select]
PID(&Input, &Output, &Setpoint, Kp, Ki, Kd, Direction)

Kp, Ki und Kd sind mir noch ein Begriff, Setpoint wird wohl meine Zieltemperatur T_set sein, und INPUT meine Isttemperatur T1? Direction hätte ich auf DIRECT gesetzt... Ist das so korrekt?
- Wie funktioniert das mit dem Output. Muss ich da einen PWM definieren der an den MOFSET drangeklemmt wird und was muss ich dabei beachten...

Ich hoffe das ist nicht zu schwammig und der Sketch nicht zu grusilig...

DANKE für die viele Hilfe bisher!!!

guntherb

#21
Nov 16, 2016, 12:47 pm Last Edit: Nov 16, 2016, 12:50 pm by guntherb
Wenn dein PID-Regler vernüftig regeln soll, müssen die delay() raus aus dem Code.

Es ist bereits das Wort MOFSET gefallen, aber leider habe ich keinen FET da- kann ich für den Zweck auch einen normalen NTC nutzen?
Ich verstehe die Frage nicht: MOSFETs und NTC haben nichts miteinander zu tun. ein Mosfet ist ein Leistungsschalter, ein NTC ein temperaturabhängiger Widerstand.

- Wie funktioniert das mit dem Output. Muss ich da einen PWM definieren der an den MOFSET drangeklemmt wird und was muss ich dabei beachten...
Der Output der PID-Lib liefert default einen Wert 0-255, den kannst du direkt als PWM-Wert für dein Stellglied nehmen.

Den MOSFET kannst du so anschliessen (da wo der Motor ist, muss deine Heizung hin):
Grüße
Gunther

Go Up