NTC als spannungsteiler linearisieren?

OP #4526726
Lesenswert?

Ich bastel grade ein Thermometer und dazu würde ich gerne einen ntc 
nehmen weil die doch recht robust und trotzdem billig sind.
Jetzt ist das hinterlistige Teil natürlich nicht linear.
Gurgel liefert eine Seite die angeblich eine Schaltung und Werte liefert 
( http://www.electronicdeveloper.de/MesstechnikNTCLinearR.aspx ) 
allerdings wollen die jetzt plötzlich Geld.
An sich kann das ja aber nur eine ganz einfache Formel sein, leider 
findet sich nur kram um den Widerstand an sich zu linearisieren (und 
nicht die Ausgangsspannung eines teilers).

Vlt. Weiß hier ja jemand die Formel dazu?

Danke für eure hilfe :)
Gast #4526739
Lesenswert?

Max D. schrieb:
> Ich bastel grade ein Thermometer und dazu würde ich gerne einen ntc
> nehmen weil die doch recht robust und trotzdem billig sind.

Und was machst du mit dem NTC?
Du wertest ihn irgendwie über einen µC aus oder (Spannungsteiler, C 
laden über den NTC. usw.)?

Wo ist also dein Problem die Linearisierung über Software zu machen?
#4526751
Lesenswert?

> Die Idee an der linearisierung mit zwei Widerständen ist eben, dass man
NICHT die Expo auf dem uC fahren muss....

Dazu sollte man sich ueberlegen :
- wie oft braucht man diesen Wert ? 0.1Hz, 1Hz, 5Hz
- Wie genau braucht man die Temperatur ?
- Darf kalibriert werden, sonst Produktestreueung einbeziehen

Nicht vergessen : ein NTC hat auch noch eine Langzeit Drift, gemaess 
Datenblatt

Man kann die Exponentialfunktion, resp, den NTC plus Spannungsteiler 
durch ein Polynom approximieren. Eine Taylorentwicklung. Den Fehler kann 
man sich fuer jeden Grad plotten lassen, und dann waehlen.
Man kann die Temperatur als Funktion des ADC Wetes als Tabelle mit N 
Stuetzstellen hinterlegen, und dazwischen interpolieren. Auch hier kann 
man den Fehler rechnen und optimieren.
#4526762
Lesenswert?

Max D. schrieb:

> Wenn ich mit zwei Widerständen eine (nahezu) lineare Spannung an meinen
> adc krieg, dann wäre es doch blöd da in Software rumzurechnen.

Nein, Linearisierung über Tabelle ist mit einem µC
die einfachste Lösung. Nur, wenn man ohne µC messen
will, macht die Linearisierung Sinn. Man nimmt dann
einfach den Widerstand, den der NTC genau in der
Mitte des angedachten Messbereichs hat, als Serien-
widerstand, und lebt mit dem Restfehler.
#4526770
Lesenswert?

Moin,

Max D. schrieb:
> Wenn ich mit zwei Widerständen eine (nahezu) lineare Spannung an
> meinen
> adc krieg, dann wäre es doch blöd da in Software rumzurechnen.

Das seh' ich genau anders. Durch diese "Linearisierung" mit 
Widerstaenden wird das "Nutzsignal" des NTC, also die 
Widerstandsaenderung kleiner. D.h. jegliche Stoerungen werden darauf 
bezogen groesser.
Also: In SW umrechnen. Dafuer ist ein µController ja da. Mit ein 
bisschen Hirnschmalz geht das sogar in Integerarithmetik und ohne 
Division.

Gruss
WK
OP #4526833
Lesenswert?

Ich denk ich nehm, dann den tabellengenerator aus dem link und optimier 
die table in den flash rein.
Das Ding prophezeit mir ~1 Grad Genauigkeit in meinem Bereich, dass ist 
also besser als so ein billiger ntc bringen kann, also vollauf genug. 
Und der mega hat nen hw multiplizierer, also sind die Multiplikationen 
fast geschenkt ^^
Gast #5763600
Lesenswert?

