Forum: Projekte & Code Analoger Sensor (LM335) mit Operationsverstärker + AVR Asm-Code


von Moby A. (moby-project) Benutzerseite


Angehängte Dateien:

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

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

Die Schaltung ist ja mehr von der Genaugkeit der 5V Versorgungsspannung 
abhängig als von der realen Temperatur.

von Moby A. (moby-project) Benutzerseite


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.

von Moby A. (moby-project) Benutzerseite


Angehängte Dateien:

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.

: Bearbeitet durch User
von 10% (Gast)


Lesenswert?

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?

von Anja (Gast)


Lesenswert?

Moby AVR schrieb im Beitrag #3786045:
> Ein analoger LM355 Temperaturfühler

muß das nicht LM335 heissen?

Gruß Anja

von Moby (Gast)


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.

von Rechner (Gast)


Lesenswert?

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.

von 10% (Gast)


Lesenswert?

Rechner schrieb:
> Wie kommst du darauf?

8Bit Überlauf. :-D

von 10% (Gast)


Lesenswert?

Moby schrieb:
> Da spielen Deine 1,1mV eben  keine wesentliche
> Rolle.

Die gehören nicht mir, sondern den geregelten 5V durch einen uA7805.

von Moby A. (moby-project) Benutzerseite


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.

von Moby A. (moby-project) Benutzerseite


Lesenswert?

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 ;-)

von 10% (Gast)


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. ;->

von Moby A. (moby-project) Benutzerseite


Lesenswert?

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
von Pastor Braune (Gast)


Lesenswert?

Atmega 168 ,1,23v interne Referenz und fertig ist die Kiste ...
Wozu soviel Aufwand....

von Moby A. (moby-project) Benutzerseite


Lesenswert?

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.

von OPV (Gast)


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....
:-)))

von Moby A. (moby-project) Benutzerseite


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?

: Bearbeitet durch User
von OPV (Gast)


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.

von Moby A. (moby-project) Benutzerseite


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.

von Moby A. (moby-project) Benutzerseite


Angehängte Dateien:

Lesenswert?

Obiger Asm-Code enthielt noch einen kleinen Fehler, anbei die 
korrigierte Version. Danke für den Hinweis von Mod Yalu.

von Bastler (Gast)


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.

von Moby A. (moby-project) Benutzerseite


Lesenswert?

Fragen zum Code beantworte ich gerne.
Die Kommentierung kann dann individuell geschehen ;-)

von Moby A. (moby-project) Benutzerseite


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.

: Bearbeitet durch User
von Carl D. (jcw2)


Lesenswert?

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.

von Moby A. (moby-project) Benutzerseite


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 ;-)

: Bearbeitet durch User
von Ralf G. (ralg)


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.

von Moby (Gast)


Lesenswert?

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!

von Ralf G. (ralg)


Lesenswert?

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