Forum: Analoge Elektronik und Schaltungstechnik Linearisierung NTC und Anpasssung


von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich weiß, dies ist ein bereits oft durchgekautes Thema, allerdings sind 
für mich trotzdem ein paar Dinge offen.

Die Gegebenheiten:
Zur Temperaturmessung beim Laden eines Akkus wird der LM35DZ als Sensor 
verwendet (Datenblatt und Kennlinie im Anhang). Allerdings ist zwischen 
den Zellen im Akkupack ein anderer NTC-Sensor eingebaut (Datenblatt im 
Anhang). Eine Integrierung des LM35DZ zwischen den Zellen ist sehr 
aufwendig, weshalb nun die Kennlinie des zweiten Sensors daran angepasst 
werden soll.
Der Messbereicht liegt zwischen 15° und 90°; max. 3°C Abweichung

Nun Die Frage zum Thema Linearisierung. Ich habe mich dafür entschieden, 
einen Parallelwiderstand als Linearisierungswiderstand zu verwenden.
Formel für den Gesamtwiderstand ist also: Rg=(R(T)*Rp)/(R(T)+Rp)

Da der Wendepunkt dieser Funktion möglichst im Bereich der mittleren 
Temperatur liegen soll, habe ich die 2. Ableitung 0 gesetzt bei 
T=325,65K (mittl. Temp. 52,5°) und nach Rp umgeformt. Damit erhielt ich 
einen Wert von etwa 2330 Ohm.
Die nun erreichte Widerstandskurve sah dann auch wie erwartet und 
zufriedenstellend aus.

Zur richtigen Messung fehlt mir noch der Widerstand, welcher in Reihe zu 
der Parallelschaltung gesetzt wird.
Stimmt es, dasss dieser Wert keinen Einfluss auf auf die Linearisierung 
hat, sondern später nur für die Auflösung bei der Messung eine Rolle 
spielt?
Wie muss dieser Widerstand gewält werden?

Ich habe per Spannungsteiler und ein paar Testwerten für den 
Reihenwiderstand den Potentialunterschied an der Parallelschaltung 
berechnet. Dieser Kurvenverlauf ist aber noch stark exponentiell und die 
Spannung sinkt mit steigender Temperatur (kommt mir bei NTC's unlogisch 
vor).
Was habe ich falsch gemacht?

Vielen Dank schonmal und liebe Grüße,
Alex

von ths (Gast)


Lesenswert?

"Was habe ich falsch gemacht?"

Die Datenblätter geglaubt?

Allein durch die Montage des NTC auf/im/am Akku und die Wärmeableitung 
durch die Kontaktierung  Halterung  Auflagefläche entstehen soviele 
Unwägbarkeiten, dass ich mir über Linearisierung recht wenig Gedanken 
machen würde. Eher darum, daas bei höheren Temperaturen das Gerät nicht 
abfackelt.

von Peter D (Gast)


Lesenswert?

Stichwort Steinhart-Hart-Polynom

von MaWin (Gast)


Lesenswert?

Alex schrieb:
> Zur richtigen Messung fehlt mir noch der Widerstand, welcher in Reihe zu
> der Parallelschaltung gesetzt wird.

Egal.

http://akapuma.info/test/ntc.pdf

von Helmut S. (helmuts)


Lesenswert?

> Wie muss dieser Widerstand gewählt werden?

Mit Rv wird die Verlustleistung des NTCs begrenzt und an die zur 
Verfügung stehende Spannung angepasst, z. B. 5V.
Rp dann mal etwas variieren um eine "geradere" Kurve zu erzielen.

von Yalu X. (yalu) (Moderator)


Angehängte Dateien:

Lesenswert?

Wenn ich das richtig verstehe, willst du also eine Ladeschaltung, die
auf den LM35 abgestimmt ist, stattdessen mit einem NTC 10K3A542i
betreiben.

Alex schrieb:
> Zur richtigen Messung fehlt mir noch der Widerstand, welcher in Reihe zu
> der Parallelschaltung gesetzt wird.
> Stimmt es, dasss dieser Wert keinen Einfluss auf auf die Linearisierung
> hat, sondern später nur für die Auflösung bei der Messung eine Rolle
> spielt?

