Öl Temperatur messen, welcher Öltemperaturgeber? (KFZ)

Scherheinz:
Das wäre super! Ich versuche mir halt immer über Excel was herzuleiten, aber selbst wenn das klappt ist es noch schwierig das Ganze in den Arduino zu bekommen :wink:

So hier zunächst mal die Herleitung der Formeln. Um weitgehend konform mit den Datenblättern der NTC-Hersteller zu sein, bezeichne ich im folgenden die Nenntemperatur des NTC als T0, den Nennwiderstand als R0 (also etwas abweichend wie oben bei der Herleitung der Materialkonstanten B).

Die Schaltung: Temperatur-Messschaltung mit NTC/Thermistor

VB --------------- Ground 0V
5V RV | RN
|
|
VA
Analogeingang
am Arduino

mit
VB = Betriebsspannung des Arduino (irgendwo bei ca. 5V)
RV = Vorwiderstand
RN = Widerstand des NTC (temperaturabhängig!)
VA = Spannung am Arduino-Messeingang

Es gelte die vereinfachte Annahme, dass der Analogeingang des Arduino so hochohmig sei,
dass dort kein Strom hindurchfließt, sondern der Strom rein von VB über den Vorwiderstand,
und den NTC-Widerstand nach Ground fließe.

Dann gilt jeweils das Ohmsche Gesetz (U=R*I):

VA = RN*I
VB = (RV+RN)*I |Gleichungen dividieren

VA/VB= (RN*I)/((RV+RN)*I) |I kürzen

VA/VB= RN/(RV+RN) |*(RV+RN)

VA/VB*(RV+RN)= RN |weiter umformen

RVVA/VB + RN VA/VB = RN

RVVA/VB = RN - RNVA/VB

RV*VA/VB = RN(1-VA/VB)

RN= RV*VA/VB / (1-VA/VB) ==> Formel für den Widerstand des NTC-Widerstands!

Weiter geht's mit einer Formel aus dem NTC-Datenblatt eines beliebigen Herstellers von NTC-Widerständen
T = T0 * B / (B + T0 * ln(RN / R0))

Falls die Materialkonstante B aus einem Datenblatt bekannt ist, kann man diese zur Berechnung verwenden. Und falls man nur zwei Wertepaare aus Temperatur und Widerstand hat, kann die Konstante selbst berechnet werden. Ich habe deshalb mal zwei Funktionen gemacht, und zwar zur Verwendung bei bekannter Materialkonstante B aus einem Datenblatt:
float temperature_NTCB(float T0, float R0, float B, float RV, float VA_VB)

Und falls man die Materialkonstante B nicht hat, aber dafür zwei Wertepaare für Temperatur und Widerstand:
float temperature_NTC(float T0, float R0, float T1, float R1, float RV, float VA_VB)

Die einzelnen Parameter sind im Code nochmal erklärt. Die Variable "VA_VB" bezeichnet das Verhältnis aus Spannung am NTC geteilt durch die Betriebsspannung. Praktischerweise ermittelt der Aruino genau dieses Verhältnis in 1024 Schritten, so daß man an der Stelle einfach den Messwert des Analogpins geteilt durch den Maximalwert 1023.0 (das .0 damit es eine Float-Variable wird) übergeben kann.

Vielleicht mag mal jemand den Code testen. Ich habe gar keinen NTC hier.

// NTC temperature calculation by "jurs" for German Arduino forum
#define ABSZERO 273.15
#define MAXANALOGREAD 1023.0

float temperature_NTCB(float T0, float R0, float B, float RV, float VA_VB)
// Ermittlung der Temperatur mittels NTC-Widerstand
// Version der Funktion bei gegebener Materialkonstante B
// Erklärung der Parameter:
// T0           : Nenntemperatur des NTC-Widerstands in °C
// R0           : Nennwiderstand des NTC-Sensors in Ohm
// B            : Materialkonstante B
// Vorwiderstand: Vorwiderstand in Ohm  
// VA_VB        : Spannungsverhältnis "Spannung am NTC zu Betriebsspannung"
// Rückgabewert : Temperatur
{
  T0+=ABSZERO;  // umwandeln Celsius in absolute Temperatur
  float RN=RV*VA_VB / (1-VA_VB); // aktueller Widerstand des NTC
  return T0 * B / (B + T0 * log(RN / R0))-ABSZERO;
}


float temperature_NTC(float T0, float R0, float T1, float R1, float RV, float VA_VB)
// Ermittlung der Temperatur mittels NTC-Widerstand
// Version der Funktion bei unbekannter Materialkonstante B
// Erklärung der Parameter:
// T0           : Nenntemperatur des NTC-Widerstands in °C
// R0           : Nennwiderstand des NTC-Sensors in Ohm
// T1           : erhöhte Temperatur des NTC-Widerstands in °C
// R1           : Widerstand des NTC-Sensors bei erhöhter Temperatur in Ohm
// Vorwiderstand: Vorwiderstand in Ohm  
// VA_VB        : Spannungsverhältnis "Spannung am NTC zu Betriebsspannung"
// Rückgabewert : Temperatur
{
  T0+=ABSZERO;  // umwandeln Celsius in absolute Temperatur
  T1+=ABSZERO;  // umwandeln Celsius in absolute Temperatur
  float B= (T0 * T1)/ (T1-T0) * log(R0/R1); // Materialkonstante B
  float RN=RV*VA_VB / (1-VA_VB); // aktueller Widerstand des NTC
  return T0 * B / (B + T0 * log(RN / R0))-ABSZERO;
}


void setup()
{
  Serial.begin(9600);
}


#define ANALOGPIN A2

void loop()
{
  float T0=60;    // Nenntemperatur des NTC-Widerstands in °C
  float R0=221.2; // Nennwiderstand des NTC-Sensors in Ohm
  float T1=120;   // erhöhte Temperatur des NTC-Widerstands in °C
  float R1=36.5;  // Widerstand des NTC-Sensors bei erhöhter Temperatur in Ohm
  float Vorwiderstand=100; // Vorwiderstand in Ohm  
  float temp;    
  int aValue=analogRead(ANALOGPIN);
  
  // Berechnen bei unbekannter Materialkonstante
  temp=temperature_NTC(T0, R0, T1, R1, Vorwiderstand, aValue/MAXANALOGREAD);
  Serial.print("NTC : ");Serial.print(temp);Serial.println(" C");
  // Berechnen bei bekannter Materialkonstante B=3933;
  temp=temperature_NTCB(T0, R0, 3933, Vorwiderstand, aValue/MAXANALOGREAD);
  Serial.print("NTCB: ");Serial.print(temp);Serial.println(" C");
  delay(1000);
}