Hallo zusammen, ich weiss, dass das Thema schon mehrfach besprochen wurde. Grundsätzlich habe ich auch keine Frage zu Aufbau, Verdrahtung, Berechnungsformel etc. Mein Problem ist, dass ich, anhand des Datenblattes, nicht weiss, welche Werte ich für A1 B1 C1 und D1 nehmen muss... Hab mit den Datenblättern zu NTC nicht soviel Erfahrung, eigentlich gar keine... Ich habe einen NTC mit 2.2K mit folgendem Datenblatt: [[http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=B400%252FNTC-02_Serie.pdf;SID=29AA3x0qwQAR0AACxbmjwae0bb57c39b21a6831d1a0752384d586]] Kann mir vielleicht jemand helfen?
Also : R(T):=R(25)*exp(b25*(1/(T+273) - 1/(25+373) )); oder aehnlich. Das exponentielle Polynom wuerd ich lassen, den besser als 2% ist der Sensor nicht.
Auf Seite 2 in der Tabelle findest du deinen B-Wert, hier für 2200 Ohm 3977. Auf Seite 4 unter der Formel ist das dann der Parametersatz 9 Eine Tabell ist auf Seite 10-11 unter Spalte 6.222 Hoffe, dein µC hat Rechenpower ;) Hans
Nee. Ein AVR packt das schon. Vielleicht nicht 10k mal pro sekunde. Aber ein paar Duzend mal sollte gehen.
okay alles klar... Also könnte ich mit folgender Formel die Temperatur berechnen: T(R) = B / [273*(ln(RT/2200)+(1/25+273)] Ich habe einfach die obige Formel nach T aufgelöst. Oder habe ich einen Fehler gemacht?
Fuer ein Renesas Board hab ich mal folgende Funktion geschrieben:
1 | float calculate_ntc_temp(void) |
2 | {
|
3 | float rth; |
4 | float temp; |
5 | |
6 | // values and formula taken from datasheet at http://www.vishay.com/docs/29049/23226403.pdf
|
7 | // NTC type used on SKP board is 2322 640 66103
|
8 | |
9 | const float a = 3.354016e-3; |
10 | const float b = 2.569355e-4; |
11 | const float c = 2.626311e-6; |
12 | const float d = 0.675278e-7; |
13 | |
14 | temp = ad1_value; |
15 | rth = (temp * 7320.0) / (1024.0 - temp); // now we have the resistance in ohms |
16 | |
17 | temp = log(rth/10000.0); |
18 | |
19 | rth = (1.0/(a+b*temp+c*temp*temp+d*temp*temp*temp))-273.16; |
20 | return rth; |
21 | }
|
Zum Test hatte ich noch einen DS1820 auf dem Board. Die Abweichung zwischen den beiden Sensoren war im getesteten Bereich (~10-30 C) immer <= 0,1 Grad.
Hallo olli, Ich stand vor dem gleichen Problem. Ich habe mir mit dem PC ausrechnen lassen und dann in ein Array fest codiert. War halt nur 8 bit. Gruß, Tom
> rth = (1.0/(a+b*temp+c*temp*temp+d*temp*temp*temp))-273.16;
Nicht optimal. Da kann man sich einiges sparen wenn man mit dem
Hornerschema arbeitet.
Allenfalls auf Ganzzahl umformen.
Nebliger Pfad schrieb: > Nicht optimal. Da kann man sich einiges sparen wenn man mit dem > Hornerschema arbeitet. > Allenfalls auf Ganzzahl umformen. Hast Du da ein C-Beispiel? Kommt auch noch auf mich zu und ich muss das Rad ja nicht zum ...zigsten Mal neu erfinden.
C, C ,C ... wenn man die Mathematik begriffen hat ist es nicht sehr schwer. Also. Anstelle von a*x+b*x*x+c*x*x*x // 6 multiplikationen 2 additionen schreibt man x*(u+x*(w+z*x)) //3 multiplikationen 2 additionen
Hallo Olli, man kann auch für kleinere Temperaturbereiche mittels passendem Spannungsteilerwiderstand linearisieren. -> es reicht eine Geradengleichung um die Temperatur aus dem ADC-Wert zu berechnen. Siehe hier: Beitrag "Temperatur Messung mit Mega8 und NTC-Widerstand 4,7k" bei einem NTC mit 2K2 ist bei normalen ADC-Messbereichen die Selbsterwärmung des Sensors nicht zu vernachlässigen. Ich würde bei 5V ADC einen NTC nicht unter 10 KOhm verwenden. (5V*5V / 10K = 2,5 mW bei 200K/W ergibt sich ein Fehler von 0,5K)
einfach ausklammern, die entsprechende Zeile sieht dann so aus:
1 | rth = (1.0/(a+b*(c+temp*(temp(d+temp))))-273.16; |
spart ein paar multiplikationen. war in dem fall relativ egal, da das ding nur 1 mal pro sekunde lief und der controller eh nix zu tun hatte.
Ich mach gerade so was ähnliches mit einem NTC-Widerstand von Conrad, bei dem diese Koeffizienten (a, b, c,...) nicht angegeben sind. Jedoch ist im Datenblatt eine Tabelle, in der die Widerstandswerte in Abhängigkeit der Temperatur angegeben ist. Die Spannung über dem NTC wird gemessen, damit kann man auch die Spannung am Vorwiderstand und den Strom und folglich auch den Widerstandswert des NTCs berechnen. Dann such ich in der Widerstandstabelle aus dem Datenblatt (liegt als const im Programm natürlich vor) die beiden benachbarten Werte (darüber und darunter), linearisiere zwischen beiden Werten und erhalte damit den exakten Temperaturwert! Ich glaube, diese Methode ist relativ umständlich, aber auch genauer als die oben beschriebenen Methoden (oder was meinen die anderen?). Da ich bei dieser Methode auch kein Logarithmus benötige, hält sich in Sachen Geschwindigkeit wahrscheinlich sogar die Waage.
>Ich glaube, diese Methode ist relativ umständlich, aber auch genauer als >die oben beschriebenen Methoden (oder was meinen die anderen?). Nee ist nicht umständlich, sondern die Standard-Methode wenn man kein Floating Point verwenden sondern mit Integer-Rechnung auskommen will. Im Normalfall macht man sich eine Tabelle mit Stützstellen aus Eingangsspannung bzw. ADC-Wert (nicht Widerstand) und als Y-Wert die Temperatur. Die Genauigkeit ist (ohne Kalibrierung) limitiert durch den Sensor. Bei 1% Sensoren ist die Abweichung schon in der Gegend von bis zu 2.5 Grad.
Nebliger Pfad schrieb: > C, C ,C ... wenn man die Mathematik begriffen hat ist es nicht sehr > schwer. Es muss nicht C sein, wäre aber für Copy&Paste ideal (kostet halt keine Gehirnzellen und erzeugt keine unnötige Überschusswärme im Oberstübchen). Die Mathematik sollte kein Problem sein. Mit Hornerschema konnte ich aber zunächst nichts anfangen, habe mich auch dahingehend schlau gemacht. Trotzdem danke.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.