Nein. Die Ausgangsspannung eines Spannungsteilers in Abhängigkeit von
einem der beiden Widerstände ist nichtlinear. Du könntest aber durch die
Anordnung von NTS und angepasstem Parallelwiderstand einen konstanten
Strom schicken. Der Spannungsabfall am NTC und dem Widerstand ist dann
proportional zum Gesamtwiderstand und damit halbwegs linear. Allerdings
brauchst du dazu eine geeignete Konstantstromquelle.

> Wie muss dieser Widerstand gewält werden?

Du kannst den Parallel- und den Serienwiderstand nicht isoliert
voneinander betrachten, sondern musst die Kombination von beiden so
bestimmen, dass ein gutes Ergebnis herauskommt.

Um sowohl die Krümmung, die Steigung und den Offset der NTC-Kennlinie
passend zu machen, brauchst du aber mindestens drei Einstellschrauben.
Mit dem Parallel- und dem Serienwiderstand alleine kannst du bspw. die
Krümmung und den Offset kompensieren, so dass das Ausgangssignal
tatsächlich näherungsweise proportional zur Temperatur in °C ist. Dann
stimmt aber der Proportionalitätsfaktor noch nicht. Diesen kannst du
bspw. durch die Wahl der Versorgungsspannung oder einen nachgeschalteten
Verstärker festlegen, was aber wiederum einen Opamp erfordert.

In deinem konkreten Anwendungsfall wird sich aber herausstellen, dass
die optimale Versorgungsspannung etwa 1,2V beträgt. Ist die Spannung
höher, muss das Ausgangssignal nicht verstärkt, sondern abgeschwächt
werden. Das lässt sich ganz einfach dadurch realisieren, dass der
Serienwiderstand in zwei einzelne, in Reihe geschaltete widerstände
aufgeteilt und die Ausgangsspannung zwischen den beiden abgegriffen wird
(ntc-schaltung.png).

Die Ausgangsspannung dieser Schaltung beträgt

Um das Verhalten des LM35 für eine gegebene Versorgungsspannung
nachzubilden, muss man nun R1, R2 und R3 so bestimmen, dass U0 die
Ausgangsspannung im gewünschten Temperaturbereich möglichst genau der
Temperatur in °C multipliziert mit 10mV ist. Das geht bspw. mit einem
Least-Square-Optimierer.

Ich habe das mal mit der Funktion curve_fit in Python/Scipy ausprobiert
(Matlab, Octave, Scilab und evtl. sogar Excel und LibreOffice bieten
ähnliche Funktionen an). Der Code steht in ntc.py, die Kennlinie des NTC
(aus dem Datenblatt kopiert) im interessierenden Bereich von 15°C bis
90°C in ntc.txt. Das Programm liefert folgendes Ergebnis:
1
R1=427524.846122, R2=1939.573527, R3=609.533231

Um das Ganze in Spice zu simulieren (ntc.asc, ntc.plt und ntc.png), habe
ich den NTC aus einer PWL-Spannungsquelle und einer B-Stromquelle
zusammengefrickelt (Helmut weiß vielleicht eine elegantere Lösung). Die
Temperatur steigt dabei innerhalb der Simulationszeit von 0°C auf 90°C.
In den Diagrammen ist der Ausschnitt von 15°C bis 90°C gezeigt.

Das obere Diagramm (blaue Kurve) zeigt zur Kontrolle den Widerstandswert
des NTC über den gewünschten Temperaturbereich, das mittelere Diagramm
die ideale (rot) und die tatsächliche Ausgangsspannung (grün) und das
untere Diagramm die Differenz zwischen beiden. Sie liegt etwa im Bereich
von ±20mV, was einer Temperaturabweichung von ±2°C entspricht. Damit
wäre auch die Forderung nach einem Maximalfehler von ±3°C erfüllt.

Die Verlustleistung im NTC bleibt dabei unterhalb von 2,5mW, so dass
keine störende Eigenerwärmung zu befürchten ist.

Falls du eine andere Versorgungsspannung als 5V verwenden möchtest,
musst du nur das Verhältnis von R2 zu R3 geeignet anpassen, ohne ihre
Summe (2549Ω) zu ändern.

