Hallo Forum, die Überschrift sagt alles. Also ich kann ua binäre
Division und Multiplikation und so einiges mehr, nur beim Thema
Thermometer versage ich so richtig. Bevor jetzt wieder so Komentare
kommen wie "Zu faul zum Suchen", "Fange erst mal mit was leichten an"
usw. Bitte schreibt gar nicht, bevor ihr sowas schreibt. Ich habe
gegoogelt, sogar in meiner Verzweiflung versucht den AVR-GCC Compiler zu
überreden mir zu sagen wie er es mit der e-Funktion macht. Hatte keinen
Erfolg. Ich komm nicht weiter. Jetz zu dem was ich mir vorstelle. Ich
würde gerne sehr billige NTC`s nehmen. warum billige NTC's? Weil ich ca.
gefühlte 1000 Stellen habe an denen ich die Temperatur messen möchte.
Banggood ist da einen gute Quelle. An ATMegas anschließen und die
Messungen dann über ein kleines Netzwerk zu einem Raspi oä schicken bzw
im ATMega verarbeiten oder was mir sonst noch einfällt. Das Programm
sollte den Wert nehmen den ich für 0°C vorgebe (kalibriere) und mit
diesem dann mit dem B-Wert und dem W R25-Wert und dem ADC-Wert die
aktuellen Temperatur ausrechnen. Am besten ein Unterprogramm in reinem
Assembler. Warum in Assembler? Weil ich es halt in Assembler schreiben
möchte. Ist mein Hobby. Das Unterprogramm könnte man hier auch anderen
zur Verfügung stellen. Also Daten rein - Ergebnis raus. Ich würde mir
einen Temperaturbereich von -50 bis +100 Grad wünschen. Fertige
Assemblerprogramme wären auch io, aber nicht optimal. Ich müßte aber
auch verstehen was dort programmiert wurde.
Bei mir hakt es vor allem bei der E-Funktion wenn ich folgente Formel
nehme:
R = R25*e^(1/(T+Tk) -1/(25+Tk)
Könnte mir jmd weiterhelfen?
Schon mal vielen Dank.
Peter schrieb:> Bei mir hakt es vor allem bei der E-Funktion wenn ich folgente Formel> nehme:> R = R25*e^(1/(T+Tk) -1/(25+Tk)> Könnte mir jmd weiterhelfen?
Der Trick ist: du berechnest sowas nicht zur Laufzeit, sondern vorab auf
dem PC und legst es dann in einer Tabelle auf dem µC ab.
Da die ADCs der ATMega eh' nur 10 Bit können, hat diese Tabelle maximal
1024 Einträge. Aber da man mit NTCs kaum den gesamten Bereich der ADCs
sinnvoll nutzen kann, werden es in der Praxis nochmal deutlich weniger.
Außerdem ist es natürlich sinnvoll, nicht nur den gezeigten Teil des
Formelwerks zu in die Tabelle zu packen, sondern gleich die Ergebnisse
der Gesamtfunktion. Sprich: ADC-Wert als Index verwenden (ggf.
beschränkt auf sinnvolle Ober- und Untergrenze) und der indizierte
Tabelleneintrag liefert direkt das Endergebnis in °C (oder was auch
immer gewünscht ist).
Außer dem bissel Geschiebe, um aus dem ADC-Wert einen korrekten
Tabellenindex zu machen, brauchst du dann zur Laufzeit garnix mehr
rechnen.
c-hater schrieb:> Der Trick ist: du berechnest sowas nicht zur Laufzeit, sondern vorab auf> dem PC und legst es dann in einer Tabelle auf dem µC ab.
Ich fürchte nur dass man für jeden NTC eine spezifische Tabelle
- also eine Eichung/Kalibrierung - erzeugen muss damit die Messung
befriedigend genau ausfällt.
Siehe auch:
Peter schrieb:> Das Programm> sollte den Wert nehmen den ich für 0°C vorgebe (kalibriere)
Peter schrieb:> Bei mir hakt es vor allem bei der E-Funktion
Dazu musst du ggf. nicht den GCC befragen, sondern über ein paar
Grundlagen in C verfügen. Der uC selbst kann die e-Funktion sowieso
nicht, sondern muss sie approximieren.
Wenn du deine "gefühlt 1000 Stellen" mal realistisch nachzählst, kommst
du ingesamt vielleicht zu dem Schluss, dass du mit direkt busfähigen
DS18B20 besser fährst.
Wolfgang schrieb:> dass du mit direkt busfähigen DS18B20 besser fährst.
Oder vielleicht doch besser I2C-Sensoren à la DS1631 damit der
Controller noch was anderes tun kann ausser auf den OneWire
Bus zu warten und sein strenges Timing einzuhalten.
Ich würde es gerne zur Laufzeit in Assembler erledigen. Bei Null Grad
abzugleichen habe ich als leichteste Möglichkeit in einer alten
ELV-Zeitschrift gelesen (Wasser und Eis zusammen mischen). Das im
Assembler habe ich iwi nicht gefunden.
Peter schrieb:> Warum in Assembler? Weil ich es halt in Assembler schreiben> möchte. Ist mein Hobby.
Wenn es das Hobby ist, dann sollte man es doch auch verstehen.
Da werden hier die Sourcen angegeben. Warum nicht benutzt?
Und wenn man wirtklich Floating Point Rechnungen in Assembler machen
möchte, dann solten auch ein paar Mathematik Kenntnisse vorhanden sein.
Immerhin ist die Formel ja nur ein Einzeiler.
Ich habe jahrelang mit Assembler mein Geld verdient. Aber dafür nehme
ich die lieber eine Hochsprache. Da ist man in 5 Minuten Programmierung
am Ziel. Und dann dauert es bei der Rechenzeit eben 5 Millisekunden
länger, was solls.
Nimm die richtigen Werkzeuge.
Peter schrieb:> warum billige NTC's? Weil ich ca. gefühlte 1000 Stellen habe an denen> ich die Temperatur messen möchte.
Wenn ich 1000 Stellen hätte, wo ich die Temperatur messen wollte,
dann würde ich mir einen Sensor aussuchen, den ich enfach und ohne
Nachkalibrierung tauschen könnte. Billige NTC taugen da meist nicht,
weil sie initial eine Toleranz von +-5..10% haben.
Peter schrieb:> Bei mir hakt es vor allem bei der E-Funktion wenn ich folgente Formel> nehme: R = R25*e^(1/(T+Tk) -1/(25+Tk)> Könnte mir jmd weiterhelfen?
Ich würde diese Formel als kleine Tabelle mit z.B. 32 Stützpunkten
ablegen und dazwischen linear interpolieren. Das ist angesichts der
übliche Toleranzen von NTCs hinreichend genau und geht in Assembler mit
einigen Additionen und einem Shift.
> wenn ich folgente Formel nehme: R = R25*e^(1/(T+Tk) -1/(25+Tk)> Könnte mir jmd weiterhelfen?
Der Witz daran ist, dass du für diese Formel zuerst mal aufwändig aus
einem ADC-Wert eine Spannung und aus einer Spannungsteilerschaltung den
Widerstand des NTC ausrechnen und dann mit der umgestellten obigen
Formel letztlich die Temperatur berechnen.
Ich würde da also konsequenterweise alles für die gerade genannte
Tabelle schon vorher in Excel o.ä. ausrechnen, was sowieso bekannt und
konstant ist (NTC-Widerstandkennlinie, Spannungsteiler und dessen
Spannungsverlauf über die Temperatur, AD-Werte über die Temperatur...).
Dann würde ich direkt mit dem Binärwert aus dem AD-Wandler in die obige
Tabelle einsteigen und als Ergebnis würde ich direkt die Temperatur
erhalten...
Zweifler schrieb:> Oder vielleicht doch besser I2C-Sensoren à la DS1631 damit der> Controller noch was anderes tun kann ausser auf den OneWire> Bus zu warten und sein strenges Timing einzuhalten.
I2C ist aber nichts für lange Strecken. Es gibt aber 1-Wire-BUsmaster
(DS2482) die mittels I2C angesteuert werden und das ganze Timing selber
machen. Da braucht der Controller nicht mehr viel machen.
Peter schrieb:> Warum in Assembler? Weil ich es halt in Assembler schreiben> möchte.
Dann mußt Du es eben selber schreiben.
Der Rest der Welt nimmt dafür die Libs des C-Compilers.
https://de.wikipedia.org/wiki/Math.h
Temperaturmessungen sind ja keine eiligen Sachen, da spielt die
Rechenzeit keine Rolle. Sich da mit Assembler abzuquälen, ist also
vollkommen überflüssig.
Und wie ja schon gasgt wurde, wirst Du mit dem internen 10Bit-ADC eh nur
grobe Schätzwerte erhalten können.
Mal unabhängig von dem richtigen Einwand:
Lothar M. schrieb:> Wenn ich 1000 Stellen hätte, wo ich die Temperatur messen wollte,> dann würde ich mir einen Sensor aussuchen, den ich enfach und ohne> Nachkalibrierung tauschen könnte. Billige NTC taugen da meist nicht,> weil sie initial eine Toleranz von +-5..10% haben.
kannst du dir auch mal diese Seite anschauen:
http://www.sebulli.com/ntc/
Allerdings in C, sollte aber für einen Assembler-Programmierer keine
Problem sein, das umzusetzen.
Zweifler schrieb:> damit der> Controller noch was anderes tun kann ausser auf den OneWire> Bus zu warten und sein strenges Timing einzuhalten.
Bequem geht das als Interrupt im Hintergrund:
Beitrag "DS18B20 mit Interrupt, AVR-GCC"
Alles vorbei schrieb im Beitrag #6546464:
> Ich würde einen AVR mit eingebautem Temperatursenssor> z.B. (Attiny24 oder 25) nehmen.
Völlig unbrauchbar. Ich habe keine Ahnung, warum Atmel damals sowas
integriert hat, aber sinnlos ist es trotzdem. Ungenau, träge und
schlecht zu kalibrieren. Weil man sich dann noch mit der Bandgap
Referenz rumschlagen muss, hat man die nächste Fehlerquelle.
1000 KTY 81 kosten immer noch 489 € + Steuer und Versand.
Bei Sebulli kann ich mit der Tabelle nichts anfangen, wsl weil ich nicht
erkennen kann, was er mit dem Ergebnis des ADC macht, wie er es
verarbeitet. Seine Formel sieht aber besser aus als meine. Dort bräuchte
ich allerdings den natürlichen LOG.
Peter schrieb:> 1000 KTY 81 kosten immer noch 489 €
Umsonst ist der Tod. Und der kostet das Leben. Der Abgleich und die
Folgekosten sind bei billigen Sensoren garantiert um ein Vielfaches
teurer.
> + Steuer
In anderen Ländern sind die Steuern niedriger.
> und Versand.
Wenn du hinfährst und die Sensoren abholst, kannst du evtl. den Versand
"sparen".
Bitte, was ist denn das für ein jämmerliches Niveau?
Peter schrieb:> Bei Sebulli kann ich mit der Tabelle nichts anfangen, wsl weil ich nicht> erkennen kann, was er mit dem Ergebnis des ADC macht, wie er es> verarbeitet.
Du hast dich ja auch noch nicht arg lange damit beschäftigt...
Im Grunde nimmt er den 10 Bit AD-Wert und verwendet die oberen 5 Bits
als Index für den Zugriff auf die Tabelle.
Und dann nimmt er die 5 unteren Bits des AD-Werts und gewichtet die
beiden Tabellenwerte je nach "Abstand" zu den nächsten
Tabellenstützpunkten.
Wenn z.B. der unterste Wert mit Index 0 in der Tabelle 10 ist und der
zweite 20 und zudem der ADC-Wert 00_0000_0000, dann kommt als Ergebnis
10 heraus, wiel die Bits 9..4 ja 00000 sind und damit der Index 0.
Und wenn der ADC-Wert 00_0010_0000 ist, dann kommt als Ergebnis 20
heraus, weil ja die oberen 5 Bits 00001 und damit der Index 1 ist.
Beide Werte sind also deshalb so einfach zu ermitteln, weil der
Stützwert direkt "getroffen" wird.
Wenn jetzt aber der ADC-Wert 00_0000_1111 ist (also im Grunde genau
zwischen 10 und 20), dann ist der Index 0 und es wird zur Hälfte der
untere Wert und zur Hälfte der mit dem Index drüber genommen und der
Mittelwert gebildet. Und der Mittelwert ist einfach kommt als Ergebnis
(10*16 + 20*16)/32 heraus. Und das sind 15.
Wenn der AD-Wert nun 00_0000_0111 sind (also ein Viertel zwischen 10 und
20), dann ergibt die Rechnung (10*24 + 20*8)/32 = 12,5 (als integer dann
natürlich 12).
Einfach mal einen halben oder ganzen Tag drüber nachdenken. Irgendwann
tut es den Schnackler und dir geht das Licht auf. Besonders, wenn
jemand, der gerne Assembler programiert, sowieso mit solchen
Bitfrickeleien "per du" ist...
Hey,
sitze ich auch gerade dran, an "sowas".
(Drehstromkochplatte und in einem 35-Liter(?) auf Topf 60°C halten)
HildeK schrieb:> kannst du dir auch mal diese Seite anschauen:> http://www.sebulli.com/ntc/
Hab ich mal gemacht. Witzig ansich. Wenn ich testhalber die
Temperaturgrenzen ändere, ändert sich an den Tabelleneinträgen nichts.
Ich bekäme bei Vollausschlag 285° und im "MinimalFall" -71°C.
Vielleicht kann man drauf hinweisen, dass man sich vorab den Pull-Up so
hinbastelt, dass das Spannungsteilerverhältnis auch praktiabel ist.
bei 25°C hat man halbe Vref, wenn der Pullup genauso groß ist, wie der
NTC.
Hat zwar nicht viel mit der ausgangsfrage zu tun gehabt, wollte es
trotzdem mal anbringen, weils mir eben auffiehl.
Bei mir wären 40°C - 80°C ein einzustellender Bereich.
wie man gut sieht, sind von 128 Stützstellen lediglich paar'ndreissig
(von mir mitm Sternchen markiert) übrig geblieben.
Aber das mmit der Tabelle kann man auch in ASM gut umsetzen, Progmem und
LPM (lange her, oder? AT90S1200)
Wenn es Recht ist, würde ich (in einem eigenen Tread) mal nach den
Regelparametern fragen wollen und ob ich ein 40A 3-Phasen SSR kühlen
muss. Grins)
Messen der Temperatur ist ja nur das eine; den riesigen Topf Wasser
ausregeln stell' ich mir spannend vor.
Erst mal liebe Grüße in die Runde,
Äxl
Recht Offtopic, denke aber, dass da eine Klärung wichtig wäre.....
Matthias S. schrieb:> Völlig unbrauchbar. Ich habe keine Ahnung, warum Atmel damals sowas> integriert hat, aber sinnlos ist es trotzdem. Ungenau, träge und> schlecht zu kalibrieren. Weil man sich dann noch mit der Bandgap> Referenz rumschlagen muss, hat man die nächste Fehlerquelle.
Naa...
In deinen Augen völlig unverständlich.
Im AVR sind einige Dinge verbaut, welche schon temperaturabhängig sind.
Sei es die genannte Bandgap Referenz
Der RC Oszillator (OSCCAL) (Baud)
Auch der Oszillator des WDT
Für alle diese kann man Kalibrierwerte aus den Sensordaten erzeugen.
z.B. für den Außen/Kfz Einsatz, ohne Quarz und mit Serieller
Schnittstelle.
> träge
Weil er unter dick Plastik auf dem Die wohnt.
Zudem direkt von der Eigenerwärmung des µC beeinflusst wird.
Das macht ihn als "Raumtemperatur Sensor" quasi unbrauchbar.
Aber zum Zwecke der Kalibrierung, goldrichtig.
Ja, er macht Sinn!
Nicht immer und scheinbar auch nicht für jeden.
Peter schrieb:> Hallo Forum, die Überschrift sagt alles.
Die Überschrift sagt "ATMega Temperatur", also annähernd nichts.
Bei einem NTC genügt in der Praxis meistens eine einfache Linearisierung
mittels Widerstand. Typischerweise Rs mit gleichem Wert wie der NTC und
Rp mit dem Zehnfachen Ohm-Wert.
https://www.electronicdeveloper.de/MesstechnikNTCLinearR.aspx
Damit kommst kannst du eine Spanne von ca. 20 Grad (z.B. 15 bis 35°C)
abdecken innerhalb der die Messung weniger als 1 Grad Abweichung
liefert.
Genauer wird es nur theoretisch, denn in der Praxis driftet/altert der
NTC ein bisschen mit der Zeit und der ADC ist nicht absolut linear.
Größere Mühe lohnt sich nur, wenn man einen erheblich größeren
Temperaturbereich abdecken muss.
> Ich würde mir einen Temperaturbereich von -50 bis +100 Grad wünschen.
Da kann sich mehr Aufwand schon lohnen, wenn du weniger als (geschätzte)
5°C Abweichung in den Randbereichen brauchst. Irgendwo im Netz gibt es
dazu ein Tool, das die Abweichung der obigen Schaltung ausrechnet.
Iwi ist das alles nicht so richtig zielführend. Es scheint mir bald so,
sobald man einen Abgleich machen möchte, z.B. bei 0°C mit gefrorenen,
destillierten Wasser, kommt man ohne natürlichen Logarithmus nicht mehr
aus. Ich habe da eine Routine auf
https://sites.google.com/site/avrasmintro/home/2c-logarithms gefunden.
Siehe unter "8. NATURAL LOGARITHM OF A SIXTEEN-BIT NUMBER". Funktioniert
auch, nur habe ich zwei Teile im Ergebnis, als erstes "Fractional Part
of Answer" und als zeites "Integer Part of Answer". Nun stellt siech mir
die Frage, was kann ich mit welchem Teil machen, vor allem bräucht ich
zum Schluß eine Festkommazahl um einen einigermaßen genauen Wert
errechnen zu können.
Kann mir jmd erklären was ich genau mit den Zwei Integerzahlen machen
kann und wie ich zu einer Festkommazahl komme?
Peter F. schrieb:> vor allem bräucht ich zum Schluß eine Festkommazahl um einen> einigermaßen genauen Wert errechnen zu können.
Die Genauigkeit einer 32-Bit-Gleitkommazahl ist zu schlecht, oder warum
diese Aussage?
Und da kommt jetzt meine Unwissenheit ins Spiel, tut mir leid, aber ich
verstehe nicht ganz wie Du auf 32-Bit-Gleitkommazahl kommst. Könntest Du
mir hierzu ein paar Stichwörter schreiben?
Peter F. schrieb:> aber ich verstehe nicht ganz wie Du auf 32-Bit-Gleitkommazahl kommst
Das wäre für mich in dem Moment, wo ich mit irgendwelche logarithmischen
Rechnereien herum hantieren möchte, das Mittel der Wahl – es sei denn,
es sprechen außerordentlich handfeste Gründe dagegen (Konsumgüter-Gadget
in Millionenstückzahl, bei dem es auf jeden Cent ankommt, muss mit einem
ATtiny13A auskommen oder dergleichen).
Die Gleitkomma-Implementierung der üblichen AVR-Compiler ist gut genug,
dass man die Rechnerei auf einem halbwegs brauchbar ausgestatteten
ATmega (der steht in der Überschrift) locker in Gleitkomma abhandeln
kann, sowohl von der Rechenzeit als auch vom Flash-Bedarf. Damit spart
man sich all diese Verrenkungen, irgendwelche Logarithmen in
Festkommaarithmetik zu berechnen. Na klar geht sowas, aber der Aufwand,
die Software dafür zu zimmern und zu pflegen, explodiert einfach im
Vergleich zur simplen Lösung mit Gleitkommazahlen (wie du ja im Prinzip
schon an deiner Frage erkennen kannst).
(Vor 30+ Jahren habe ich mal eine Approximation für einen
Binär-Logarithmus mit Festkommazahlen gezimmert. Das war aber ein
schwächlicher Z80 mit einem BASIC drunter, und die gesamte
Logarithmierung diente nur der logarithmischen Achsen-Skalierung in der
Grafik-Darstellung, musste also auch nicht übertrieben genau sein.)