Ein analoger LM335 Temperaturfühler (10mV/K) und ein 5V OPV TS921 aus der Bastelkiste arbeiten in dieser Schaltung eines OPV mit Offset (siehe http://www.mikrocontroller.net/articles/Operationsverst%C3%A4rker-Grundschaltungen#Nichtinvertierender_Verst.C3.A4rker_mit_Offset) zusammen, um einen bestimmten Temperaturbereich für einen angeschlossenen MC mit 10Bit ADU und 5V Referenz besser als die üblichen 5mV=0,5K aufzulösen. Berechnet ist der OPV für die Temperaturspanne von grob -8 bis +15° (Einsatz im Kühlschrank), was am Ausgang ca. 2,7-4,9V und damit nun etwa Faktor 10 bessere Auflösung =0,05K ergibt. Um eine Neukalibrierung wird man allerdings bei dieser Billiglösung in den meisten Fällen nicht herum kommen. Wenn nicht gerade ein MC-Input dran angeschlossen soll bietet der TS921 für andere Einsatzfälle durchaus ein paar Dutzend mA am Ausgang mehr. Demnächst gibts zum Einlesen noch etwas Assemblercode für SimplyAVR ;-) Moby
:
Bearbeitet durch User
Die Schaltung ist ja mehr von der Genaugkeit der 5V Versorgungsspannung abhängig als von der realen Temperatur.
MaWin schrieb: > Die Schaltung ist ja mehr von der Genaugkeit der 5V > Versorgungsspannung > abhängig als von der realen Temperatur. Die Abhängigkeit gibt es, sie spielt aber bei geregelten 5V hier keine wesentliche Rolle. Eine Präzisionsschaltung ist diese einfache Lösung ohnehin nicht. Es geht vor allem darum, den Eingangsspannungsbereich des AD-Wandlers besser auszunutzen. Nach Temperaturkalibrierung sind die gemessenen Werte absolut stabil und nachvollziehbar.
Anbei noch etwas Asm-Code für MEGAx8er AVRs zur hintergründigen Verwendung in einem Timerinterrupt. Es werden hier 4 analoge Werte von PortC0/1 (Referenz:VCC) und PortC2/3 (Referenz 1,1V) jeweils 64x eingelesen und daraus der Durchschnitt ermittelt. Bei z.B. 200Hz Aufruffrequenz gibts dann alle 1,28 Sekunden 4 neue gemittelte Werte.
:
Bearbeitet durch User
Moby AVR schrieb im Beitrag #3786077: > Die Abhängigkeit gibt es, sie spielt aber bei geregelten 5V hier keine > wesentliche Rolle. LM335 +10mV/°K uA7805 –1.1mV/°C hhhmmmm, wie groß ist der Fehler nur?
Moby AVR schrieb im Beitrag #3786045: > Ein analoger LM355 Temperaturfühler muß das nicht LM335 heissen? Gruß Anja
10% schrieb: > Moby AVR schrieb: > Die Abhängigkeit gibt es, sie spielt aber bei geregelten 5V hier keine > wesentliche Rolle. > > LM335 +10mV/°K > uA7805 –1.1mV/°C > > hhhmmmm, wie groß ist der Fehler nur? Die ca. 23K Temperaturdifferenz ergeben etwa 2200mV Spannungsdifferenz, macht 95mV pro Kelvin/°C. Da spielen Deine 1,1mV eben keine wesentliche Rolle. Auf den LM335 selbst schon mal gleich gar nicht. @Anja Danke für den Hinweis, wird korrigiert.
Moby schrieb: > Die ca. 23K Temperaturdifferenz ergeben etwa 2200mV Spannungsdifferenz Wie kommst du darauf? Ich komme auf 10mV/K*23K=230mV. Gelichzeitig ändert sich die Referenzspannung um -1.1mV/K*23K=25.3mV.
Moby schrieb: > Da spielen Deine 1,1mV eben keine wesentliche > Rolle. Die gehören nicht mir, sondern den geregelten 5V durch einen uA7805.
2200 mV am Ausgang. Was die Höhe der Referenzspannung betrifft hab ich das als Praktiker jetzt nicht ins letzte ausgerechnet. Doch Fakt ist trotzdem: Wenn der Spannungsregler nicht mit dem Sensor beisammen ist (nicht mit im Kühlschrank und mit etwa Zimmertemperatur wie bei mir im Einsatz), gibt es keine 23K Streuung für ihn. Wenn er mit dem Sensor beisammen wäre ist das auch wurscht, wenn sowieso später auf Temperatur kalibriert wird. Bitte meine Bemerkung im Eingangsposting beachten: Das ist keine Präzisionsschaltung. Die Genauigkeit und Reproduzierbarkeit der Messwerte in der Praxis nichtsdestotrotz absolut ausreichend.
10% schrieb: > Rechner schrieb: > Wie kommst du darauf? > > 8Bit Überlauf. :-D Schau mal in den Code rein. Da wird völlig ausreichend 16 bittig gerechnet ;-)
Moby AVR schrieb im Beitrag #3792290: > 16 bittig gerechnet Moby AVR schrieb im Beitrag #3792288: > Was die Höhe der Referenzspannung betrifft hab ich das als Praktiker > jetzt nicht ins letzte ausgerechnet. Für den Praktiker hier hätten bestimmt geschätzte 8Bit ausgereicht. ;->
Das nachträgliche Löschen von Anhängen ist wohl nicht möglich. Deshalb oben die zwei Bildchen... Für wen mehr als die 1.Stelle nach dem Komma wichtig ist und wer mehr Aufwand treiben will der kann ja den 33K durch eine gute 2,5V Referenzspannungsquelle ersetzen ;-)
:
Bearbeitet durch User
Atmega 168 ,1,23v interne Referenz und fertig ist die Kiste ... Wozu soviel Aufwand....
Pastor Braune schrieb: >fertig ist die Kiste ... Aber nicht mit einem Sensor, wo der interessante Messbereich erst ab 2,5V beginnt und der 10-bittig im besten Fall in 0,5K Schritten auflöst.
Moby AVR schrieb im Beitrag #3793263: > wo der interessante Messbereich erst ab > 2,5V beginnt und der 10-bittig im besten Fall in 0,5K Schritten auflöst Ist dir die Bedeutung der gewählten Begriffe wirklich geläufig? Moby AVR schrieb im Beitrag #3786045: > ca. 2,7-4,9V Sollen gewandelt werden. Das sind 2,2V und noch nicht einmal die Hälfte des Messbereichs von 5V. Am invertierenden Eingang des OPV ist ein Spannungsteiler, der stark durch den Strom im Rückkopplungszweig beeinflusst wird. Das Verhältnis der Widerstände ist viel zu klein. Warum nicht einen invertierenden Verstärker für den Sensor wählen und den Spannungsteiler (fast) ohne abfließende Ströme betreiben. Bleibt natürlich noch die starke Abhängigkeit von der Versorgungsspannung. Da gehört eine vernünftige Referenz rein oder ein anderes Messprinzip. Moby AVR schrieb im Beitrag #3793263: > der 10-bittig im besten Fall in 0,5K Schritten auflöst Moby AVR schrieb im Beitrag #3792288: > Das ist keine > Präzisionsschaltung Wozu dann die Aufregung? Pastor Braune schrieb: > Atmega 168 ,1,23v interne Referenz und fertig ist die Kiste ... > Wozu soviel Aufwand.... :-)))
OPV schrieb: > Ist dir die Bedeutung der gewählten Begriffe wirklich geläufig? Was ist daran falsch? > Moby AVR schrieb: > ca. 2,7-4,9V > > Sollen gewandelt werden. Das sind 2,2V und noch nicht einmal die Hälfte > des Messbereichs von 5V. ... und trotzdem 2,2V gegenüber nur 230mV Differenz ohne Verstärkung. > Am invertierenden Eingang des OPV ist ein Spannungsteiler, der stark > durch den Strom im Rückkopplungszweig beeinflusst wird. Das Verhältnis > der Widerstände ist viel zu klein. Na das Verhältnis sicher nicht, die Absolutwerte meinst Du wohl ;-). Mag sein, funktioniert aber nach Kalibrierung genauso. > Warum nicht einen invertierenden Verstärker für den Sensor wählen und > den Spannungsteiler (fast) ohne abfließende Ströme betreiben. Ok. Werd mir diese Idee mal zu Gemüte führen, wenn sie denn für noch mehr Genauigkeit / einen grösseren Messbereich sorgt. > Bleibt natürlich noch die starke Abhängigkeit von der > Versorgungsspannung. Da gehört eine vernünftige Referenz rein oder ein > anderes Messprinzip. Der Aufwand lässt sich beliebig treiben ;-) In der Praxis tuts die Schaltung für 1 Stelle nach dem Komma. > Moby AVR schrieb: > der 10-bittig im besten Fall in 0,5K Schritten auflöst > > Moby AVR schrieb: > Das ist keine > Präzisionsschaltung > > Wozu dann die Aufregung? Nutzen siehe oben ;-) > Pastor Braune schrieb: > Atmega 168 ,1,23v interne Referenz und fertig ist die Kiste ... > Wozu soviel Aufwand.... > > :-))) Ach ja, da hängt der 335er dann dran, was?
:
Bearbeitet durch User
Moby AVR schrieb im Beitrag #3793326: > trotzdem 2,2V gegenüber nur 230mV Differenz ohne Verstärkung Wenn man schon verstärkt, wird es so ausgelegt, dass möglichst der volle Messbereich des A/D Wandlers genutzt wird. Moby AVR schrieb im Beitrag #3793326: > Verhältnis sicher nicht, die Absolutwerte meinst Du Nein, das Spannungsverhältnis ändert sich durch den Strom im 120k Widerstand. Er belastet den Spannungsteiler. Bei einem Verstärker wird (je)der Fehler mit verstärkt.
Danke für den sachlichen Beitrag. OPV schrieb: > Wenn man schon verstärkt, wird es so ausgelegt, dass möglichst der volle > Messbereich des A/D Wandlers genutzt wird. Wie das bei einem Sensor ab 2,5V Ausgang und einem 5V OPV genauso simpel geschehen soll bleibt mir schleierhaft. Pastor Braune schrieb: > Atmega 168 ,1,23v interne Referenz Die interne Referenz hat beim Mega48/88/168/328er übrigens 1,1V, um das noch zu berichtigen.
Obiger Asm-Code enthielt noch einen kleinen Fehler, anbei die korrigierte Version. Danke für den Hinweis von Mod Yalu.
Und du glaubst, daß jemand dieses Rätsel interessiert. Warum sollte man die Auswirkung der Befehle auf die Flags auswendig lernen? Ach ja die Register, die eine Routine zerstört, muß man nicht als Doku hinschreiben, denn das steht da ja schon alles.
Fragen zum Code beantworte ich gerne. Die Kommentierung kann dann individuell geschehen ;-)
Vielleicht noch ein paar Worte zum Einsatz obigen Asm-Codes, da es in einem anderen Thread selbst von gestandenen Profis noch Fragen zum Einsatz gab ;-) 1. Es handelt sich um kein eigenständiges Programm, sondern um Code der in andere Projekte eingebaut werden kann. 2. Damit das problemlos und nebenwirkungsfrei geschehen kann ist der Baustein für sich unabhängig und wird als adu: einfach nur in einem Timerinterrupt (für vielleicht noch Tausend andere Zwecke) mit wenigen Hundert Herz aufgerufen. Der angegebene Initialisierungscode ist nur noch in den Initialisierungscode des Zielsystems mit einzubauen. 3. Für sich benötigt der Baustein 17 RAM-Datenbytes. 8= 2Words davon enthalten immer die 10bittigen Ergebnisse von 4 ADU Kanälen, auf die von Programmteilen des Zielsystems jederzeit gültig zugegriffen werden kann. Jedes der 4 Messergebnisse ist ein Durchschnittswert aus 64 vorangegangenen Messungen. Dies dient zur simplen Messwertglättung bzw. Fehlerkorrektur. 1 Datenbyte dient als einfacher Timer-Interruptcounter, der natürlich auch an anderer Stelle im Timerinterrupt inkrementiert und genutzt werden kann. 4. Den ersten beiden ADU-Kanälen liegt als Referenzspannung die Betriebsspannung VCC, den letzten beiden die Controller-interne 1,1V Referenz zugrunde. Das ist fix zugeordnet und entsprechend sind geeignete Analogsensor-Quellen anzuschließen.
:
Bearbeitet durch User
5. Der Baustein zerstört alle drei Pointer-Register und damit die wichtigsten Register-Resourcen des AVR und erwartet, daß die von Caller gesichert werden.
Carl D. schrieb: > 5. Der Baustein zerstört alle drei Pointer-Register und damit die > wichtigsten Register-Resourcen des AVR und erwartet, daß die von Caller > gesichert werden. Das ist so gedacht: Ein solcher unabhängig agierender Baustein wird als einer von mehreren in einem allgemeinen Timer-Interrupt aufgerufen (bitte schau noch mal unter Punkt 2). Dieser sichert natürlich auch die Pointerregister. Am besten schnell, kurz und stackfrei via movw in dafür vorgesehene, minderwertigere Register wie R10-R15. In Interrupts verwende ich vorzugsweise/möglichst nur die vielseitigen Pointerregister. Du siehst Carl, den schlimmen Zerstörungen der allerwichtigsten Ressourcen wird so der Schrecken genommen ;-)
:
Bearbeitet durch User
Moby A. schrieb: > Das ist so gedacht: Dacht' ich's mir ;-) Mit der Forderung nach Gedankenlesen machst du aber niemandem eine Freude. Wie in vielen anderen Posts schon erwähnt: Doku! Doku! Doku! Außerdem solltest du anderen ASM-Fetischisten (falls es solche überhaupt gibt) eine andere Herangehensweise zugestehen, die aus deren Sicht möglicherweise effektiver ist.
Ralf G. schrieb: > Doku! Doku! Doku! Oder einfach hier fragen wenn was unklar ist ;-) Hast Du denn Fragen zum Projekt? Oder möchtest Du gern Deine effektivere Herangehensweise demonstrieren? Bittesehr! Da freu ich mich drauf!
Moby schrieb: > Oder einfach hier fragen wenn was unklar ist ;-) Da wir hier ja an einem PC sitzen... Wenn dir bei der Bedienung eines Programms was unklar ist, dann rufst du beim Programmierer an? Oder schaust du da in die Doku/ Hilfe?
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.