Analoger Sensor (LM335) mit Operationsverstärker + AVR Asm-Code

OP Persönliche Seite #3786045
Lesenswert?

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
Angehängte Dateien:
OP Persönliche Seite #3786077
Lesenswert?

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.
OP Persönliche Seite #3789361
Lesenswert?

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.
Angehängte Dateien:
Gast #3792246
Lesenswert?

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.
OP Persönliche Seite #3792288
Lesenswert?

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.
Gast #3792295
Lesenswert?

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. ;->
Gast #3793305
Lesenswert?

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....
:-)))
OP Persönliche Seite #3793326
Lesenswert?

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?
Gast #3793522
Lesenswert?

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.
OP Persönliche Seite #3793835
Lesenswert?

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.
Gast #4251529
Lesenswert?

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.
OP Persönliche Seite #4259265
Lesenswert?

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.
OP Persönliche Seite #4262466
Lesenswert?

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 ;-)
#4263607
Lesenswert?

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.

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