pow() funktioniert nicht?

Hi zusammen,

ich will mit einem Kumpel zusammen einen Temperatursensor zum laufen bringen. Der Sensor verändert seinen Widerstand je nach Temperatur. Je höher die Temperatur, desto niedriger der Widerstand. Nachdem wir ein paar Messungen gemacht hatten, konnten wir eine schöne Kurve erstellen. Zu dieser Kurve konnte ich eine Funktionsgleichung aufstellen, die wie folgt aussieht:

f(x)=2060.2867861757*Widerstand-0.2893352414

Da in dieser Gleichung eine Potenz vorkommt, musste ich pow() verwenden. Meine Programmzeile sieht nun so aus:

Temperatur=1/pow(2060.2867861757*Widerstand,0.2893352414);

Wie man sieht, habe ich 1 durch das alles geteilt, um eine negaive Potenz zu umgehen, da ich rausfand, dass pow damit nicht immer umgehen kann. Doch selbst nach diesen Maßnahmen bekam ich immer Werte um die 0,0017 bis 0,035 *Celsius im seriellen Monitor angezeigt. Zwischendurch habe ich auch versucht, die Dezimalzahlen auf eine Stelle nach dem Komma zu kürzen. Doch alles vergebens.

Was ist das Problem?

Ich hoffe, jemand kann mir helfen!

Danke im Vorraus

32-Bit Floats werden dafür zu ungenau sein. Da bekommst du Rundungsfehler. Das ist aber generell der völlig falscher Ansatz. Für temperaturabhängige Widerstände gibt es fertige Formeln! Der Widerstand ändert sich mit dem natürlichen Logarithmus.

https://de.wikipedia.org/wiki/Hei%C3%9Fleiter https://de.wikipedia.org/wiki/Kaltleiter

Hier gibt es Arduino Code für NTCs: http://forum.arduino.cc/index.php?topic=155733.msg1170722#msg1170722 Herleitungen und Erklärungen wie man das umstellt gibt es da auch

Da ist eine Funktion dabei wenn man die Koeffizienten aus dem Datenblatt kennt. Und eine Funktion wenn man statt dessen zwei Punkte auf der Kennlinie hat.

zum einen hast du einen Fehler drin:

f(x)=2060.2867861757*Widerstand-0.2893352414

ist nicht
Temperatur=1/pow(2060.2867861757*Widerstand,0.2893352414);

sondern
Temperatur=2060.2867861757 / pow(Widerstand,0.2893352414);

Es sei denn, die original Formel hätte gelautet:
f(x)=(2060.2867861757*Widerstand)-0.2893352414

Zum anderen sind solche Rechnereien mit einem 8-bit µP recht fehlerbehaftet und dauern lange.
mach dir eine tabelle und interpoliere zwischen den Werten linear.
Das ist besser.

Danke für die schnellen Antworten!

@Serenifly, leider kenne ich den Namen des Sensors nicht und so konnte bis jetzt ich auch kein Datenblatt finden.

@guntherb, danke für das Korrigieren des Rechen-Fehlers. Jetzt funktioniert es auf jedenfall besser und ich bekomme Werte, die wohl eher stimmen dürften :slight_smile:

aber ihr habt wohl beide recht damit, dass meine Methode zu ungenau ist und ich werde demnächst mal eure Tipps ausprobieren.

Nun schöne Grüße und nochmals Dankeschön!

Lukas