von Alex (Gast)


Lesenswert?

Vielen Dank für die Hinweise. An die Abweichung der Widerstandsgleichung 
habe ich nicht wirklich gedacht.
Die Steinhart-Hart-Gleichung habe ich auch versucht und bei den 
Testwerten waren die errechneten Temperaturen sehr nahe an der aus dem 
Datenblatt! Allerdings habe ich da das Problem, dass die Gleichung für 
den Widertand zu kompliziert wird um den erstem Weg (sprich 2. Ableitung 
0 setzen) so nicht mehr ganz einfach funktioniert (ebenfalls nicht mit 
CAS).

Was ich mich noch frage: Wieso hat meine Kurve für die Spannung einen 
negativen Anstieg, während die gemessenen Werte des LM35DZ (siehe Excel 
Datei im 1.Post) einen postiven hat.
Normalerweise nimmt der Widerstand des NTC und somit auch der 
Parallelschaltung mit steigender Temperatur ab. Folglich müsste die am 
Sensor abfallende Spannung doch ebenfalls sinken oder wo ist mein 
Denkfehler?

Ich habe lediglich als Funktion den Spannungsteiler für die am NTC 
abfallende Spannung verwendet.
U(T)=(5V*Rg(T))/(Rg(T)+Rv)

Wobei Rg(T) der Widerstand an der Parallelschaltung ist und Rv der 
Reihenwiderstand.

Mit der ersten Methode liege ich bei einer maximalen Abweichung von 
68mV, sprich bei der (realen) Auflösung von 10,9mV/°C etwas mehr als 6°.
Ist es möglich durch eine Erweiterung per OPV-Schaltung die ganze Sache 
noch zusätzlich zu linearisieren?

Liebe Grüße,
Alex

von Alex (Gast)


Lesenswert?

Sorry der Post von Yalu kam gerade rein ,als ich meinte Antwort verfasst 
habe.

von Alex (Gast)


Lesenswert?

Vielen Dank für diese ausführliche Antwort!!! Da ich noch nicht so 
bewandert auf diesem Gebiet bin, habe ich noch ein paar Fragen.

Yalu X. schrieb:
> In deinem konkreten Anwendungsfall wird sich aber herausstellen, dass
> die optimale Versorgungsspannung etwa 1,2V beträgt.

Woher weißt du das? Ist das reines Ausprobieren bis man die Werte erhält 
oder steckt da eine Rechnung dahinter? Und wo genau sollen diese 1,2V 
abfallen?

In der Gleichung für die Berechnung der Angangsspannung erkenne ich den 
Spannungsteiler. Aber wie genau hast du die Gleichung für das Verhältnis 
der Widerstände aufgestellt?

von Yalu X. (yalu) (Moderator)


Angehängte Dateien:

Lesenswert?

Alex schrieb:
> Yalu X. schrieb:
>> In deinem konkreten Anwendungsfall wird sich aber herausstellen, dass
>> die optimale Versorgungsspannung etwa 1,2V beträgt.
>
> Woher weißt du das? Ist das reines Ausprobieren bis man die Werte erhält
> oder steckt da eine Rechnung dahinter? Und wo genau sollen diese 1,2V
> abfallen?

Vorher wusste ich das gar nicht. Ich habe einfach mal drauflos gerechnet
(bzw.den PC rechnen lassen) in der Hoffnung, dass dabei ein vernünftiges
Ergebnis herauskommt, was dann zum Glück auch der Fall war.

Auf die Idee mit dem dritten Widerstand bin ich nicht sofort gekommen.
Der erste Schaltungsansatz bestand wie bei dir nur aus dem Parallel- und
dem Serienwiderstand. Als dritte Stellschraube habe ich die Versorgungs-
spannung U0 variabel gemacht.

Denk dir einfach in der Schaltung mit den drei Widerständen den R2
überbrückt (R2=0) und in der Modellfunktion R2 als Parameter durch U0
ersetzt, dann weißt du, wie mein ursprünglicher Ansatz aussah. Das
Python-Programm im Anhang entspricht dem Programm in meinem letzten
Beitrag mit genau diesen Änderungen.

Es hätte nun durchaus passieren können, dass der Optimierer für U0 ein
paar hundert Volt liefert. Das wäre aber kein Problem gewesen, denn man
hätte dann einfach eine um den Faktor c kleinere Versorgungsspannung
genommen und dafür die Ausgangsspannung mit einem Opamp um den Faktor c
verstärkt. Es hätte allerdings auch passieren können, dass einer der
berechneten Widerstände negativ wird. Dann hätte man sich einen anderen
Schaltungsansatz ausdenken müssen.

Tatsächlich lieferte der Optimierer jedoch positive Widerstöände und ein
recht kleines U0, nämlich etwa 1,2V. Die Ausgabe des obigen Python-
Programms:
1
U0=1.195582, R1=427526.030670, R3=2549.107087

Anmerkung: Theoretisch sollte R1 den gleichen Wert haben wie in meinem
letzten Beitrag, und R3 sollte die Summe von R2 und R3 von oben sein.
Dass die Werte nicht exakt übereinstimmen, hängt damit zusammen, dass
der Optimierer (dahinter verbirgt sich der Levenberg-Marquardt-
Algorithmus) als iteratives Näherungsverfahren arbeitet.

Man könnte jetzt also bspw. mit einem einstellbaren Spannungsregler
1,196V erzeugen, und die ganze Sache wäre gegessen. Es stellte sich
natürlich die Frage, ob man nicht auch ausschließlich mit passiven
Bauteilen auskommen kann. Dazu die folgende Überlegung:

Wenn man nicht 1,196V, sondern 5V an die Schaltung anlegt, was um den
Faktor c = 5V / 1,196V = 4,181 zu hoch ist, wird logischerweise auch die
Ausgangsspannung um den Faktor c zu hoch sein. Um dies zu korrigieren,
muss man die Ausgangsspannung irgendwie durch c dividieren. Man könnte
dazu einen Impedanzwandler und einen weiteren Spannungteiler einsetzen.

Man kann aber auch R3 zu einem Spannungsteiler erweitern, indem man die
Ausgangsspannung nicht an seinem oberen Ende, sondern an geeigneter
Stelle zwischen seinen Enden abgreift. So ist bspw. in der Mitte von R3
die Spannung nur halb so groß als am oberen Ende. Da wir die Spannung
durch c dividieren wollen, liegt der richtige Punkt für den Abgriff bei
R3 / c = 2549Ω / 4,181 = 610Ω über seinem unteren Ende. Der verbleibende
Abschnitt oberhalb des Abgriffs hat entsprechend 2549Ω - 610Ω = 1939Ω.
Diese beiden Teilwiderstände haben (bis auf Rundungsfehler) die gleichen
Werte wie R2 und R3 in meinem letzten Beitrag.

Um diese ganzen Überlegungen nicht aufschreiben zu müssen, habe ich dann
einfach eine neue Berechnung durchnudeln lassen, bei der von festem U0
und einem in zwei Einzelwiderstände aufgeteilten Serienwiderstand
ausgegangen wird. Das ist das, was ich im letzten Beitrag gepostet habe.

Wenn man das dortige ntc.py mit dem obigen Wert von U0 = 1,195582V
füttert, liefert es erwartungsgemäß R2 = 0. Für noch kleinere U0 wird R2
negativ, d.h. das verwendete Schaltungskonzept versagt in diesem Fall.
Man würde dann R2 = 0 setzen (also weglassen) und zum Ausgleich das
Ausgangssignal mit einem Verstärker auf den gewünschten Pegel bringen.

Alex schrieb:
> In der Gleichung für die Berechnung der Angangsspannung erkenne ich den
> Spannungsteiler. Aber wie genau hast du die Gleichung für das Verhältnis
> der Widerstände aufgestellt?

Welche Gleichung meinst du? Diejenige für UA? Die lässt sich ganz leicht
aus den Formeln für den Spannungsteiler und der Parallel- und Serien-
schaltung von Widerständen herleiten. Ich habe das Ergbnis anschließend
nur noch etwas umgeformt, damit es kompakter wird.

von Alex B. (flying_alex)


Lesenswert?

Hallo,

vielen Dank für deine Erklärungen! Ich meine es jetz verstanden zu haben 
:)

Ich habe dein Vorgehensweise mal weitergeführt, da ich den 
Temmperaturbereich noch etwas korrigieren will.
Die Obergrenze zu erhöhen machte keine Probleme. Allerdings steigt der 
Widerstand R1 beim Verringern der Untergrenze rapid an (über den 
Milliarden Bereich hinaus), wohingegen U0, R2 und R3 reale Maße 
annehmen. Bis zu einer Temperatur von etwa 9°C liege ich im 
Toleranzbereich, alles da drunter wird stetig schlimmer.

Wieso bekomme ich unterhalb dieser 9°C die Temperatur einfach nich 
linearisiert?

Liebe Grüße,
Alex

von Yalu X. (yalu) (Moderator)


Angehängte Dateien:

Lesenswert?

Alex B. schrieb:
> Wieso bekomme ich unterhalb dieser 9°C die Temperatur einfach nich
> linearisiert?

Was würde passieren, wenn du versuchen würdest, den Temperaturbereich
nach unten bis -10°C zu erweitern?

Bei -10°C müsste die Ausgangsspannung idealerweise -100mV betragen, was
aber nicht möglich ist, da 0V die untere Grenze darstellt. Rein
rechnerisch geht das dennoch, wenn mindestens einer der beteiligten
Widerstände negativ ist.

Die optimalen Widerstände können auch dann negativ werden, wenn das
untere Ende des Temperaturbereichs zwar positiv, aber nahe bei der
0°C-Grenze liegt. Die curve_fit-Funktion versucht in diesem Fall, durch
Vergrößern von R1 die Ausgangsspannung immer weiter hinunterzudrücken
und landet schließlich bei exorbitanten Werten, ohne dabei das Optimum
zu erreichen. Auf die Idee, es mit negativen Werten zu versuchen, kommt
sie nicht von selber, da eine Verkleinerung von R1 ja erst einmal die
Ausgangsspannung erhöht.

Mann kann aber etwas nachhelfen, indem man der Funktion Startwerte
mitgibt, die schon einmal in die richtige Richtung zeigen: Ersetzt du
die Zeile
1
params, _ = curve_fit(ua, rntc, temp, None)

durch
1
params, _ = curve_fit(ua, rntc, temp, [-1e4, 0, 0])

startet der Algorithmus mit negativem R1, was nach einer entsprechenden
Zahl von Iterationsschritten schließlich zur richtigen Lösung führt. Im
Anhang siehst die für 5°C bis 90°C optimierte Schaltung und zugehörige
Simulation. Frag jetzt aber nicht, wo es die -76kΩ-Widerstände zu kaufen
gibt ;-)

Welche Lösungsmöglichkeiten gibt es nun für dieses Problem?

Möglichkeit 1:

Man schließt das untere Ende von R3 nicht an GND, sondern an eine
negative Versorgungsspannung an und bestimmt dafür die optimalen
Widerstandswerte. Damit sind auch mit positiven Widerständen negative
Ausgangsspannungen möglich.

Möglichkeit 2:

Da in der Praxis der Fall negativer Temperaturen wahrscheinlich gar
nicht eintritt, genügt es evtl., der Schaltung wenigstens das Gefühl
zu geben, negative Ausgangsspannungen generieren zu können. Dies
geschieht mit einer Opamp-Schaltung am Ausgang, die einen konstanten
Spannungs- Offset subtrahiert. Natürlich kann auch der Opamp ohne
negative Versorgungsspannung die 0V-Grenze nicht unterschreiten, aber
das muss er ja auch nicht, solange die Temperatur über 0°C bleibt.

Möglichkeit 3:

Man schmeißt das Konzept komplett über den Haufen und denkt sich eine
andere Schaltung aus. Aber auch hier kommt man vermutlich nicht ohne
Opamp aus.


Generell stellt sich aber die Frage, ob die Schaltung bei Temperaturen
unter 15°C überhaupt genaue Werte liefern muss. Der Akkulader dreht doch
– vereinfacht gesprochen – den Stromhahn so weit auf, dass der Akku
möglichst schnell geladen wird, dabei aber eine vorgegebene Temperatur-
grenze nicht überschreitet. Da diese Grenze deutlich oberhalb von 25°C
liegt, ist es noch unerheblich, ob der Sensor bei 5°C fälschlicherweise
10°C oder 15°C ausgibt.

von Alex B. (flying_alex)


Lesenswert?

Hallo nochmals,

leider muss ich mit meiner Idee auch nachweisen, dass alles unterhalb 
0°C funktioniert (hat sich erst jetzt rausgestellt). Somit sollte in 
einem Bereich von -10°C bis 90°C der oben genannte Toleranzbereich 
eingehalten werden.

zu Möglichkeit 2.:
Gibt man der Schaltung damit nicht einen Offset mit, der die Kurve 
wieder verfälschen würde?

Nächster Ansatz wäre, das ganze mit einem kleinen 8-bit Mikrocotroller, 
welcher ein ADC besitzt.
Also würde ich den Spannungswert des NTC digitalisieren lassen, dann im 
Controller mit dem Wert der Kennlinie des LM35 vergleichen, um diesen 
nachher wieder auszugeben.
Anschließend wird das Ganze nochmal per PWM mit RC Filter analogisert 
und an das Ladegerät gesendet.

NTC---ADC---Mikrocontroller---DAC---Ladegerät

Bisher war mein "schwierigstes" Projekt mit dem Atmel, eine Uhr mit 
LED-Display darzustellen. Schätzt ihr den 
Programmieraufwand/Schwierigkeit als überschaubar ein?

Liebe Grüße,
Alex
Und ist eine Wandlung von negativen Spanungswerten ohne Weiteres 
möglich?

von Yalu X. (yalu) (Moderator)


Angehängte Dateien:

Lesenswert?

Alex B. schrieb:
> leider muss ich mit meiner Idee auch nachweisen, dass alles unterhalb
> 0°C funktioniert (hat sich erst jetzt rausgestellt). Somit sollte in
> einem Bereich von -10°C bis 90°C der oben genannte Toleranzbereich
> eingehalten werden.

Je breiter der Temperaturbereich, desto größer wird auch der Fehler.
Mit der billigen Widerstandslösung kann man nur rationale Funktionen 1.
Grades, also Funktionen der Form

1
       z₁x + z₀     a
2
f(x) = ———————— = ————— + c
3
       n₁x + n₀   x - b

perfekt linearisieren. Der Funktiongraph ist eine Hyperbel, deren
Asymptoten parallel zu den Koordinatenachsen verlaufen. Der Parameter a
ist dabei ein Skalierungsfaktor, b und c sind die Lagen der vertikalen
und der horizontalen Asymptote.

Die Kennlinie des NTC ist aber eine ganz andere Funktion und kann nur in
einem begrenzten Bereich durch die obige Funktion zufriedenstellend
angenähert werden.

> zu Möglichkeit 2.:
> Gibt man der Schaltung damit nicht einen Offset mit, der die Kurve
> wieder verfälschen würde?

Den Offset kann man mit dem Parameter c der obigen Funktion einstellen.

Ich habe das mal durchgerechnet. Da hier wohl nicht der mittlere
quadratische, sondern der maximale Fehler interessiert, habe ich statt
der curve_fit-Optimierung (wie in den vorangegangenen Beiträgen) etwas
zusammengebastelt, das ähnlich dem Remez-Algorithmus arbeitet:

  https://en.wikipedia.org/wiki/Remez_algorithm

Damit wird bspw. der ursprüngliche Temperaturbereich von 15°C bis 90°C
mit einem maximalen Fehler von nur 1,4K linearisiert. Wendet man das
Verfahren auf den Bereich von -10°C bis +90°C an, beträgt der maximale
Fehler ±3,46K, was leider etwas außerhalb der Anforderungen (±3K) liegt
(ntc-10-90.png).

Eine bessere Anpassung der Widerstände ist aber nicht möglich, denn
durch Änderung der drei Funktionsparameter bzw. der drei Widerstände
können nur folgende drei Eigenschaften der Fehlerkurve angepasst werden:

  - der vertikale Offset
  - die mittlere Steigung
  - die mittlere Krümmung

Alle drei sind aber schon optimal, was man daran erkennt, dass alle vier
Extremwerte der Kurve den gleichen Betrag und alternierendes Vorzeichen
haben.

Die ±3K können nur dann eingehalten, wenn man den Temperaturbereich
etwas reduziert, bspw. von -5°C bis +90°C oder von -10°C bis +83°C
(ntc-5-90.png und ntc-10-83.png).

Eine Verbesserung der Schaltung ist allenfalls mit nichtlinearen
Bauteilen (Dioden, Transistoren usw.) möglich. Da deren Parameter aber
z.T. recht hohe Temperaturkoeffizienten aufweisen, ist es nicht leicht,
damit etwas zuverlässig Funktionierendes aufzubauen.

> Nächster Ansatz wäre, das ganze mit einem kleinen 8-bit Mikrocotroller,
> welcher ein ADC besitzt.
> Also würde ich den Spannungswert des NTC digitalisieren lassen, dann im
> Controller mit dem Wert der Kennlinie des LM35 vergleichen, um diesen
> nachher wieder auszugeben.
> Anschließend wird das Ganze nochmal per PWM mit RC Filter analogisert
> und an das Ladegerät gesendet.

Ja, damit bist du natürlich flexibler, auch wenn dadurch der Charme der
Einfachheit etwas verloren geht :)

> NTC---ADC---Mikrocontroller---DAC---Ladegerät
>
> Bisher war mein "schwierigstes" Projekt mit dem Atmel, eine Uhr mit
> LED-Display darzustellen. Schätzt ihr den
> Programmieraufwand/Schwierigkeit als überschaubar ein?

Du musst dich halt darüber informieren, wie man den ADC einliest und ein
PWM-Signal ausgibt, was aber alles hier in den AVR-Artikeln nachzulesen
ist. Das ganze Progrämmchen dürfte etwa 10 Zeilen lang werden zzgl. der
Initialisierungsdaten für die Umrechnungstabelle.

> Und ist eine Wandlung von negativen Spanungswerten ohne Weiteres
> möglich?

Ja. Wenn du eine symmetrische Versorgungsspannung hast (bspw. ±5V), an
den PWM-Ausgang einen Spannungsteiler mit dem Widerstandsverhältnis 1:4
gegen -5V schaltest und an den Ausgang des Spannungsteilers einen
Kondensator gegen GND oder -5V schaltest, kannst du Analogspannungen im
Bereich -1V bis +3V erzeugen, was für die Aufgabenstellung genügen
sollte.

Es gibt aber auch bipolare DACs als IC.

In allen Fällen brauchts du eine negative Versorgungsspannung, die aber
im Ladegerät vorhanden sein sollte, da auch der LM35 ohne sie kein
negatives Ausgangssignal erzeugen kann.

: Bearbeitet durch Moderator
von Helmut S. (helmuts)


Lesenswert?

Vielleicht zwei gleiche NTCs mit unterschiedlichem Parallelwiderstand in 
Reihe schalten um auch beim großen Temperaturbereich eine bessere 
Linearität zu erhalten.

von Alex B. (flying_alex)


Lesenswert?

Hallo nochmals und sry fürs pushen.

Jetzt melde ich mich eher bzgl. des Python Codes. Das Ladegerät und 
somit auch der Sensor wurde aus technischen Gründen getauscht. Der neue 
NTC hat ebenfalls eine Auflösung von 10 mV/°C, jedoch einen Offset von 
500mV.

U(T) = (10mV * T)+ 500mV (Temperaturangabe in °C)


Ich hab mir mal die curve fit im PYthon angeguckt der Aufbau ist

curve_fit(f, xdata, ydata, p0....)
f     --> Gleichung für Ausgangsspannung
xdata --> rntc
ydata --> temp?!

Verstehe ich es richtig das in der Zeile
1
temp *= 0.01

immer wieder ein Wert in "temp" geladen wird und dann mit 0.01 
multipliziert wird. Das entspricht dem Anstieg deer Kurve (10mV/°C)?

Um das Programm an meine neue Gleichung mit den 500mV Offset anzupassen, 
muss ich ja an den ydata, sprich temp Wert heran?
1
0.5 + temp *= 0.01
ist sowohl prammiertechnisch als auch mathematisch falsch wenn ich das 
richtig verstehe.

