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: > 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. Wieso? Das liegt doch offen zu tage. https://github.com/vancegroup-mirrors/avr-libc/blob/master/avr-libc/libm/fplib/log.S
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...
:
Bearbeitet durch Moderator
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"
HildeK schrieb: > kannst du dir auch mal diese Seite anschauen: > http://www.sebulli.com/ntc/ Nett. Genau so geht das... ;-) > Billige NTC taugen da meist nicht, > weil sie initial eine Toleranz von +-5..10% haben. Einen hätte ich da allerdings im Kopf, der enger spezifiziert ist: https://shop.bb-sensors.com/Messtechnik-je-Branche/Maschinenbau/Temperatursensor-NTC-10-k.html Oder den aus dem Abverkauf: https://shop.bb-sensors.com/Abverkauf/NTC-Temperatursensor-1-k-1.html Ich würde da dann aber eher auf den KTY81 zurückgreifen, der ist an jeder Ecke zu bekommen: https://de.farnell.com/nxp/kty81-110-112/temperatursensor-sod70/dp/2066195
Beitrag #6546464 wurde von einem Moderator gelöscht.
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.
Und Du meinst es kommt billiger, 1000 Sensoren abzugleichen als gleich ordentliche Sensoren zu verwenden?
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...
:
Bearbeitet durch Moderator
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.
1 | Anzahl der Stützpunkte:--> 128 |
2 | Einheit in °C:--> 1 |
3 | ADC Auflösung:--> 8 |
4 | NTC Beschaltung:--> NTC mit PullUp Widerstand |
5 | PullUp/Down-Widerstand in Ohm:--> 10000 |
6 | Widerstand NTCs bei 25°C:--> 10000 |
7 | BETA Wert des NTCs:--> 3480 |
8 | Test resistance:--> 10000 |
9 | Messbereich:--> Von 0°C bis 100°C |
10 | |
11 | int NTC_table[129] = { |
12 | 285, 237, 189, 165, 149, 138, 129, 121, 115, |
13 | 110, 105, 101, 97, 93, 90, 87, 85, 82, *80, |
14 | *77, *75, *73, *71, *70, *68, *66, *65, *63, *61, *60, |
15 | *59, *57, *56, *55, *53, *52, *51, *50, *49, *48, *47, |
16 | *46, *45, *43, *42, *42, *41, *40, 39, 38, 37, 36, |
17 | 35, 34, 33, 32, 32, 31, 30, 29, 28, 27, 27, |
18 | 26, 25, 24, 23, 23, 22, 21, 20, 19, 19, 18, |
19 | 17, 16, 16, 15, 14, 13, 12, 12, 11, 10, 9, |
20 | 9, 8, 7, 6, 5, 4, 4, 3, 2, 1, 0, -1, -2, |
21 | -2, -3, -4, -5, -6, -7, -8, -9, -10, -12, |
22 | -13, -14, -15, -16, -18, -19, -20, -22, -24, |
23 | -25, -27, -29, -31, -34, -36, -39, -43, -47, |
24 | -53, -62, -71 |
25 | }; |
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
:
Bearbeitet durch User
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.
Beitrag #6546794 wurde von einem Moderator gelöscht.
Beitrag #6546810 wurde von einem Moderator gelöscht.
Beitrag #6546814 wurde von einem Moderator gelöscht.
Beitrag #6546826 wurde vom Autor gelöscht.
Beitrag #6546925 wurde von einem Moderator gelöscht.
Beitrag #6546950 wurde von einem Moderator gelöscht.
Beitrag #6547020 wurde von einem Moderator gelöscht.
Beitrag #6547211 wurde von einem Moderator gelöscht.
Beitrag #6547227 wurde von einem Moderator gelöscht.
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.)
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.