Messwandler 0-10V auf 0-10kOhm als Temperatursensor Simulator

Für unsere Pellet-Holzscheit Kombiheizung haben wir einen Messwandler entwickelt, der ein Eingangssignal von 0-10V in einen Widerstandswert eines NTC5k Sensors wandelt im Bereich 10 – 130°C. Wir können der Kesselsteuerung nun über zwei Ausgänge 0-10V vom Universalregler UVR16x2 die Speichertemperatur-Oben und Speichertemperatur-Unten von 10-130°C vorgeben.

Anwendungsgebiete sind:

Im Holzscheitbetrieb dürfen alle 3 Speicher (1000L) beladen werden und es werden die vom UVR gemessenen Temperaturen von Speicher-1-oben und Speicher-3-unten für die Kesselsteuerung ausgegeben.

Im Pelletbetrieb sollen nicht alle 3 Speicher beladen werden daher wird der gemessene Temperatur vom Speicher-1-oben und Speicher-1-unten an die Kesselsteuerung ausgegeben und der Kessel schaltet früher ab.

Wird eine höhere Temperatur an die Kesselsteuerung ausgegeben, kann verhindert werden, dass der Kessel anspringt wenn in einer Stunde Wärme aus der Solarthermie erwartet wird.

Ein Arduino Nano skaliert das 0-10V Eingangssignal in eine Temperaturvorgabe zwischen 10°C-130°C. Anschließend wird die Kennlinie eines NTC5k Sensors für die Kesselsteuerung simuliert und der erforderliche Widerstandswert am Ausgang eingestellt. Die Versorgungsspannung beträgt 7-28V und als Digitalpotentiometer wird ein MCP42010 verwendet. Alle 100ms werden die Eingänge eingelesen 

Der Code vom Arduino:

#include "AH_MCP41xxx.h"

#define CS   10   //chipselect pin
#define SHDN 9   //shutdown pin
#define RS   8   //reset pin

#define POTIOMETER_0 0
#define POTIOMETER_1 1

int IN1 = A0;
int IN2 = A1;
int v1;
int v2;
long OldTime;
int offset = -2;
int DEBUG = 0;
 
AH_MCP41xxx mcp42010;

void setup() {
  // initialisation MCP42xxx
  mcp42010.init_MCP42xxx (CS, SHDN, RS);  
  // initialize serial:
  Serial.begin(9600);
  Serial.println("Programm Start");
  OldTime = millis();
}

void Channel_1(){
   v1 = analogRead(IN1);
   float temp1 = 120.0 / 1024.0 * v1 + 10.0;
   float x1 = temp1;
   if (x1 < 10.0) {x1 = 10.0;}
   if (x1 > 130.0) {x1 = 130.0;}
   float zwerg1 = -0.0000000500488*pow(x1,5)+0.0000222097*pow(x1,4)-0.00395083*pow(x1,3)+0.360786*pow(x1,2)-17.6734*x1+398.265;
   int y1 = round(zwerg1);
   y1 = y1 + offset;
   mcp42010.setValue(y1, POTIOMETER_0);   
   if(DEBUG == 1){
      Serial.print("ADC1_In: ");
      Serial.print(v1);
      Serial.print(" Temp1: ");
      Serial.print(temp1);
      Serial.print(" °C ");
      Serial.print(" i_Poti_1: ");
      Serial.println(y1);
   }

}

void Channel_2(){
   v2 = analogRead(IN2);
   float temp2 = 120.0 / 1024.0 * v1 + 10.0;
   float x2 = temp2;
   if (x2 < 10.0) {x2 = 10.0;}
   if (x2 > 130.0) {x2 = 130.0;}
   float zwerg2 = -0.0000000500488*pow(x2,5)+0.0000222097*pow(x2,4)-0.00395083*pow(x2,3)+0.360786*pow(x2,2)-17.6734*x2+398.265;
   int y2 = round(zwerg2);
   y2 = y2 + offset;
   mcp42010.setValue(y2, POTIOMETER_1);   
   if(DEBUG == 1){
      Serial.print("ADC2_In: ");
      Serial.print(v2);
      Serial.print(" Temp2: ");
      Serial.print(temp2);
      Serial.print(" °C ");
      Serial.print(" i_Poti_2: ");
      Serial.println(y2);
   }

}


void Timer100ms(){
   Channel_1();
   Channel_2();
   OldTime = millis();
}

void loop() {
  // 100ms Timer
  if (OldTime+100<=millis()) {
  
    Timer100ms();
  }
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert