Forum: Mikrocontroller und Digitale Elektronik Messen mit Atmega16


von Rinaldo K. (rinaldo)


Lesenswert?

Möchte mit meinem Atmega16 Spannungen von 0-5V messen, hierbei muss ich
auf 8mV genau messen. Geht das? Steht dann der Wert in binär in einem
Register?

Rinaldo

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

Im Dateblatt mal das Kapitel zum ADC lesen. Das ist genau, was du
suchst. Sollte bei 10bit auf 5mV genau sein (theoretisch)

von Hartmut Gröger (Gast)


Lesenswert?

Hi

AVRs haben 10Bit AD-Wandler. D.h bei 5V Referenzspannung ergibt sich
eine theoretische Auflösung vo 4,88mV. Theoretisch heisst,daß noch
systembedingte Fehler wie Nichtlinearitäten,Bitfehler,Rauschen u.ä das
Ergenis verfälschen.
Der Wert steht binär in den Ergebnisregistern.
Für deine Anforderungen wäre ein externer 12Bit Wandler wahrscheinlich
günstiger.

MfG HG

von Togger (Gast)


Lesenswert?

Hi Rinaldo,
du hast bei 10Bit (ATMega) eine Auflösung von 5V / 1024 = 4,88mV.
Das Messergebnis befindet sich nach der Messung in 2 Registern (ok
eigentlich ports).
Willst du es genauer haben, brauchst einen externen AD-Wandler.

lg Ralf

von Ratber (Gast)


Lesenswert?

5V/1024= ?

Ihr meint wohl 5V/1023=

von Hartmut Gröger (Gast)


Lesenswert?

Hi

0..1023=1024 Werte

MfG HG

von Ratber (Gast)


Lesenswert?

Ja 1024 Werte it unbestritten aber du rechnest die 0 mit ein und das ist
 nicht korrekt auch wenn es bei 10 Bit nicht auffällt.

Rechne mal mit 2 oder 3 Bit Auflösungdann merkst du den Rechenfehler
'-)

von Ratber (Gast)


Lesenswert?

Ergänzung:

Ich gehe natürlich davon aus das mit dem untersten Wert auch die Masse
(also 0V) und mit dem obersten Wert die Referenz (also hier 5V)
dargestellt werden sollen unabhängig davon ob der Wandler die jetzt
wirklich messen kann (Unterer/oberer Schwellwert aufgrund
schaltungstechnischer Einschränkungen usw.)

von Henrik Reimers (Gast)


Lesenswert?

@Ratber

na dann rechne doch mal selbst:

bei einem Bit Auflösung (2 Werte) wäre der Divisor dann 1? Ne, ne - die
Null wird in der Digital-/Binärarithmetik schon mitgezählt :-).

Henrik

von Rolf Magnus (Gast)


Lesenswert?

> bei einem Bit Auflösung (2 Werte) wäre der Divisor dann 1?

Was denn sonst? 0 entspricht 0V und 1 entspricht 5V. Es gibt zwei
Werte, aber der Wert 1 entspricht schon dem Maximum. Die Schrittweite
ist also 5V/1, und nicht 5V/2. Bei 10bit hat man 1024 Werte. 0
entspricht 0V, 1023 dem Maximum, also ist die Schrittweite 5V/1023.

von Henrik Reimers (Gast)


Lesenswert?

Upps, sorry - Ihr habt recht, das war mein Denkfehler!

Henrik

von Ratber (Gast)


Lesenswert?

Yo

von Ratber (Gast)


Lesenswert?

Test:

Mal sehen ob es dargestellt wird.


Die Formel für die Auflösung ist einfach  Uaufl = U/2^n-1

von Hartmut Gröger (Gast)


Lesenswert?

Hi

Laut Datenblatt -> ADC Conversation Result ist

       ADC=(Vin*1024)/Vref

Mfg HG

von Ratber (Gast)


Lesenswert?

Rechne mal für Vref 5V ,für Vin 2,5V und für die Auflösung 2 Bit.

Also ADC=(2.5V*4)/5V

Und nu geh die 4 Werte durch.
Merkste was ? '-)





Der Schreiberling der das Dokument verfasst hat hat nicht eingerechnet
das in der Binärten Technik von 0 an gezählt wird und nicht erst mit
der 1.
Typischer Fehler.
Auch bei Atmel schreiben angelernte die Dokumente und nicht die
Experten denn die sind ganz anders beschäftigt. '-)

Setz bei der Auflösung "U/2^n-1" statt "/U2^n" ein dann isses
korrekt.

von Hartmut Gröger (Gast)


Lesenswert?

Hi

Okay,nach reiflicher Überleung schliesse ich mich dem an.

Unabhängig davon möchte ich auf die AppNotes AVR120 und 121 hinweisen.
Letztere beschreibt Möglichkeiten zur Erhöhung der Auflösung der
AVR-ADCs.Habe ich allerdings eben erst heruntergeladen und nur kurz
überflogen.

MfG HG

von Ratber (Gast)


Lesenswert?

Ja die Methode ist einfach indem man die Aref extra moduliert und den
Schaltpunkt der Bits veschiebt.
Damit kann man die Auflösung um 1-2 Bits heraufsetzen.

Hab ich mal vor 15 jahren für einen 6 Bit Wandler gemacht da mit nen 8
Bit noch zu teuer war.
Ging einigermaßen.

Is aber in der Praxis mit 10 auf 11 oder 12 Bit ne Knifflige Sache.

Es erfordert sehr eng tollerierte Bauteile verwenden und die Aref muß
wirklich stabil seinsonst hast du von den 1-2 Bit extra nichts da sie
"flattern2 wie Laub im herbst.

von Hannes L. (hannes)


Lesenswert?

Eigentlich ist das ja kein Grund zum "Streiten", aber wenn es der
"Diskussion" hilft, dann äußere ich auch mal meine Meinung zu diesem
immer wieder aufkommenden Thema...


> Rechne mal für Vref 5V ,für Vin 2,5V und für die Auflösung 2 Bit.
>
> Also ADC=(2.5V*4)/5V
>
> Und nu geh die 4 Werte durch.
> Merkste was ? '-)

00   0   0,00V...<1,25V
01   1   1,25V...<2,50V
10   2   2,50V...<3,75V
11   3   3,75V...<5,00V

Das sind 4 verschiedene Ergebnisse, aber nur 3 "Grenzen" bzw.
"Schritte" (Schwellwerte zwischen 2 benachbarten Ergebnissen).

Bei 10 Bit sind es demnach 1024 verschiedene Werte, aber nur 1023
"Grenzen".

Beim Dezimalsystem (10 Ziffern) sind es auch 10 Werte (je Stelle) aber
nur 9 Schritte. Trotzdem reden wir vom Dezimalsystem und nicht vom
"Nonimalsystem".

Wenn man mit H-Byte und L-Byte eines 16-Bit-Wertes arbeitet, dann teilt
man den Wert, um das H-Byte zu erhalten, auch durch 256 und nicht durch
255.

Daher halte ich

       ADC=(Vin*1024)/Vref

schon für korrekt.

Denn jeder mögliche Wert (0...1023) repräsentiert ja nicht einen
Spannungswert (mit vielen Nachkommastellen), sondern einen
Spannungsbereich.

Der erste (0) die Spannung von 0 (0/1024) bis 1/1024,
der letzte (1023) die Spannung von 1023/1024 bis Maximum (1024/1024).

Bit- & Bytebruch...
...HanneS...

(Duck & wech...)

von Andi K. (Gast)


Lesenswert?

Hi Hannes :-)

Allerdings kommt ein ADC-Wert von 1024 nie und niemals in den Registern
ADCH:L vor.

Rechnet man nun V = 5V / 1024 * 1023 kommt man bei der Rechnung niemals
auf 5V.
Man könnte natürlich den ausgelesenen ADC-Wert vorher um 1 erhöhen
damit das wieder passt, aber bei ADC = 0 kommt dann auch nicht 0 raus.

Wie dem auch sei, Mehrfachmessung für eine Messung ist eigentlich am
besten wenn es genauer sein darf.

Durch Verzehnfachung oder Verhundertfachung und Addition der Messwerte
für eine Messung kann man die Auflösung erhöhen.
Beispiel Temperaturmessung:
Z. B. mit einem linearisierten NTC bekomme ich Werte in Schritte von
0.1°.
Da mir das nicht genügt und ich gerne in Schritten von 0.01° messen
will, wird die Messung Verzehnfacht.
Um Messschwankungen vorzubeugen und in ASM dann einfacher zu teilen,
wird eine Messung dann noch mal auf den Faktor 32 erhöht.
Im Endeffekt werden dann für eine Temperaturmessung 320 Messwerte
addiert, durch 32 geteilt, von einer festen Konstante subtrahiert und
die Temperatur ist in 0.01°-Schritte ermittelt.

MfG
Andi

von Ratber (Gast)


Lesenswert?

Ja nur verwechselst du die Zahl der möglichen Werte mit dem Ergebnis was
 du bekommst.

Mit 10 Bit kann ich nur die Werte 0 bis 1023 abbilden und nicht den
Wert 1024.

Die Formel berücksichtigt das aber nicht und spuckt die Werte 1-1024
aus wobei 1 für 0V steht und 1024 für die Referenz.

Nunn starte mal deinen ADC und schau was er dir ausspuckt. '-)

Die Formel gibt nur "1." bis "1024." Wert aus womit ich aber in der
Schaltung und beim Rechnen nichts anfangen kann es sei denn ich mache
den umständlichen Weg immer eins höher zu zählen nur um die null nicht
als Wert nehmen zu müssen.

Also Sorry aber das ist sowas von Praxisfremd das es in einemDatenblatt
nichts zu suchen hat.


Ich kann es nur immerwieder empfehlen es mal mit einer überschaubaren 2
Bit Auflösung zu verifizieren.




>Wenn man mit H-Byte und L-Byte eines 16-Bit-Wertes arbeitet, dann
>teilt man den Wert, um das H-Byte zu erhalten, auch durch 256 und
>nicht durch 255.

Ja mit dem 9. Bit und nicht mit dem 8.

Merkste nicht das du hier den gleichen Rechenfehler machst ?

Rechne nochmal nach.

von Ratber (Gast)


Lesenswert?

@Andi


>Durch Verzehnfachung oder Verhundertfachung und Addition der
>Messwerte für eine Messung kann man die Auflösung erhöhen.
>Beispiel Temperaturmessung:
>Z. B. mit einem linearisierten NTC bekomme ich Werte in Schritte von
>0.1°.
>Da mir das nicht genügt und ich gerne in Schritten von 0.01° messen
>will, wird die Messung Verzehnfacht.
>Um Messschwankungen vorzubeugen und in ASM dann einfacher zu teilen,
>wird eine Messung dann noch mal auf den Faktor 32 erhöht.
>Im Endeffekt werden dann für eine Temperaturmessung 320 Messwerte
>addiert, durch 32 geteilt, von einer festen Konstante subtrahiert und
>die Temperatur ist in 0.01°-Schritte ermittelt.



?????????.......


Wenn ich davon ausgehe das die Messwerte nicht durch Störungen
verfälscht werden dann messe ich mit einem zb. 10-Bit Wandler immer nur
10-Bittig egal wie oft ich messe.
Im Gegenteil,ich mittle mit der Methode um Störungen auszugleichen.

Nimm mal den einfachsten AD-Wandler,den Koparator.Also 1 Bit.
die Grenze liegt bei 5V Referenz genau bei 2.5V
Ich lege zb. 3V an also wird mir eine 1 angezeigt und damit 5V.

Wenn die Versorgung und das Signal stabil ist bekomme ich immer eine
1.
Da kann ich eine Milliardemal messen und am Ende durch eine Milliarde
teilen,es ist immernoch eine 1 und die Auflösung beträgt immernoch 1
Bit.

Sorry aber Auflösungserhöhung ist wenn ich den Referenz-Messbereich von
0-5V auf 1.25-6.25V (Also allgemein um die Hälfte der Auflösung) erhöhe
um den Schaltpunkt von 2.5 auf 3.75V zu erhöhen.
Damit kan ich die 3V zwischen 2.5 und 3.75V eingrenzen und habe die
Auflösung auf 2 Bit erhöht.

Oder hast du dich nur etwas unverständlich ausgedrückt ?

von Jan (Gast)


Lesenswert?

Ich denke, wir sind uns über diese Tabelle, die HanneS gepostet hat,
einig:

> 00   0   0,00V...<1,25V
> 01   1   1,25V...<2,50V
> 10   2   2,50V...<3,75V
> 11   3   3,75V...<5,00V

Hier sieht man doch schon eindeutig, dass die Schrittweite genau 1/4
Vref beträgt, also  allgemein ADC = floor(Vin/Vref * 2^n)
(floor = abrunden)

Um nun von einem ADC-Wert wieder zurück zu einer Spannung zu kommen,
gibt es mehrere mögliche Aussagen:
a) Vin ist größer als    Vin = ADC * Vref / 1024
b) Vin ist kleiner als   Vin = (ADC+1) * Vref  / 1024
c) Vin ist ungefähr      Vin = (ADC+.5) * Vref / 1024

Hiermit ist dann die Frage, warum man nun bei 1 anfangen würde zu
zählen geklärt: Es kommt auf die Betrachtungsweise an.
Jede andere Definition wäre in meinen Augen reichlich unsinnig (oder
habe ich irgendwas übersehen?).

von Andi K. (Gast)


Lesenswert?

@Ratber:
Vielleicht habe ich mich tatsächlich unverständlich ausgedrückt, aber
es war so gemeint.
Um Zwischenwerte zu ermitteln die der ADC eigentlich nicht messen kann,
verfielfache ich die Anzahl der Messungen für ein Messergebnis.
Es ist anscheinend so, das der ADC z. B. eine Spannung von 2,345V mal
als 2,34V und mal als 2,35V misst (nur als Beispiel).
Verdopple ich nun die Messungen und teile sie durch 2 nach dem ich
2,340V und 2,350V gemesse habe, komme ich nun auf 2,345V.
Zumindest klappt das mit den 320 Messungen für einen Temperaturwert
ganz gut um in Schritten von 0.01° zu Messen.
Zeigt mir das LCD z. B. eine Temperatur von 24,23° an dann bleibt es
auch einige Zeit so (Messrate der Temp. ca. 8 mal/Sekunde).
Genau so bei 23.24, 23.25° etc.
Immerhin ergeben sich von einem Messbereich von -20.00° bis 80.00°
10000 Stufen.
Das ganze ist auch ein Software-Trick der davon ausgeht, das
Zwischenwerte z. B. mal mit ADC = 500 oder ADC = 501 gemessen werden.

MfG
Andi

PS: Ich hoffe, ich habe mich dieses mal verständlicher ausgedrückt.

von Jan (Gast)


Lesenswert?

@Andi:
Du erhöhst damit aber nicht die Auflösung der ADC. Du nutzt nur das
vorhandene Rauschen aus, in dem du annimmst, dass du ein um den
tatsächlichen Wert symmetrisch verteiltes rauschen hast.

Hättest du ein ideal stabiles Signal, würde das nicht funktionieren!

von Ratber (Gast)


Lesenswert?

@Jan

Ja die Tabelle ist soweit ok.


Es geht nur darum wie ich den Wert ermittle.

Mit "ADC=(Vin*1024)/Vref" bekommt man immer einen stetigen Fehler von
1.

Ich versuch es mal als Fragen zu definieren.

Welche Spannungswerte schreibt man jeweils den ADC-Werten 0 und 1023 zu
und wie kommt man dahin ?

Als Beispiel meinentwegen 12V für Messbereich und 2 Bit für die
auflösung um es einfacher zu machen.(die 12 läst sich ja auch im Kopf
glatt durch 3 und 4 Teilen).



@Andi

Was du da machst ist keine Auflösungserhöhung sondern nur eine
Mittlewertbildung.
Weil dein Messsignal vermutlich Zyklisch wandert bekommst du eine
scheinbare Auflösungserhöhung die vieleicht sogar in die nähe des
Realen mittelwertes kommt.
Nur ist das absolut keine Garantie für korrete Werte.


Nimm mal an du wandelst 10x die Sekunde und in genau dem gleichen
Rytmus gibt es Spannungsspitzen gleibleibender höhe von sagen wir mal
1.5x Messspannung.
Liegen die Spitzen ausserhalb der Messzeiten dann nimmst du sie nie
war.
Liegen se genau auf dem Messzeitpunkt dann misst du ständig die Spitze
und eine Messspannung die 1.5x über der eighentlichen Spannung liegt.
Also alles sehr Wackelig.


Geh mal davon aus daß das Messignal Genau und Konstant ist dann liefert
dir dein AD-Wandler immer den gleichen wert dessen Mittlewert ebenfalls
diesem Wert entspricht.

Nimm doch einfach mein Beispiel oben mit dem 1-Bit Wandler.
Das sollte es doch klar machen.






So,sollte ich jetzt was durcheinander gebracht haben dann bitte ich das
zu entschuldigen weil ich mich normalerweise nicht gleich 2 Intensiven
diskussionen in einem Topic widme.
Da kommt man schnell durcheinander.

von Andi K. (Gast)


Lesenswert?

Klar, es ist eine Erhöhung der Auflösung des Messergebnisses, nicht des
ADC.
Übrigens hatte ich vorher nicht ca. 8 einzelne ADC-Messungen gemeint,
sondern 8 mal 320 Messungen je Sekunde und Auswertung.
Es könnten 32 Vollmessungen sein, aber wegen 4-Kanal sind es je Kanal
nur 8 was aber völlig ausreicht.
Es wäre mal interessant, ob man eine stabile Spannung aus einem
Labornetzteil mit einem Spannungswert zwischen 2 ADC-Werten mit
Mehrfachmessung ermitteln kann.
Leider habe ich solch ein Labornetzteil nicht.
Jetzt muss ich mir auch mal die AppNotes AVR120 und 121 ansehen.

MfG
Andi

von Jan (Gast)


Lesenswert?

Das kommt darauf an, welche Aussage du treffen willst. Willst du einen
Messwert für die Spannung erhalten, solltest du Variante c) wählen,
also:

Vin = (ADC+.5) * Vref / 2^n

Für 12V und 2bit:

> 00   0   1,5V
> 01   1   4,5V
> 10   2   7,5V
> 11   3   10,5V

Der Messwert 01 entspricht mit gleicher Wahrscheinlichkeit jeder
beliebigen Spannung zwischen 1,5V und 3V, deswegen ist es am
sinnvollsten, den Mittelwert des Intervalls als Messwert anzugeben. Der
absolute Fehler beträgt dann +-1,5V bzw. +- Vref / 2^(n+1)

von Ratber (Gast)


Lesenswert?

@Andi

Dafür brauchst du kein besonders Labornetzteil.

Dazu brauchste nur die auflösung an deinem Controller runtersetzen.

Der AD hat 10 Bit also Teilst du den Ergebniswert einfach durch 256
oder Shiftest den Wert einfach um 8 bit nach Rechts.

Jetzt hast du einen AD-Wandler mit 2 Bit Auflösung.

Die zu messende Spannung stellst du auf einen Wert ein der eben nicht
im Grenzbereich liegt um Fluktuationen zu eliminieren.


Wenn du jetzt beliebige Dauermessungen machst dann wirst du merken das
du mit deiner Methode nie eine Auflösungserhöhung erzielen wirst weil
sich die Schaltschwellen ja nie ändern.


Nur wenn du das Messfenster (Aref und Masse gleichzeitig) um einen
halben Schwellwert verschiebst dann erhöhst du die Auflösung um ein
Bit.

Man kann auch mit einer Spannungslupe arbeiten (Ok,Einen Absatz höher
hab ich das ja schon faktisch angesprochen) aber da erfordert es einen
guten Abgleich sonst bekommt man nur Müll als Ergebnis.


>Klar, es ist eine Erhöhung der Auflösung des Messergebnisses, nicht
>des ADC.

Nein ,da drückste dich immernoch misverständlich aus.
Du Stabilierst nur deinen Messwert durch Aret. Mittlewertbildung um
Störungen auszufiltern.
Das ist das Digitale Gegenstück zum RC-Glied am AD-Eingang.
Oder auf 80er Neudeutsch "Oversampling" :D

Wäre deine Messpannung ideal ohne Störungen dann wäre diese Behandlung
ja nicht nötig.

@Jan

Die Verscheibung des Schwellwertes um den Fakto 0.5 wollten wir doch
ertmal rauslassen um klarer Arbeiten zu können.

Ich möchte gerne zur deiner Formel "ADC=(Vin*4)/12V" (ich habs auf 2
Bit reduziert) gerne die Werte haben.

von Andi K. (Gast)


Lesenswert?

Habe mir gerade die AppNote 121 angeschaut und genau das, was da steht,
habe ich gemacht, nur vielleicht etwas dumm erklärt.
Oversampling heißt das Zauberwort um die Auflösung des Messergebnisses
zu erhöhen.
Siehe hier:
http://www.atmel.com/dyn/resources/prod_documents/doc8003.pdf

MfG
Andi

von Ratber (Gast)


Lesenswert?

>Oversampling heißt das Zauberwort um die Auflösung des Messergebnisses
>zu erhöhen.

Nein du drückstdich leider sehr verkehrt aus.

Du kannst die Drehzahl eines 8 Zylindermotors verdoppeln und denoch
bleibt es ein 8-Zylinder.


Oversamlping ist nur eine Störunterdrückung bzw. Fehlerkorrektur.
Genau das machst du ja die ganze Zeit.

Auflösung ist die erhöhung der Messtufen und das geht so nicht.

von Ratber (Gast)


Lesenswert?

Ergänzung:
Mein letzter Satz war unvollständig.

Sollte heissen das du die Auflösung nicht mit mehrfacher messung
erhöhen kannst.

Es wäre natürlich ein Traum denn man könnte sich die Auflösung bzw. die
Geschwindigkeit beliebig aussuchen aber es funktioniert so nicht.

von Jan (Gast)


Lesenswert?

Ich verschiebe den Schwellwert doch gar nicht. Ich interpretiere nur die
Messdaten des ADC, ohne an der Messung des ADC irgendwas zu verändern.
Meine Werte für 12V / 2bit sind verschieden, je nach dem, welche
Aussage ich treffen will:


00: Der Messwert ist größer als 0V.
    Der Messwert ist kleiner als 3V
    Der Messwert ist ungefähr 1,5V

01: Der Messwert ist größer als 3V.
    Der Messwert ist kleiner als 6V
    Der Messwert ist ungefähr 4,5V

10: Der Messwert ist größer als 6V.
    Der Messwert ist kleiner als 9V
    Der Messwert ist ungefähr 7,5V

11: Der Messwert ist größer als 9V.
    Der Messwert ist kleiner als 12V
    Der Messwert ist ungefähr 10,5V

Diese Aussagen kann man treffen.
Die Werte zur Formel ADC=(Vin*4)/12V sind jeweils die "ist größer
als"-Werte

von Andi K. (Gast)


Lesenswert?

@Ratber:
In meinem obigen Beispiel habe ich 320 Messungen für ein Messergebnis.
Also, Messung mal 32 als Störunterdrückung (auch nachher einfacher in
ASM durch 32 zu teilen) und dann noch  10 für Messstufen  10.
So bekomme ich einen um Faktor 10 höhere Stufung mit Störfilterung
hin.
Oder Spannungsmessung:
4 mal ADC auslesen als Entstörer und dann noch mal 10 für eine 10 mal
höhere Auflösung, also für einen Messwert 40 mal den ADC-Wert addieren,
als Ergebnis in Schritten von 0.5mV.
Ich meine, wenn man schon mit Oversampling misst, dann kann man gleich
per Software die errechnete Auflösung erhöhen, ob das nun wegen
Rauschen ist oder eine Besonderheit des ADC ist wurscht.
Die Temp.-Messung in 0.01° Schritten (-20° - +80°) und die
Spannungsmessung in 1mV Schritten läuft hier einwandfrei.
Probiere einfach mal selbst aus per Oversampling zu messen und dann
nicht durch die Anzahl der Messungen zu teilen, sondern nur durch 2
oder 4.
Bei Spannungsmessung z. B. 40 ADC-Werte addieren (max 40 * 1023 =
40920). Teilst Du das durch 4 erhälst Du Werte in Schritten von 0.488mV
bei max. 5V und Vref = 5V.

Wie schon gesagt, es ist eine Erhöhung der Auflösung des
Messergebnisses in einer Variablen per Software, nicht des ADC.

MfG
Andi

von Ratber (Gast)


Lesenswert?

@Jan

Also dann muß ich mich selber mal Zitieren:

>Ich möchte gerne zur deiner Formel "ADC=(Vin*4)/12V" (ich habs auf
2
>Bit reduziert) gerne die Werte haben.

Warum weichst du aus ?

Nimm doch einfach 1V Schritte dann ist es übersichtlicher und wir sind
gleich an dem Punkt wo ich drauf hinaus will.


 0V    ( 0V*4)/12V = 0
 1V    ( 1V*4)/12V = 0
 2V    ( 2V*4)/12V = 0
 3V    ( 3V*4)/12V = 1
 4V    ( 4V*4)/12V = 1
 5V    ( 5V*4)/12V = 1
 6V    ( 6V*4)/12V = 2
 7V    ( 7V*4)/12V = 2
 8V    ( 8V*4)/12V = 2
 9V    ( 9V*4)/12V = 3
10V    (10V*4)/12V = 3
11V    (11V*4)/12V = 3
12V    (12V*4)/12V = 4

Allein der Wert 4 Zeigt doch schon das die Formel Blödsinn ist denn wie
kann ein Ergebnis 3-Bittig sein wenn der Wandler nurt 2-Bittig ist ?

Bei der Originalformel "ADC=(Vin*1024)/Vref" komme ich bei voller
Spannung auf 1024 und auch das ist ein Wert der nicht 10 sondern
mindestens 11-Bittig ist.

Das macht keinen Sinn.

Der Author des Textes Rechnet mit dem "Ersten" und
"Tausendvieundzwanzigsten" wert aber das ist in meinen augen völlig
unsinnig da ich in jedem Falle auf 0-1023 umrechnen muß damit ich
Praktisch damit arbeiten kann.

Ich kann es mir nur so erklären das Leute die häufig mit Tabellen
arbeiten nur schwer damit zurechtkommen das ein Index bei 0 beginnt und
nicht bei 1.

Vieleicht sollte man es mal auf unser Dezimales System übertragen.

Die erste Ziffer im Dezimalsystem ist nicht die 1 sondern die 0 und die
Zehnte ist nicht die 10 sondern die 9.

Ist also kein Unterschied und rechnet sich auch nicht anders.


@Andi

Du machst es ja schon wieder ?

Dann erklär mir mal was du unter Auflösung verstehst denn ich verstehe
darunter in diesem Zusammenhang "Abstufung".

Was du machst ist ein Mittel zu bilden (Volksmund:Durchschnitt) .



Beide Begriffe sind für meine auffassung gänntlich verschiedene Sachen
die man nicht in einen Topf werfen kann.

Oder hat man in den letzten Jahren die Bedeutungen einiger Wörter so
komplett umngestellt das ich nicht mehr mitkomme ?

von Ratber (Gast)


Lesenswert?

@Andi

Mir läst deine aussage keine Ruhe.

Kann es sein das du von einer ganz anderen Signalerfassung sprichst wie
ich ?
Erfasst du vieleich eine Periodische Signalform wärend ich hier von
einer Gleichspannung rede ?

von Jan (Gast)


Lesenswert?

@Ratber:
Ich bin dir nicht ausgewichen, ich wusste nur nicht, auf was du
hinauswolltest.

Ich muss zugeben, die Formel ist so gesehen nicht ganz vollständig.
Aber es ist auch klar, dass der ADC nicht zwischen 11,9V und 12V
unterscheiden kann. Deswegen liefert er bei 12V genauso eine 11 wie bei
11V.


@Andi:
Die tatsächliche Auflösung wird so natürlich nicht erhöht. Die
effektive Auflösung aber unter Umständen schon. Und zwar genau dann,
wenn das zu messende Signal mit einem normalverteilten Rauschen
überlagert ist.

von Andi K. (Gast)


Lesenswert?

@Ratber: Ich meine schon Messung auf einem Mega16 (ist hier auch
vorhanden) aber nicht EINE ADC-Messung, sondern viele, in meinem Fall
320, Messungen für EIN Messergebnis welche auf eine 24 Bit-Variable
aufaddiert und dann umgerechnet werden.
Das tolle ist ja, das ich gerade 24.50°C angezeigt bekomme (ohne
Wackeln) und nun 24.49° (auch ohne hektisches hin und her).
Kann das dann ein "normalverteilten" Rauschen sein, wenn ein durch
Einzelmessung nicht messbarer Wert durch Oversampling konstant gemessen
wird?
Die AppNote 121 beschreibt ja gerade, wie man mit Oversampling die
Auflösung einer SOFTWARE-Messung, welche aus vielen Einzelmessungen
besteht, die MESSAUFLÖSUNG erhöht.
Habe eigentlich nur dank Hartmut damit angefangen der meines erachtens
auf den richtigen Weg ist.

MfG
Andi

von Ratber (Gast)


Lesenswert?

>Ich muss zugeben, die Formel ist so gesehen nicht ganz vollständig.
>Aber es ist auch klar, dass der ADC nicht zwischen 11,9V und 12V
>unterscheiden kann. Deswegen liefert er bei 12V genauso eine 11 wie
bei
>11V.

Eben,Der Fehler mag bei 10 Bit nur Marginal sein aber er ist da.

Ich hab mir mal den Spaß geleistet eben eine Einfache
Temperaturerfassung auf Basis Kty-81-210 als Spannungsteiler mal mit
1023 und mal mit 1024 zu rechnen (In bezug auf den Widerstand im Teiler
und damit den zu erwartenden Spannungen).
Also eins weniger vom AD-Wert berücksichtigt.

Zum normnalen Fehler von 2° (Ich erwähnte ja das es eine sehr Simple
Schaltung ist) kommen gleich weitere 0,86° hinzu was ja nicht unbedingt
sein muß.

Geht also auch bei 10-bit recht Fix.

von Rinaldo Kraus (Gast)


Lesenswert?

Es scheint mir so, dass ich hier für euch ein sehr interessantes Thema
für euch aufgegriffen habe. Habe den ganzen Nachmittag an einem kleinen
Programm herumgetüftelt, um über den PC über die RS232 meine
Messschaltung und den ADC zu testen. Das hat bisher aber alles nicht so
ganz funktioniert, wie ich mir das vorgestellt habe. Habe auch schon ein
Programm aus der Codesammlung ausprobiert, funktioniert auch nicht (so
ein Makro in Excel um die Spannung zwischen 0 bis 5V zu messen). Hat
von euch einer ein einfaches Programm für den Atmega16 um das
Messeneiner Spannung (0-5V) zu testen, wäre echt ganz große Klasse.

Rinaldo

von Hartmut Gröger (Gast)


Lesenswert?

Hi

Hat sich jemand schon mal Gedanken gemacht, wie er Rinaldo helfen
kann?

MfG HG

von Jan (Gast)


Lesenswert?

@Ratber:
Das ist aber kein Fehler, den man irgendwie per Rechnen berücksichtigen
muss. Es ist einfach so, das ein ADC nur Spannungen messen kann, die
kleiner als Vref sind. Deswegen wird dir ein ADC bei Vref=12V auch für
Vin = 12,3V nur den gleichen Wert liefern wie für 11V, obwohl dieser
Spannung theoretisch 100 entsprechen würde.

von Hartmut Gröger (Gast)


Lesenswert?

Entschuldigung mein AOL hat gesponnen

MfG HG

von Rinaldo Kraus (Gast)


Lesenswert?

@HG:   Danke für die Unterstützung

von Andi K. (Gast)


Lesenswert?

Ich hätte schon was, aber ist nur zur Ausgabe auf ein GLCD als Zahl und
Temp.-Kurve und in ASM, ohne serieller Übertragung.

MfG
Andi

von Ratber (Gast)


Lesenswert?

@Andi

>Die AppNote 121 beschreibt ja gerade, wie man mit Oversampling die
>Auflösung einer SOFTWARE-Messung, welche aus vielen Einzelmessungen
>besteht, die MESSAUFLÖSUNG erhöht.
>Habe eigentlich nur dank Hartmut damit angefangen der meines
erachtens
>auf den richtigen Weg ist.

Was du das in der 2. Stelle hinterm Komma misst ist nur das Rauschen am
AD und keine Temperatur.

Nimm stastt des Fühlers mal einen ordinären Widerstand und beobachte
die Schaltung.
Da wirsste dann auch Zehntelgrade messen.
Wenn du die Schaltung in die nähe einese Fernsehers legst dann
bekommste vieleicht noch mehr "Temperatur" mit der Zeit.

Sorry aber Wenn ich mit einem 3.5-Stelligen Multimeter 100 mal messer
und dann durch 100 Teile dann bekomme ich zwar einen wunderbar
gemittelten Wert aber dein Multimeter bleibt immernoch ein
3.5-Stelliges.

Was in den Appnotes beschrieben wird ist wie man die volle auflösung
bekommen kann indem man den Ganzen Messkreis Kalibriert und
Stabilisiert.
Anschließend möchte man das immer vorhandene Rauschen des Signals
ausnutzen indem man es gezielt erhöhrt um ein weiteres Bit zu
simulieren.

Zitat:

==============================
Normally there will be some noise present during a conversion. The
noise can be
thermal noise, noise from the CPU core, switching of I/O-ports,
variations in the
power supply and others. This noise will in most cases be enough to
make this
method work. In specific cases though, it might be necessary to add
some artificial
noise to the input signal. This method is refereed to as Dithering.
Figure 3-1 (a)
shows the problem of measuring a signal with a voltage value that is
between two
quantization steps. Averaging four samples would not help, since the
same low value
would be the result. It may only help to attenuate signal fluctuation.
Figure 3-1 (b)
shows that by adding some artificial noise to the input signal, the LSB
of the
conversion result will toggle. Adding four of these samples halves the
quantization
steps, producing results that gives better representations of the input
value, as shown
in Figure 3-1 (c). The ADCs ‘virtual resolution’ has increased from 10
to 11-bit. This
method is refereed to as Decimation and will be explained further in
section 3-3.
========================

Also an der tatsächlichen Auflösung des ADCs wird da nicht gerüttelt.




@Jan


Mir ist sehr wohl bewust das der AD an beiden Enden nicht richtig
arbeitet.

Entweder wir bleiben erstmal beim Prinzip oder wir tauchen voll in die
"Realität" ein .
Dann kann ich das Chaos perfekt machen und anführen das die Messungen
mit 10 Bit eh Kappes sind  weil Temperaturdrift und eine Leichte
Nichtlinearität des AD das Ergebnis verfälschen so das man höchstens 9
Bit davon nutzen kann und das auch nur innerhalb gewisser Bedingungen.
Damit wäre die Formel absolut egal.

Also Theorie oder Praxis ?


@Rinaldo

Sorry aber woher sollte ich wissen wie sich das entwickelt ?

von Rinaldo Kraus (Gast)


Lesenswert?

Kann auch direkt ein LCD anstecken, jdoch kein graphisches, das LCD
(40x2) funktioniert, wäre somit eine einfachere Lösung erst einmal, um
die Funktion an sich zu testen. Kann man das auf ein normales LCD
leicht umschreiben? Meine Assembler-fähigkeiten sind jedoch auch im
absoluten Anfangsstadium.

Gruss, Rinaldo

von Andi K. (Gast)


Lesenswert?

@Ratber: Das mit den 24,40° und dann, 2 Sekunden später, 24,49°, kommt
eher durch die Thermik im Raum die sich ständig (minimalst) bewegt und
sollte eigentlich nur die Abstufungsmöglichkeiten bei
Oversampling-Messung darstellen.
Immerhin war jeder der beiden Werte 2 bis 3 Sekunden lang konstannt,
also bei über 15 bis 20 Oversamplingmessungen immer der selbe Wert
ermittelt.
Ich habe ja nie behauptet, das was am ADC gedreht wird, es ist eine
reine Software-Technische Erweiterung der Auflösung.
Aber irgend wie verstehst Du nicht, was ich wie meine.

MfG
Andi

von Ratber (Gast)


Lesenswert?

Ich verstehe schon sehr gut aber was du da misst ist nur das
Samplingrauschen an einem Übergang plus Widerstandsrauschen plus
sonstiges Rauschen.

Auf welche Genauigkeit ist deine Schaltung übrigens ausgelegt ? (Ohne
Extramaßnahmen)

von Jan (Gast)


Lesenswert?

@Ratber
Alles was ich geschriebn habe war Theorie.
Eine 2bit-12V-ADC kann nun mal nur Werte unter 12V messen. Ist der ADC
dann so aufgebaut, wie die in den AVRs, so gibt er für alle Werte, die
größer sind als (2^n-1)/(2^n)*Vref den Maximalwert 11...1 aus.

Vielleicht sollten wir das aber nicht hier in diesem Thread
ausdiskutieren, sondern entweder einen neuen aufmachen, per Mail
kss-abi@onlinehome.de oder ICQ 239641155

von Ratber (Gast)


Lesenswert?

Hoppla,fehlt was.

Was du da ausnutzen willst ist das Rauschen des Fühlers was sich je je
nach Temperatur in die eine oder andere Richtung verschiebt aber wenn
der Fühler derart Rauscht dann muß ich ihn gleich ganz in Frage stellen
was die Genauigkeit angeht.

Sorry aber die Methode ist für mich immernoch ein Taschenspielertrick

von Ratber (Gast)


Lesenswert?

@Jan

Es geht hier nicht um die Praktischenb Grenzen sondern ums
Rechnerische.

Wie ich schon sagte können wir gwerne gleich voll in die Reale Welt
gehen aber dann kann ich den ADCs im AVR nur echte 8 Bit Atestieren und
die Formel verbrennen.

In der Theorie gehe ich immer vom Ideal aus um die Grundlagen zu klären
bevor ich ins Detail gehe.

Schließlich Entwickelt man erst den Rumpf bevor man den Motor einbaut
'-)

von Jan (Gast)


Lesenswert?

@Ratber:
Ein idealer ADC hat aber auch eine unendliche Auflösung und keine
maximal messbare Spannung.
Gehen wir davon aus, dass ein 2bit-12V-ADC auch Spannungen höher 12V
messen kann.
Dann gibt es zwei Möglichkeiten: Er "klaut" sich einfach ein drittes
Bit und stellt 100 da, oder es kommt einfach zu einem Überlauf und das
Messergebnis lautet 00. Alles andere ist völlig unmöglich, sowohl
theoretisch als auch praktisch.

von Hannes L. (hannes)


Lesenswert?

Für "Anfängerstadium" ist diese Aufgabe sicherlich etwas zuviel.

Zerlege doch mal die Aufgabe in kleinere Teile, die (jedes für sich
gesehen) realisierbar sind.

- ADC einschalten und in zeitlichen Abständen messen.
  (Das Datenblatt zeigt, wie das geht)
- Den gemessenen Wert (Binärzahl 0...1023, in 2 Registern liegend),
  auf die gewünschte Größe skalieren, aus 0...1023 soll z.B. 0...5000
  werden (0,000...4,999 oder 5,000). Dazu ist eine Konstante zu
  ermitteln, mit der der eingelesene Wert multipliziert wird. Dabei
  kommt (vorerst) nur Ganzzahl-Arithmetik in Betracht.
- Den skalierten Wert (binär in 2 Registern vorliegend) in ASCII-Text
  (4 Ziffern, evtl. mit Führungsnullen) umwandeln, die man als Mensch
  auch interpretieren kann.
- Vom ASCII-Text die erste Ziffer an das gewünschte Textdarstellungs-
  Gerät ausgeben.
- Ein Dezimaltrennzeichen an das Gerät ausgeben (Punkt oder Komma).
- Die restlichen 3 Ziffern an das Gerät ausgeben.
- Ein Leerzeichen an das Gerät ausgeben.
- Den ASCII-Text für die Maßeinheit an das Gerät ausgeben ("V" oder
  "Volt")
- Ein Unterprogramm (oder eine ganze Sammlung von Routinen)
  schreiben, welche(s) Zugriff auf das Ausgabegerät ermöglicht.
  Dies kann das Aktivieren des USART (siehe Datenblatt) und die
  zeichenweise Ausgabe an den PC (mit Terminalprogramm) sein, oder
  eine Routinensammlung für das LCD (siehe AVR-Tutorial).

Ich nehme mal an, dass es dir nicht um ein "Messgerät" geht, sondern
um das Verstehen der Zusammenhänge. Denn ein Digitalmultimeter, das
bedeutend mehr kann, bekommt man für unter 5 Euro (Bei ALDI gabs die
mal für 3,50 Euro). Wenn es dir also ums Versztehen der Zusammenhänge
geht, dann würde es dir auch nix nützen, wenn dir Andi oder ich ein
passendes Programm in ASM schreiben würden, denn das wäre einfach
zuviel auf einmal, das würdest du nicht auf die Schnelle "verdauen".
Sicherlich könnte dir Ratber auch ein Programm in BASCOM schreiben, das
wären nur wenige Zeilen, also viel bequemer als in ASM, aber ob du damit
das Innenleben und die Funktionsweise eines AVRs kennen lernst, steht
auf einem anderen Blatt.

Aua, jetzt habe ich (leider) wieder eine Lawine ins Rollen gebracht,
nämlich den Glaubenskrieg zwischen den Programmiersprachen. Dies war
nicht meine Absicht, daher: "Duck und schnell wech..."

Übrigens:
- Ich habe nicht behauptet, dass der ADC den Wert 1024 ermitteln
  kann.
- Ich habe keine Lust, darüber zu diskutieren, ob der ADC 1024 oder
  1023 verschiedene Werte ermitteln kann. Es ist nämlich alles eine
  Frage der Betrachtungsweise.
- Ich habe nicht die Absicht, die (mir inzwischen bekannte)
  Fachkompetenz der an dieser Diskussion beteiligten Leute
  anzuzweifeln.

Und nun:
Bit- & Bytebruch...
...HanneS...
(Duck und ganz schnell wech...)

von Ratber (Gast)


Lesenswert?

@Jan

Es geht nicht um die Spannung sondern um die Auflösung und die ist
immer Bauartbedingt.

Ein Flashwandler defineirt sich durch die Zahl der Komparatoren und der
Anzahl der Stufen um die ich sie verstellen kann.

Oder ein Sukzessive-Aproximations-Wandler der ebenfalls durch die
Breite seines SA-Registers begrenzt ist.

Es gibt noch mehr möglichkeiten aber das Spielt keine Rolle.


Der Wandler im AVR ist nunmal bauartbedingt auf 10 Bit begrenzt und da
du ihn ja kaum öffnen und schaltungselemente hinzufügen kannst wird es
auch bei den 10 bit bleiben.

Das einizge was ich an einem AVR noch verändern kann ist das Messignal
um ein halbes Digit zu verschieben um noch weitere Bits zu bekommen.

Demnach kann ich die Auflösung beliebig und unendlich erhöhen.
Aber nur durch häufiges Messen nicht.

Mimm doch einfach den 1-Bit Wandler und versuche dort nur mit messen
einen zwischenwert zu ermitteln.
Das geht nur wenn das Messignal stark genug rauscht und damit ist es
nicht mehr als ausreichend genau einzuordnen.

Ich kann der Methode so oder so keinen ernsthaften Reiz abgewinnen.


@Hannes

Die verwendete Sprache ist doch egal solange richtig umgesetzt wird.
Meinentwegen in Turtlebasic oder Lisp.

Speilt kein Rolle denn die Hardware ist ja immer die gleiche.


>(Duck und ganz schnell wech...)

Warum ?

Ich beiß doch nicht :D

von Hannes L. (hannes)


Lesenswert?

Das Ermitteln eines Mittelwertes erhöht zwar nicht die physikalische
Auflösung des ADC, filtert aber das Rauschen aus, welches bei nicht
optimal layouteten Platinen die unteren 2 Bits "klappern" lässt. In
meinem Fall war die Auflösung von 8 Bits ausreichend.

In folgendem Beispiel geht es aber um die Bildung des Mittelwertes.
Mittelwert über 10, 100 oder auch 32 Messungen halte ich für recht
aufwändig (Rechenzeit). Ich nutze daher gerne die Mittelwertbildung
über 256 Messungen.

Warum? - Weil man den 256ten Teil subtrahieren muss (das muss man nicht
errechnen, da das ja bereits das "untere" Byte ist) und ein 256tel des
Neuwertes addieren muss (man addiert ihn einfach "ein Byte tiefer" und
spart sich alle Schieberei. Es kostet ganze 13 Takte, wenn man davon
ausgeht, dass die Werte im SRAM liegen. Kann man die Werte in Registern
halten, dann geht es noch schneller.

Zum Beispiel:
Das Bit ADCLAR in ADMUX sei gesetzt, um linksbündige Ausgabe zu
erzwingen. Das Auslesen des ADC erfolgt innerhalb einer Timer-ISR, in
der noch andere Aufgaben erledigt werden...

 lds r0,batt1               ;Mittelwert aus SRAM holen
 lds wh,batt0               ;Nachkommastellen auch
 sub wh,r0                  ;1/256 subtrahieren
 sbc r0,null                ;Übertrag auch
 in wl,adch                 ;linksbündiges High-Byte des ADC lesen
 add wh,wl                  ;Neuwert/256 addieren
 adc r0,null                ;Übertrag auch
 sts batt1,r0               ;zurück
 sts batt0,wh               ;ins SRAM

...
(ganz tief duck und ganz langsam weg...)
;-)

von Ratber (Gast)


Lesenswert?

Ja oder "Shift x right 8" :D


PS:

Wenn de dich noch tiefer Duckst dann is aber bald nichts mehr mit
laufen   '-)

von Hannes L. (hannes)


Lesenswert?

> Ich beiß doch nicht :D

Ich weiß...
Inzwischen kenne ich auch deine Art von Humor...
Und ich amüsiere mich köstlich (ohne mich über dich lustig zu machen).

Gruß...
...HanneS...
(langsam und aufrecht verschwindend...)

von Ratber (Gast)


Lesenswert?

yo,jux muß auch mal sein.

So,ich verabschiede mich mal für Heute.

Morgen hab ich leider mal wieder die bucklige Verwandshaft am Hals und
keine Hanfkekse im Haus. :D

von Togger (Gast)


Lesenswert?

Na das wurde ja höchste Zeit, dass sich die Erbsenzähler wieder auf
dieses Thema stürzen (1023/1024 äh oder doch 1025???)

Also für alle Praktiker hab ich mal nachgerechnet:

5V / 1024 = 4,882812... mV

5V / 1023 = 4,887585... mV

Differenz: 0,004773032 mV

Fehler: 0,09775... %

Die Werte habe ich mit meinem Taschenrechner ermittelt und ich erhebe
keine Gewähr, oder doch?

Also bitte zukünftig in AD-Messungen diesen Fehler mitberücksichtigen,
da ja zum Glück die vom AVR gemessenen Spannungen zu 100% genau sind,
das nenn ich HighTech :-)

Unter 0,5V misst der AVR sogar noch genauer, daher unbedingt den
Rechenfehler mitberücksichtigen, sonst messt ihr was total Falsches.

Ich werde auch alle meine Programme in dieser Richtung umschreiben, da
ich leider irrtümlich (aus Fachliteratur etc.) den Wert 1024 übernahm.

Wer jetzt denkt das Thema sei damit erledigt, den muß ich enttäuschen:
es wird spätestens in Wochen wieder irgendwo hier auftauchen...

und es ist mir SCHEISSEGAL :-)

lg Ralf

ps.: hab jetzt Besseres zu tun :-)

von Ratber (Gast)


Lesenswert?

Mahlzeit

Dachte schon die gehen nie.... :D


@Togger

Ja meinentwegen rechne nach "ADC=(Vin*1024)/Vref" mit Ergebnissen von
0 bis 1024 denn 10-bit sind ja 1025 Werte wie sich jeder normale Mensch
an seinen Elf Fingern abzählen kann. :D :D :D

von Jan (Gast)


Lesenswert?

@Ratber

Ja, ich werde weiterhin mit ADC=(Vin*1024)/Vref mit Ergebnissen von 0
bis 1023 für Vin < Vref rechnen.
Alles andere ist nicht praxistauglich und unsinnig. Wer mir etwas
anderes beweisen will und kann, möge das tun. Das war jedenfalls mein
letzter Beitrag zu diesem Thema.

von Ratber (Gast)


Lesenswert?

>Alles andere ist nicht praxistauglich und unsinnig. Wer mir etwas
>anderes beweisen will und kann, möge das tun. Das war jedenfalls mein
>letzter Beitrag zu diesem Thema.


Setz doch einfach mal für Vin die kleinste und die größte Spannung ein
und schau welche Werte du bekommst.

Wer so rechnet der Rechnet auch 1+1=3 ;)



Aber Nur Ignoranten verschließen die Augen anstatt nur einmal
nachzurechnen.

'-)

von Andi K. (Gast)


Lesenswert?

Und ich rechne lieber mit Beispielsweise (64 * ADC addieren (ACHTUNG:
OVERSAMPLING!!!) * (Vin * 1000) / 64468.

Ist doch nun wirklich wurscht wie jeder rechnet solange der jenige den
max. möglichen Wert berechnen kann ohne das es die niedrigeren Stufen
total verfälscht.

MfG
Andi

von Ratber (Gast)


Lesenswert?

Wie kommst du denn auf die "64468" ?

von Andi K. (Gast)


Lesenswert?

Ach neee, immer diese Tippfehler :-(
Meinte natürlich "/ 65468"!

MfG
Andi

von Ratber (Gast)


Lesenswert?

Ja das es ein Tippfehler ist hab ich mir schon gedacht aber mit dieser
Zahl kann ich auch noch nix anfangen egal wie ich rechne.

von Hannes L. (hannes)


Lesenswert?

64K wären z.B 65536...

...

von Andi K. (Gast)


Lesenswert?

Es ist eine Art Verschönerung.
Beispiel:
VinMax = 5V und Vref = 5V.
Liegen 5V an Vin, müßte mir der ADC IMMER den Wert 1023 liefern.
Bei 64 * 1023 ist der maximale Oversampling-Wert 65472.
Dann wäre folgende Berechnung korrekt:

 65472 * 5000 / 65472 = 5000 (zur Anzeige dann 5.000).

Ist aber nur einer von den 64 ADC-Werten 1 weniger (1022), z. B. wegen
Rauschen, dann kommt raus:

 65471 * 5000 / 65472 = 5000 (zur Anzeige dann 4.999)

Also habe ich den Divisor einfach leicht verringert um diesen Misstand
"Auszubügeln":

 65471 * 5000 / 65472 = 5000 (.2291 fällt weg wegen integer)

Dieses Ausbügeln geht in den µV-Bereich und stört kleinere Werte so gut
wie überhaupt nicht.
Es soll ja kein Labormessgerät sein.

Hallo Hannes!

Es tut mir leid, aber ein Oversampling von 64 ADC Werten (64 * 1023)
kann immer noch nicht 65536 ergeben ;-)
Diese Meinung muß ich mit Ratber wirklich teilen.

MfG
Andi

von Andi K. (Gast)


Lesenswert?

Copy->Paste-Fehler :(
Sollte heißen:

 65471 * 5000 / 65472 = 4999 (zur Anzeige dann 4.999)

Ich gibs langsam auf!

MfG
Andi

von Andi K. (Gast)


Lesenswert?

Jetzt gib ichs wirklich auf!
Die dritte Formel sollte heißen

 65471 * 5000 / 65468 = 5000 (.2291 fällt weg wegen integer)

Ich muß ja echt doof aussehen!

MfG
Andi

von Ratber (Gast)


Lesenswert?

>Ist aber nur einer von den 64 ADC-Werten 1 weniger (1022), z. B. wegen
>Rauschen, dann kommt raus:
>
> 65471 * 5000 / 65472 = 5000 (zur Anzeige dann 4.999)
>
>Also habe ich den Divisor einfach leicht verringert um diesen
Misstand
>"Auszubügeln":


??

Höhrt sich schön an und da könnte ich noch folgen aber was machst du
bei 2  oder 3 Fehlwerten ?

Entschuldige aber das sieht mir nicht nach Filterung aus sondern nach
"Übermalen"

Wenn ich einen Wert 64x Messe dann ergibt die Summe durch 64 eben den
Durchschnitt.

Aber selbst wenn ich das alles hinnehme dann komme ich mit der
Differenz von 68 immernoch nicht hin denn abzüglich der 64 bleiben 4
Rest.

Sorry aber dieser Rechnung kann ich nun garnicht folgen.

von Ratber (Gast)


Lesenswert?

Hoppla,ich hab das Trennen der beiden Antworten vergessen.

Ich setz nochmal an:
Moment

von Hannes L. (hannes)


Lesenswert?

Hi Andi...

<Zitat>
Es tut mir leid, aber ein Oversampling von 64 ADC Werten (64 * 1023)
kann immer noch nicht 65536 ergeben ;-)
</Zitat>

Das habe ich auch nie behauptet. Ich habe nur behauptet, dass 64K 65536
entspricht... ;-)

Ein anderer Weg zur Korrektur wäre das Addieren des Wertes zum
Ergebnis, der einen halben Schritt (also 1/2048 des Messbereiches)
entspricht. Das wäre dann korrekte Rundung.

Wenn ich aber den "Streubereich" des ADC bei (mit unkonventionellen
Mitteln) selbst hergestellten Platinen (die alles andere als optimal
sind!) betrachte, dann ist mir der ganze Krams sowiso Wurscht... 8-)

@Ratber:
Besuch macht immer Freude! (Die Einen beim Kommen, die Anderen beim
Gehen...)
Oder: Das Leben ist wie eine Brille, man macht so Allerhand durch...

@Rinaldo:
Du hat nicht auf meinen einzigen konstruktiven Beitrag reagiert:
http://www.mikrocontroller.net/forum/read-1-241240.html#241445
Hast du dein Vorhaben nun aufgegeben oder hast du den Beitrag nur
übersehen?

Beste Grüße und frohen Rest vom Einheitsfest...

...olle HanneS...

von Ratber (Gast)


Lesenswert?

Also nochmal in anlehnung an deine Formel

"(64  ADC addieren  (Vin * 1000) / 64468"

Ich rechne jetzt mal Simultan für 1024 und 1023 also 2^n und 2^n-1 um
es zu verkürzen und nicht allzu unübersichtlich zu gestalten
(Hoffentlich)

64*1023=65472
64*1024=65536

Um, das Mittel zu bekommen muß ich auch wieder durch 64 Teilen (bzw.
einfach um 6 Bit schieben) um den einfachen Schnitt zu erhalten.
Ausreißer fallen damit nur Prozentual ins Gewicht.
Jetzt nurnoch Runden (4/5) und schon habe ich den Schnitt.

Jetzt bleicbt nurnoch die Rechnung 1000/65468 bzw. 1000/65472 übrig die
mit die Kehrwerte also 0.015273704 bzw. 0.015274637 liefert und genau
diese verstehe ich nicht ganz.

Dh. du hast es ja schon angegeben das diese Wert die Korrektur bei
4.999 im Ergebnis ist aber den Sinn verstehe ich nicht.

Hier machst du für einen von 64 Messwerten mit einer abweichung von 1
eine Ausnahme und verläst die abteilung "Oversampling" wegen diesen
einen absichtlichen Eingriff.

Was machst du denn wenn 2 oder 3 der 64 Werte um eins Abweichen oder
einer um mehr als 1 ?

wieder anpassen ?

Also entschuldige wenn ich so direkt bin aber das sieht für mich in der
Tat nach einfacher Verschönerung aus die mit "Berechnung" nichts zu
tun hat.

Jedenfalls sehe ich keine logische notwendigkeit darin.


@Hannes

Ja sicher aber ich seh se dann doch lieber von hinten.
Fressen mir nur die Vorräte weg und verursachen Kopfschmerzen :D :D :D

von Andi K. (Gast)


Lesenswert?

Es hat halt jeder seinen Horizont.
Darüber hinweg zu sehen ist halt nicht immer einfach.

Es ist einfach so:
1. 64 mal ADCH:L auf eine Variable addieren, Name: Oversampling
2. Mit Oversampling folgendes rechnen:
   Spannungswert = Oversampling * 5000 / 65468

Als Spannungswert kommt eine Integer-Zahl raus von 0 bis 5000 welche
auf einem LCD als 0.000V bis 5.000V dargestellt wird und mit der man
auch noch überwachen kann.
Schluss, aus, ende.

Ansonsten wünsch ich auch noch nen schönen Rest vom Einheitsfest.

MfG
Andi

von Ratber (Gast)


Lesenswert?

Aha du rechnest also den ADC-Wert wieder auf die Spanung zurück.
Hättest du das gleich gesagt dann wäre uns viel tipperei erspart
geblieben.

Also Rechnen wir mal.

64*1023 sind 65472  bzw. 65536 bei 1024.

Dann *5000 sind 327'360'000 bzw.  327'680'000

Das ganze dann wieder durch 65468 und für die Darstellung auf dem LCD
mit einem Dezimalpunkt und 3 nachkommastellen versehen ergibt dann
5.000 bzw. 5.005


Komisch,wenn ich 2^n-1 also 1023 Rechne dann komme ich Punktgenau hin
und mit 2^n also 1024 habe ich einen übertrag von 0.005 oder die
besagten rund 0.1% Abweichung.

Das ist der Grund warum ich "ADC=(Vin*2^n-1)/Vref" Rechne '-)

>Als Spannungswert kommt eine Integer-Zahl raus von 0 bis 5000 welche
>auf einem LCD als 0.000V bis 5.000V dargestellt wird und mit der man
>auch noch überwachen kann.
>Schluss, aus, ende.

Yo '-)


>Es hat halt jeder seinen Horizont.
>Darüber hinweg zu sehen ist halt nicht immer einfach

Zustimm '-)



>Ansonsten wünsch ich auch noch nen schönen Rest vom Einheitsfest.

Wünsche ich auch '-)

von Heiko Otto (Gast)


Lesenswert?

@Ratber:


Jetzt muss ich mich doch auch mal meinen Senf dazugegeben.

Es ging um die Formel:

> ADC=(Vin*1024)/Vref

Das steht im Datenblatt, wieso die Formel richtig ist:

0x000 represents ground, and 0x3FF represents the selected reference
voltage minus one LSB.

d.h. 1023 entspricht dem Intervall von [Vref-Vref/1024:Vref)

ich mach das mal für 1 Bit Auflösung (d.h. 2 Werte) und 5V Vref

0: 0V <= Vin < 2,5V
1: 2,5 <= Vin <= 5V

Würde ich wie du es propagierst durch 1 teilen, dann würde man
erhalten

0: 0V <= Vin < 5V
1: 5V

d.h. den letzten Wert verschenkst Du, denn der würde nur bei genau 5V
auftreten.

Dein Problem ist, daß Du immer "andersrum" rechnest, also die Frage
stellst:

Was bekomme ich bei 5V?

Nach Deiner Formel bekommst Du 1, nach der von Atmel aber 2, was Du
natürlich mit 1 Bit nicht darstellen kannst.
Du stellst aber die Frage falsch, denn der ADC gibt nur Intervalle aus.
Und wenn Du in meine erste Tabelle schaust, dann wirst Du sehen das das
letzte Intervall von GENAU 2,5 bis GENAU 5V geht. Rechnerisch (nach der
Formel von Atmel) geht es aber nur von GENAU 2,5 bis <5V, denn GENAU 5V
sind nicht darstellbar. 1 Intervall (entweder das erste oder das
letzte) muss auf GENAU zwei glatten Werten liegen. Im Datenblatt steht,
es wäre das letzte (und zwar in der von mir zitierten Textstelle).

Bei Dir ist das nicht so, daher verschenkst Du ja auch einen Messwert,
denn Du opferst die 1023 für GENAU 5V und nur für GENAU 5V alles was
auch nur 1mV kleiner ist, ist schon 1022.

von Ratber (Gast)


Lesenswert?

Ich will mich hier nicht nochmal wiederholen deswegen rechne doch
einfach mal mit dieser Formel und sag mir wieviele Werte du bekommst.

Das ich meinen Spannungsbereich durch 2^N Teilen muß ist mir schon klar
aber meine Werte erhalte ich nur mit 2^n-1 da ich Binär von 0 bis 2^n-1
Arbeiten kann.

Warum also nicht gleich in die Foirmel einbringen ?

Genauso könnte ich die Formel in Römischen Zahlen darstellen.

von Andi K. (Gast)


Lesenswert?

>0x3FF represents the selected reference voltage minus one LSB.
Auf deutsch heißt das, 0x3FF ist Vref - Vref/1024.
So kann der ADC dann eigentlich keinen ADC-Wert für Vref (höchst
mögliche Spannung) ausgeben.
Angenommen bei 5V wäre der höchst messbare Wert dann wohl doch 4,995V
und nicht 5V.
Unter diesem Gesichtspunkt gehe ich wohl doch von der 1023´ger-Regel
weg.
Durch 1024 bzw. 65536 zu teilen ist sowieso um ein vielfaches
einfacher.
So, jetzt prügel ich mir noch mal den ADC-Teil ein.

MfG
Andi

von Heiko Otto (Gast)


Lesenswert?

Also mal anders: Deine Formel für 2 Bit Auflösung, Vref sei 12V

ADC=(Vin*2^2-1)/Vref

Du sagst "damit bekomme ich bei ADC-Ausgabe '3' raus, daß Vin = 12V
ist". Daraus folgt aber auch, das bei 11,999V der ADC schon '2'
liefert, denn auf irgendeine Methode zu runden musst Du dich schon
festlegen.

Insgesamt folgende Tabelle

12V: 3
11,9999V: 2
11,9V: 2
11V: 2
8V: 2
7,99999V: 1
7,9V: 1
4V: 1
3,99999V: 0
3,9V: 0
0V: 0

Du siehst, du erhälst nur für GENAU 12V deinen letzten möglichen Wert
von "3". Daher Du verschenkst echte Auflösung.

In der von dir selber erstellen Tabelle mit der Atmel Formel sieht das
so aus:

 0V    ( 0V*4)/12V = 0
 1V    ( 1V*4)/12V = 0
 2V    ( 2V*4)/12V = 0
 3V    ( 3V*4)/12V = 1
 4V    ( 4V*4)/12V = 1
 5V    ( 5V*4)/12V = 1
 6V    ( 6V*4)/12V = 2
 7V    ( 7V*4)/12V = 2
 8V    ( 8V*4)/12V = 2
 9V    ( 9V*4)/12V = 3
10V    (10V*4)/12V = 3
11V    (11V*4)/12V = 3
12V    (12V*4)/12V = 3 (nicht 4, sondern als 3 von Atmel definiert)

Du siehst, hier wird nix verschenkt und die Umschalt-Grenzen (da wo der
ADC Wert wechselt) sind sogar woanders!

von Andi K. (Gast)


Lesenswert?

Jetzt noch mal:
Was representiert nun der Wert 0x3FF?
Vref oder Vref-Vref/1024?
Oder anders:
Ist der Wert 0x3FF = Vref oder nur Vref/1024*1023?

MfG
Andi

von Heiko Otto (Gast)


Lesenswert?

0x3FF repräsentiert Vref, aber nur weil es von Atmel so definiert
wurde.

Normalerweise würde er (1023*Vref)/1024 bis KURZ VOR (1024*Vref)/1024
repräsentiern. Es ist aber halt DEFINIERT worden das (1024*Vref)/1024
mit eingeschlossen ist.

Es besteht ein Unterschied zwischen

(1023*Vref)/1024 <= Vin < (1024*Vref)/1024

und

(1023*Vref)/1024 <= Vin <= (1024*Vref)/1024
                         ^ hier ist der Unterschied

von Heiko Otto (Gast)


Lesenswert?

also nochmal, nicht das ich missverstanden werde:

Ihr (jeder der sich angesprochen fühlt ;-)) müsst davon weg einen ADC
Wert als eine exakte Spannung zu interpretierne

so repräsentiert 0x3FF nämlich Vref UND (1023*Vref)/1024. Eben alle
Zahlen die in diesem Intervall (=Bereich) liegen mit EXAKT den beiden
Zahlen als Grenzen.

Bei den anderen Werten z.B. 0x3FE ist das Ende der Grenze NICHT mit
drin (das gibts halt nur beim spezialfall 0x3FF). 0x3FE stellt also die
Zahlen im Bereich von

(1022*Vref)/1024 <= Vin < (1023*Vref)/1024

dar, EXAKT (1023*Vref)/1024 ist also nicht mit drin.

von Jan (Gast)


Lesenswert?

Danke Heiko. Das ist auch genau mein Standpunkt, ich hatte nur keine
Ahnung, wie ich das verständlich formulieren soll.

von Heiko Otto (Gast)


Lesenswert?

Bitte.

Ich hoffe man sieht an den beiden Tabellen besser als an den Aussagen
über die Intervalle, daß Ratbers Formel zwar bei 0V und Vref schöne
Werte liefert (nämlich 0V und Vref - und zwar auf Kosten der
Meßgenauigkeit), aber die Schalt-Grenzen intern ganz woanders liegen.

Ich denke Ratbers Formel ist so attraktiv, weil sie einem scheinbar die
Interpretation der Atmel Formel abnimmt. Rechnerisch kommt ja bei Atmel
immer die untere Grenze des Intervalls (in welchem der Meßwert wirklich
liegt) raus, was natürlich bei 0x3FF erstmal komisch aussieht, da man
hier intuitiv Vref erwartet.

von Andi K. (Gast)


Lesenswert?

Kann man dann zusammenfassend sagen:
1. Die Spannung (Vref) wird, bei 10 Bit, in 1024 Teile zerlegt.
2. 0x000 = GND bis knapp unter 1/1024 Vref
3. 0x3FF = 1023/Vref bis Vref

Bei 0x3FF ist das dann reine Interpretationssache ob man Vref oder
knapp über 1023/1024 Vref darstellt.
Habe ich das richtig verstanden?

Gibt es bei einem Wert 1023 eine Möglichkeit festzustellen, ob es Vref
ist oder knapp über 1023/1024 Vref (Oversampling)?

MfG
Andi

von Ratber (Gast)


Lesenswert?

Ui,ih seid ja noch drann.

Ich hab für Heute schon genug und meld mich morgen nochmal.

Guts Nächtle.

von Oliver Gringel (Gast)


Lesenswert?

Am logischsten wäre die Interpretation:

Vin = [(2*ADC+1)/2^(n+1) +- 1/2^(n+1)] * Vref

D.h. bei dem 10bit ADC entsprich 0x000 = (1/2048 +- 1/2048) * Vref und
0x3FF entspricht (2047/2048 +- 1/2048) * Vref.
Da der ADC nunmal nur Intervalle misst, bekommt man so genau den
mittleren Wert des Intervalls.

Durch Oversampling kann man den Wert dann noch genauer eingrenzen, da
das letzte Bit immer etwas springen wird, das ändert aber nichts an der
Tatsache, dass man immernoch einen Fehler von min. +- 1/2048 * Vref hat.

von Andreas K. (andi_k)


Lesenswert?

@Ratber: Muß mich noch für diese Idee mit Oversampling eine höhere
"Messauflösung" erzielt zu haben entschuldigen. Totaler Quark.
Ich hatte für eine LCD-Beleuchtung über einen 1K-Widerstand an die
Basis eines Leistungstransistors BD243 einen Stromfluß von abwechselnd
0 und ca. 5mA über PWM bei 1243Hz.
Ohne es zu wissen, hatte dieses im AVR ein Spannungsrauschen verursacht
und mich dann mit meiner falschen Meinung bestärkt in Schritten von
0,01° (10000 Stufen) die Temperatur messen zu können.
Nach dem ich den Widerstand durch einen mit 10K gewechselt hatte konnte
man zwar beobachten wie die Temperartur binnen Sekunden von
Beispielsweise 24,11 auf 24,21° ging aber es blieb nie dazwischen
stehen.
Man könnte die 2. Kommastelle vielleicht als steigend oder fallend
interpretieren, solange der NTC sich nicht richtig entscheiden kann,
wie er sich nun einstellt, aber ansonsten Schwachsinn.
Sorry für die unnötigen Posts hier.

MfG
Andi

von Ratber (Gast)


Lesenswert?

Yo,is ja kein Akt.

von Quark (Gast)


Lesenswert?

@Andreas
Spitze von Dir, dass Du das noch aufklärst. Das sollten sich viele als
Beispiel nehmen (bezieht sich auf niemanden aus diesem Thread). Das
kann nicht jeder, einen Irrtum eingestehen.
Super, bleib so.

Grüße

Quark

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.