Natürlich geht Linearisieren auch mit µC, wenn der Temperaturbereich 
nicht allzu groß ist.
Für ein Thermometer sollte das überhaupt kein Problem sein.
Der Restfehler spielt dabei keine Rolle.
Die meisten Thermometer haben keine Nachkommastellen.
#5764300
Lesenswert?

Bei mir funktioniert die Seite ohne Geld. Siehe screenshot.

https://www.electronicdeveloper.de/MesstechnikNTCLinearR.aspx

Hier mal ein Beispiel in dem ich den systematischen Fehler simuliere. 
Das ist die Abweichung von einer Geraden umgerechnet in Grad Celsius. 
Das Simulationsprogramm LTspiceXVII kanst du hier herunterladen.
Programm
http://ltspice.analog.com/software/LTspiceXVII.exe
Anleitungen
https://www.analog.com/en/design-center/design-tools-and-calculators/ltspice-simulator.html

Der Parameter B steht im Datenblatt des NTC-Widerstandes. B und der 
Widerstand bei 25°C haben Toleranzen. Die kommen dann noch als Fehler 
dazu. Um die wegzubekommen muss das verbaute Exemplar bei mindestens 
zwei genau bekannten Temperaturen vermessen werden.
Angehängte Dateien:
Gast #5764403
Lesenswert?

Von Ulrich Maassen gibt ein Polynom Makerprogramm.
Schaltflaeche "Testeingabe" aktivieren und im Grafikfeld per Maus 
Messpunkte
setzen.Danach einfach die Schaltflaechen Lin,Log,Parabolic etc 
nacheinander "ausprobieren" um zu sehen welche der dabei entstehende 
Kurve den Messpunkteverlauf am besten wiedergibt.
Die Funktion der Kurve kann man dann unter "Result" ablesen.
Als Beispiel habe ich die x-Achse mit 100 (Grad)Einheiten  und die 
y-Achse mit 1000 (Ohm)Einheiten genommen und willkuerlich NTC-Werte 
gesetzt.Das Polynom 4.Order kommt dem Messpunkteverlauf recht nahe.
Meine Werte sind natuerlich uebertrieben daneben deswegen die relativ 
"komplexe" lange Formel...
Wie dem auch sei:
Probieren und sich freuen wenn es hilft das Problem zu beseitigen oder 
eine Schnute ziehen und sich sagen: wieder so ein Scheiss der nichts 
bringt?
Angehängte Dateien:
Gast #5764446
Lesenswert?

Toxic schrieb:
> Von Ulrich Maassen gibt ein Polynom Makerprogramm.
> Schaltflaeche "Testeingabe" aktivieren und im Grafikfeld per Maus
> Messpunkte

Jede halbwegs brauchbare Tabellenkalkulation kann das.

Ein Polynom ist allerding eher selten die passende Lösung, wenn es über 
die 3. Ordnung hinaus geht. Das äußert sich in unpassendem Verhalten 
zwischen den Stützstellen (bei geringer Stützstellenzahl) und unsinnigem 
Verhalten bei Extrapolation.
#5764540
Lesenswert?

Wolfgang schrieb:
> Toxic schrieb:
>> Von Ulrich Maassen gibt ein Polynom Makerprogramm.
>> Schaltflaeche "Testeingabe" aktivieren und im Grafikfeld per Maus
>> Messpunkte
>
> Jede halbwegs brauchbare Tabellenkalkulation kann das.
>
> Ein Polynom ist allerding eher selten die passende Lösung, wenn es über
> die 3. Ordnung hinaus geht. Das äußert sich in unpassendem Verhalten
> zwischen den Stützstellen (bei geringer Stützstellenzahl) und unsinnigem
> Verhalten bei Extrapolation.

Zum Thema Polynom-Bestimmung gab es hier mal eine größere Diskussion.

Beitrag "PolynomMaker - Funktion für nichtlineare Bauelemente finden"
Gast #5764733
Lesenswert?

Helmut S. schrieb:
> Zum Thema Polynom-Bestimmung gab es hier mal eine größere Diskussion.
>
> Beitrag "PolynomMaker - Funktion für nichtlineare Bauelemente finden"