Und an die Defintion von Ua einfach +0.5 anzuhängen ist wahrscheinlich 
auch nicht zielführend.

Also wie bekomme diesen Offset irgendwie in meinem Programm 
untergebracht?

Vielen Dank schonmal,

Alex

von eProfi (Gast)


Lesenswert?

temp *= 0.01 ist eine Kurzschreibweise für temp = temp * 0.01
Du musst also temp = 0.5 + temp * 0.01 schreiben.

von Alex B. (flying_alex)



Lesenswert?

Hallo,

leider funktioniert das Ganze noch nicht so ganz wie gewünscht. Bisher 
habe ich die Kennlinie von 2 Sensoren (vom Ladegerät) exakt ausgemssen 
und mir plotten lassen. Anschließend habe ich per Basic Fitting eine 
lineare Gleichung ermittelt (realeSensorkennlinie.jpg) und diese als 
Grundlage für das Python Programm genommen, um die Widerstände zu 
wissen.
Also habe ich dann die einzelnen Widerstände ausgemessen, sodass ich in 
der Realität bei einer maximalen Abweichung von 5 Ohm lag! Um das ganze 
bis dahin zu bestätigen, habe ich per Matlab den erwarteten Fehler (also 
Spannungsteiler mit realen Widerständen und die wirkliche Kennlinie des 
Sensors am Ladegerät) berechnet (erwarteter Fehler.jpg).

So bin ich dann also mit der Platine, dem Ladegerät-Sensor und einem 
Referenzthermometer in eine Temperaturkammer gegangen und habe die 
Spannungen an beiden Schaltungen gemessen. Komischwerweise liegt der 
wirkliche Fehler (realer Fehler.jpg) weitab von dem erwarteten (vor 
allem im Bereich von etwa 55°C), obwohl ich bis dahin eigentlich 
versucht habe soviele Fehlerquellen wie möglich mit einzuberechnen.

Die Platine an sich hing auch außerhalb des Temperaturschrankes, um 
einen Fehler bei der starken Erwärmung auszuschließen.

Mein erster Ansatz war, dass der reale Verlauf der Kennlinie diesen 
Fehler erzeugt, da er ja nicht zu 100% zu dem Basic Fit- Verlauf passt. 
Allderdings wäre das ein durchschnittlicher Offset von etwa 7mV (Fehler 
reale Kennlinie zu Gleichung.jpg); der gemessene Fehler zwischen dem 
Sensor und der Platine liegt aber bei etwa 13mV.

Augenscheinlich ist in der Realtiät irgendwo ein Offset von etwa 10mV an 
der Platinenspannung und ich weiß absolut nicht mehr wo dieser herkommt.

Habt ihr noch eine Idee wo dieser unerwartete Fehlerverlauf seine 
Ursachen haben könnte?

Vielen Dank schonmal!

Lg, Alex

von Michael B. (laberkopp)


Lesenswert?

Da alle Kurven eine andere X-Achse haben, erscheint mir eine fehlerhafte 
Überlagerung für wahrscheinlich.

Allerdings müsste dann bei 0 GradC -0.15 rauskommen und nicht quasi 0.

Wenn dein NTC über den ganzen Bereich besser als 0.04K Abweichung misst, 
würde ich es mit der Linearisierung gut sein lassen.

von Alex B. (flying_alex)


Lesenswert?

Ach mist, das habe ich ganz vergessen! Sorry :/

Die x-Achse ist immer die Temperatur in °C und die y-Achse die Spannung 
in V.
Da der Sensor eine Auflösung von 10mV/°C hat, liegt der Fehler bei ca. 
3,8°C...3 waren eigentlich gesetzt.

Michael B. schrieb:

> Allerdings müsste dann bei 0 GradC -0.15 rauskommen und nicht quasi 0.

Das sind diese gut 10mV Fehler, von denen ich nicht weiß wo die 
herkommen bzw. ich nur teilweise durch den Unterschied zwischen realer 
Sensorkennlinie und der interpolierten, linearen Gleichung erklären 
kann.

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
Noch kein Account? Hier anmelden.