Den Thread kannte ich gar nicht - es handelt sich aber um das gleiche 
Programm.
Das Programm hatte ich hochgeladen,weil unter ulrich-maassen.de kein 
Download-button mehr fand.Aber das hat sich nun - dank Helmut - 
erledigt.
Hier der Original-Link:
http://www.serialcominstruments.com/math.php
Gast #5764790
Lesenswert?

Für meinen NTC gibt es alle 5Kelvin einen Widerstandswert.
Die Punkte habe ich in ein Koordinatensystem gezeichnet
und so für jedes Grad den entsprechenden Spannungswewrt
ermittelt und auf den Bereich von 0 bis 1023 angepasst.
In dem Sketch gibt das dann ganz viele if-Bedingungen,
hier die für +10Grad:

if (analogRead(aussen)>= 475 && analogRead(aussen) <= 482)
   {
    lcd.setCursor(5, 0); // Erste Zeile
    lcd.print("+10 ");
   }

LG
old.
Gast #5764832
Lesenswert?

Aus der W. (Firma: oldeuropesblogs.blogspot.de schrieb:
>In dem Sketch gibt das dann ganz viele if-Bedingungen,

Warum erfindet man immer wieder für ein und die
selbe Sache, immer wieder neue Begriffe? Man könnte
doch einfach Programm sagen und es so lassen.
Bei Händys hießen die Programme irgendwann Apps
und nun heißen sie auf einmal Sketch.
Gast #5764880
Lesenswert?

Toxic schrieb:
> Von Ulrich Maassen gibt ein Polynom Makerprogramm.

Oh klasse!

Leute, hat sich denn in den letzten 3 Jahren seit Erscheinen dieses 
Threads noch nicht die altbekannte Steinhart-Hart-Formel 
herumgesprochen? Die funktioniert bei einer passenden 
Dreipunkt-Kalibrierung über den gesamten Temperaturbereich, der hier zur 
Debatte steht.

Ich glaub, hier ist vor gefühlten 100 Jahren diese ganze Formelei schon 
x-mal gepostet worden.

W.S.
Gast #5764905
Lesenswert?

W.S. schrieb:
> Ich glaub, hier ist vor gefühlten 100 Jahren diese ganze Formelei schon
> x-mal gepostet worden.
>
> W.S.

Sorry - wusste ich nicht.
Ich werde von nun an vor jedem Posting erstmal eine Stunde lang googeln 
um mich zu vergewissern,dass nicht schon irgendwer vor 1000 Jahren in 
Hintertupfingen etwas aehnliches gepostet hat.☹️
Gast #5765235
Lesenswert?

Aus der W. schrieb:
> Weil der Begriff "Sketch" eine Bezeichnung für ein
> Arduino-Programm ist und Jeder sofort bescheid weiß
> wofür das gedacht ist.

Das Gegenteil ist der Fall: solche szenespezifischen Spezialbegriffe 
dienen der Abgrenzung der Insider vom Rest der Menschheit. Es soll also 
gerade niemand ausserhalb der Arduinofans wissen was gemeint ist.

Georg
Gast #5765250
Lesenswert?

Aus der W. schrieb:
> Graph anbei.

Wenn du jetzt auch noch die Wertetabelle postest, könnte man gucken, wie 
sich das ggf. mathematisch beschreiben lässt, so dass die Umsetzung der 
Spannung in eine Temperatur nicht in eine If-Orgie ausartet.

Aus den Werten des NTC würde man sogar direkt die drei Parameter für die 
Steinhart-Hart-Formel (z.B. mit Excel oder LibreOffice) bekommen und 
hätte damit, im Gegensatz zu einem hochgradigen Polynom, eine adäquate 
Beschreibung.
Gast #5765265
Lesenswert?

Aus der W. schrieb:
> anbei.

Ich hab's befürchtet. ;-(

In dem Format lassen sich die Daten leider nur etwas mühsam in ein 
Tabellenkalkulationsprogramm einlesen, um per Modellierung Parameter zu 
bestimmen. Aber glücklicherweise braucht man bei einem adäquaten Modell 
lange nicht so viele Stützstellen.
Gast #5765324
Lesenswert?

Aus der W. schrieb:
> Wolfgang schrieb:
>> Ich hab's befürchtet.
>
> Macht nichts, funktioniert auch so.

Über die Genauigkeit soll man sich allerdings keinen Illusionen 
hingeben.
Die Temperaturwerte in deine Tabelle liegen z.T. über 0.5K neben der 
Kurve. Da das offensichtlich statistische Fehler sind, deutet das auf zu 
geringe Auflösung deines Referenztermometers bzw. ungleichmäßiger 
Temperaturangleich während der Kalibriermessung hin.

Bevor man die kritiklos übernimmt, lohnt sich ein bisschen 
Qualitätskontrolle.
Angehängte Dateien:
Gast #5765347
Lesenswert?

Aus der W. schrieb:
> Wolfgang schrieb:
>> If-Orgie
>
> Das juckt den Arduino nicht im geringsten.
>
> Ich hatte schon überlegt hier im Forum
> diesbezüglich nachzufragen.
> Aber aufgrund der Foren-Erfahrungen habe ich mir das verkniffen.
> Die If-Orgie ist definitiv der schnellere Weg.

Bei einem Dutzend vielleicht noch. Aber danach ist eine Tabelle deutlich 
einfacher, wartbarer, lesbarer, wiederverwendbarer.
Gast #5765353
Lesenswert?

Wolfgang schrieb:
> deutet das auf zu
> geringe Auflösung deines Referenztermometers bzw. ungleichmäßiger
> Temperaturangleich während der Kalibriermessung hin.

Noch schlimmer, ich habe gar keines verwendet, sondern die
Werte aus dem Datenblatt vom Hersteller genommen.
Auch die Spannung habe ich nicht gemessen. Das habe
ich LTspice überlassen.

LG
old.
#5765370
Lesenswert?

Moin,

Aus der W. schrieb:
> Da kann ich nichts zu sagen weil ich es nur so machen kann,
> wie ich es eben kann.

Da wuerd' ich auch sagen: Wenns so funktioniert, warum nicht?
Unterstuetzt wird diese These ja auch dadurch, dass man kein Geld fuer 
nicht benoetigtes Flash auf dem µC zurueckbekommt. Und auch kein Geld 
bekommt oder zahlen muss, je nach dem Quotient aus der Groesse von .text 
und .data sections im Flash. Und die Temperatur ja auch nicht 
zigtausendmal pro Sekunde gemessen werden muss.

Mich taet' noch interessieren, wie's zu der im 
Temperatur/Spannungs-Diagramm gezeigten Schaltung mit insgesamt 4 
weiteren Widerstaenden um den NTC rum kam - ist da irgendwie Ueberlegung 
dahinter oder hat's irgendwann mal einfach funktioniert und das war dann 
halt grad die aktuelle Beschaltung?

Gruss
WK
Gast #5765477
Lesenswert?

Aus der W. schrieb:
> Kennlinie_Temperatur.png

Dergute W. schrieb:
> Mich taet' noch interessieren, wie's zu der im
> Temperatur/Spannungs-Diagramm gezeigten Schaltung mit insgesamt 4
> weiteren Widerstaenden um den NTC rum kam - ist da irgendwie Ueberlegung
> dahinter oder hat's irgendwann mal einfach funktioniert und das war dann
> halt grad die aktuelle Beschaltung?

Ziel der Beschaltung ist, eine möglichst lineare Abhängigkeit zwischen 
Spannung und Temperatur zu bekommen.

Also gibt man halbwegs vernünftige Werte für die 4 Widerstände vor, 
bastelt dann in einer Tabellenkalkulation eine Tabelle mit dem 
Zusammenhang Temperatur-Messspannung, rechnet dort eine Gerade durch und 
summiert die Abweichung zwischen Gerade und Datentabelle als Fehlermaß 
auf.
Dann lässt man die Tabellenkalkulation per Optimierung die Widerstände 
suchen (z.B. Solver Add-in in Excel oder LibreOffice).
.... et Voilá, schon hat man die Beschaltung.
Gast #5765582
Lesenswert?

Wolfgang schrieb:
> Ziel der Beschaltung ist, eine möglichst lineare Abhängigkeit zwischen
> Spannung und Temperatur zu bekommen.

Das war mir total egal da die Spannungswerte an zwei NTCs
verglichen werden.

Diese Widerstände dienen im Wesentlichen dazu die
Luftfeuchtigkeit außen korrekt hereinzurechnen.

In diesem Frühjahr habe ich mir ein Display eingebaut.
Die Temperaturanzeige habe ich mit der "If-Orgie" realisiert.

Aus der W. schrieb:
> Für meinen NTC wirft der Onlinerechner übrigens 49K raus.
> Ich hatte ohne groß nachzudenken etwa 58K gewählt.

Mit dem Wissen aus diesem Thread könnte ich den
Quellwiderstand für die NTCs umrechnen und linear
mappen. Vielleicht mache ich das mal wenn ich Lust und
Zeit dazu habe und mich das keine Anzeigegenauigkeit kostet.

Zur Displayanzeige im Bild:
1.Zeile:
Außentrmperatur +7Grad Celsius, Außenfeuchte 58%
2.Zeile:
Errechnete Lüftungsdauer zwischen +2 und +12Grad 21Minuten,
Smilie bedeutet Wäschetrockner darf benutzt werden,
bis +18Grad Außentemperatur dürfte man Außen-Luft in den
Keller lassen.
Für Dauerbetrieb des Lüfters ist es "zu kalt"


LG
old.
Angehängte Dateien:
Gast #5765588
Lesenswert?

Aus der W. schrieb:
> Da kann ich nichts zu sagen weil ich es nur so machen kann,
> wie ich es eben kann.

erlaubst Du ein Beispiel?
1
int DigToTemp(int dig)
2
{
3
struct {int C; int dig;} Ntc[]=
4
{
5
   {43, 200},
6
   {42, 208},
7
   {41, 219},
8
   {40, 235},
9
...
10
   {-23, 1011}
11
   {-24, 1023}
12

13
};
14
int i;
15

16
   for(i=0; i<countof(Ntc); i++) /* countof(x) --> sizeof(x)/sizeof(x[0]) */
17
   {
18
      if(dig <= Ntc[i].dig) {return Ntc[i].C;}
19
   }
20
   /* was immer auch im Fehlerfall, wenn dig > 1023 oder so */
21
   return -273;
22
}
Gast #5765773
Lesenswert?

Aus der W. schrieb:
> Also muss ich, genau wie bei der "IF-Orgie", die Zwischenwerte
> aus der Tabelle ermitteln und eintragen?

Naja, der Vorteil wäre, dass die Zahlen in einer Tabelle untereinander 
stehen, und nicht über 70 ifs verteilt sind.

Ich habe jetzt Fantasiezahlen verwendet, da am Handy getippt.

und ja, man könnte auch die Spalte mit den Temperaturen weglassen, wenn 
man wirklich einen Eintrag für jede Temperatur hat. Ist mit 2 Spalten 
(hoffentlich) verständlicher und besser zu kontrollieren.

Und wenn man interpoliert, würde es u.U. ein wenig komplexer (weil man 
dann ggf. 2 Stützpunkte braucht, den davor und den danach.)
Gast #5765862
Lesenswert?

A. S. schrieb:
> Naja, der Vorteil wäre

Ich habe Dir mal meine aktuelle .ino Datei angehangen.
Für mich ist das übersichtlich und ich verstehe jeden
Schritt darin.

A. S. schrieb:
> int DigToTemp(int dig)

So Etwas kenne ich schon gar nicht.

A. S. schrieb:
> struct {int C; int dig;} Ntc[]=

warum deklarierst Du C und dig nicht vor dem void Setup?

Bevor ich mich mit for, struct und return befassen muss,
finde ich es interessant, die Analogschaltung mal auf
linearisiert umzurechnen und zu sehen wie linear die
Kennlinie wird. Bei der Feuchte habe ich ja erfolgreich gemappt
und das sind nur wenige Schritte, siehe Zeilen 60 bis 68.

Edit: Och nee, in der Codeansicht fehlen ja noch immer
die Zeilennummern.

LG
old.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren