Forum: Mikrocontroller und Digitale Elektronik 8 Bit genauigkeit bei ADC 4&5 Atmega8


von Alex Niemer (Gast)


Lesenswert?

Hallo,

ich verwende die interne Spannungsreferenz (hoffe das es 1,1Volt sind)
zum messen von zwei Spannungen.

Jetzt heißt es das ADC4 und 5 eine Genauigkeit von 8 Bit hätten.
Bedeutet das dass es einen wert zwischen 1 und 256 zurück gibt?
Oder das es bei ADC4 und 5 - wie bei ADC 1 bis 3 1024 sind?
(nur die genauigkeit auf 8 Bit reduziert ist?)

Ich habe in meinen Programm den Spannungswert durch 1024 geteilt.
Was meie Fehler bei der Spannungsmessung nicht wirklich erklärt...

Vielen dank!
Alex

von Karl M. (Gast)


Lesenswert?

Nun es kann so oder so sein.

Hoffe ist hier der falsche Weg.

Alles steht genau in deinem Datenblatt und dein Programm muss sich auf 
dieses Beziehen.

Vielleicht hängst Du es noch an?

von 1000V Dc (Gast)


Lesenswert?

Code?

von Alex Niemer (Gast)


Lesenswert?

Es gibt sogar eine übersetzte Version von der Tu-Chemnitz hier:
https://www-user.tu-chemnitz.de/~heha/viewchm.php/hs/ATmegaX8.chm/24.htm

Ich denke ich sehe mal wieder den Wald vo lauter Bäumen nicht.

Grüße
Alex

von Alex Niemer (Gast)


Lesenswert?

1000V Dc schrieb:
> Code?

Spielt hier, glaube ich, keine Rolle.
Muss nur wissen ob ich die Konstante für den Spannungsteiler durch 1024 
oder 256 teilen muss.

Grüße
Alex

von S. Landolt (Gast)


Lesenswert?

Wenn ich die 'Datasheet Revision History' richtig interpretiere, so gab 
es mal ein Missverständnis, vor langer Zeit:

"Changes from Rev. 2486M-12/03 to Rev. 2486N-09/04" : "4. ADC4 and ADC5 
support 10-bit accuracy. Document updated to reflect this."

Aber die Auflösung war und ist ganz sicher 10-bit.

von leo (Gast)


Lesenswert?

Alex Niemer schrieb:
> ich verwende die interne Spannungsreferenz (hoffe das es 1,1Volt sind)

Nope. Aber die Hoffnung stirbt zuletzt.

> Jetzt heißt es das ADC4 und 5 eine Genauigkeit von 8 Bit hätten.

Aha, heißt es das. Das Datenblatt sagt dazu:

The ADC generates a 10-bit result which is presented in the ADC Data 
Registers, ...
If the result is left adjusted and no more than 8-bit precision is 
required, it is sufficient to read
ADCH. Otherwise, ADCL must be read first, ...

Sh... Datenblatt, TLDR.

leo

von Max M. (jens2001)


Lesenswert?

Alex Niemer schrieb:
> interne Spannungsreferenz (hoffe das es 1,1Volt sind)

RTFM!

Alex Niemer schrieb:
> Jetzt heißt es das ADC4 und 5 eine Genauigkeit von 8 Bit hätten.
> Bedeutet das dass es einen wert zwischen 1 und 256 zurück gibt?
> Oder das es bei ADC4 und 5 - wie bei ADC 1 bis 3 1024 sind?
> (nur die genauigkeit auf 8 Bit reduziert ist?)

RTFM!

von Karl M. (Gast)


Lesenswert?

Alex Niemer schrieb:
> 1000V Dc schrieb:
>> Code?
>
> Spielt hier, glaube ich, keine Rolle.
> Muss nur wissen ob ich die Konstante für den Spannungsteiler durch 1024
> oder 256 teilen muss.
>
> Grüße
> Alex

Hängt leider von den Einstellungen, Setup für den ADC ab.

Da kann man auch noch mehr machen, wie im Interrupt den Wandlungswert 
abholen, nachdem der µC im Sleepmode verbracht hat.

Oder auch unterschiedliche Refernzspannungsquellen auswählen, bzw. 
externe Refernzspannung nutzen.
Mit oder Ohne Kondensator am ARef Anschluss

Auch hier lauern möglicherweise Fehler.

Quelle: 
https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf

ADMUX -- Table 74.  Voltage Reference Selections for ADC
Deine Annahme, ohne Blick ins Datenbatt ist schon mal falsch:

REFS[1,0] = 0b11 Internal 2.56V Voltage Reference with external 
capacitor at AREF pin

ADMUX -- MUX[3:0]: Analog Channel Selection Bits
Hier gibt es auch eine Zeitabhängig für die Kanalumschaltung.

Dann muss vorher noch der passende ADC Prescaler gewählt werden.
ADCSRA -- Bits 2:0 – ADPS2:0: ADC Prescaler Select Bits

Der ADC-Wandler arbeitet immer im 10Bit Modus,

Aber über ADLAR = 0 oder ADLAR = 1 lässt sich die Ausrichtung des 
Ergebnisses ändern.

Man setzt ADLAR = 1 meistens, wenn man nur die obersten 8 Bit 
verwenden möchte.

usw. alles hängt irgendwie zusammen.

von Stefan F. (Gast)


Lesenswert?

Der Atmega8 hat nur einen ADC. ADC4 ist einer von mehreren 
gleichwertigen Eingängen des Multiplexers, der zum ADC führt.

Alle Eingänge haben also gleich viele Bits, und zwar 10 bei der 
Standardeinstellung.

Beitrag #6082903 wurde vom Autor gelöscht.
von Karl M. (Gast)


Lesenswert?

Nur zur Klarstellung:
in 8 Bit kann man die Werte aus der Menge {0,..,255} speichern.

0dec = 0x00hex = 0b00000000
128dec = 0x80hex = 0b10000000

Oder jede beliebige Zahl A:

A = Summe i=0..7 (ai*2^i)
A = a7*2^7 + a6*2^6 + a5*2^5 + ... + a1*2^1 + a0*2^0

die Koeffizienten ai sind dann genau die binäre Representation der Zahl 
A

A = 123dec
A = 0*2^7 + 1*2^6 + 1*2^5 + 1*2^4 + 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0
A = 0b01111011

von S. Landolt (Gast)


Lesenswert?

> ADC4 ist einer von mehreren gleichwertigen Eingängen des Multiplexers

Nicht so ganz:
"Note that ADC input channel 4 uses digital power."
im Gegensatz zu:
"Note that ADC input channel 3 uses analog power."
deshalb wohl diese Korrektur des Datenblattes.

Aber ich denke, alles für Axel Niemer Relevante hat Karl M. übersetzt 
und zusammengefasst.

von Karl M. (Gast)


Lesenswert?

Stefan F. schrieb:
> Alle Eingänge haben also gleich viele Bits, und zwar 10 bei der
> Standardeinstellung.

und zwar immer 10 Bit!
Ob man sie nun verwenden kann, hängt von der Einstellung zur 
ADC-Wandlergeschwindigkeit ab.

Register ADMUX -- Bit 5 – ADLAR: ADC Left Adjust Result

von Paul (Gast)


Lesenswert?

Stefan F. schrieb:
> Der Atmega8 hat nur einen ADC.

Danke.

Warum hat es so lange und so viel rumgeeire gebraucht um diese einfache 
Frage zu beantworten?
Warum posten hier ertman alle möglichen Honks, die garnicht wissen worum 
es geht und erstmal den Code haben wollen und RTFM schreien?

Man ist das Forum schlecht geworden.

von Stefan F. (Gast)


Lesenswert?

Paul schrieb:
> Warum posten hier ertman alle möglichen Honks, die garnicht wissen worum
> es geht und erstmal den Code haben wollen und RTFM schreien?

Ich denke schon, dass sie sich gut auskennen. Sie wollen eine möglichst 
präzise und umfassende Antwort geben, deswegen fragen sie nach.

Halbe Antworten wie meine führen nicht selten zu einem Shitstorm der 
Entrüstung, selbst wenn diese Hälfte genau das ist, was der Fragende 
gerade braucht.

In diesem Fall war die Frage aber auch unklar. Er schrieb

Alex Niemer schrieb:
> Ich habe in meinen Programm den Spannungswert durch 1024 geteilt.
> Was meine Fehler bei der Spannungsmessung nicht wirklich erklärt...

Das Problem wird mit Sicherheit nicht vom ADC selbst ausgelöst, denn der 
hat ja 1024 Stufen. Hier dem Problem etwas weiter auf den Zahn zu fühlen 
ist also durchaus angebracht.

von Karl M. (Gast)


Lesenswert?

Alles gut Stefan F.!

Er hat sicherlich auch noch nicht die Unterteilung des Messwertes in 
Stufen von 1/1024 * VRef "erlebt" und mit den Messungenauigkeiten und 
der -Linearität zu tun gehabt.

@Alex Niemer: Dazu gibt es weitere Application Notes "ADC", die man 
lesen sollte.

Es ist halt kein DMM mit Rin >=10 MΩ und hoher Auflösung != Genauigkeit.

von Alex Niemer (Gast)


Lesenswert?

Hallo,

danke für die hilfe!

Ich habe einen Spannungsteiler für einfach gebaut mit

VCC---==20k==--ADC5--==1,1k==--GND

Da ich dachte die Spannungsreferenz wäre 1,1V hat das ding jetzt 
21,1Volt.
Wenn also am ganzen ding 21,1 Volt abfallen müsste am 1,1kO Teil 1,1V 
abfallen richtig?
Da jetzt nur weniger als 2 1/3 abfallen max. müsste der Wert doch bei 
max. 439/1024stel liegen oder?

Was aber meine Messabweichung von rund 20% bis 30% einfach nicht 
erklärt.

2,57 / 1,1 * 21,1 = 49,29 V

Meine Messabweichung liegt aber nur bei rund -20%

Damit komm ich einfach nicht zurecht.

Grüße
Alex

von Stefan F. (Gast)


Lesenswert?

Ich kann dir nicht folgen. Welche Spannung hast du angelegt und welchen 
Messwer hat der ADC dafür geliefert?

von Karl M. (Gast)


Lesenswert?

Hallo,
noch mal: keiner kennt dein Programm, keiner weiß, wie du es elektrisch 
anstellst, dass dort eine Spannung anliegt
Hast du überhaupt den Eingangswiderstand und die Wandlungsdauer des ADC 
beachtet?

von Wolfgang (Gast)


Lesenswert?

Alex Niemer schrieb:
> Jetzt heißt es das ADC4 und 5 eine Genauigkeit von 8 Bit hätten.
> Bedeutet das dass es einen wert zwischen 1 und 256 zurück gibt?

Der ATmega8 hat nur einen einzigen ADC und der hat 10 Bit (RTFM Fig. 90)
Wie soll eine 8 Bit Wandlungsergebnis übrigens einen Wert von 256 
annehem?
Da scheinen noch ein paar Grundlagen zu fehlen.

von M. K. (sylaina)


Lesenswert?

Alex Niemer schrieb:
> ich verwende die interne Spannungsreferenz (hoffe das es 1,1Volt sind)

Na Hoffen ist hier definitiv der falsche Weg. Wie hast du den Atmega 
denn konfiguriert, Stichwort Sourcecode

Alex Niemer schrieb:
> Ich habe einen Spannungsteiler für einfach gebaut mit

Einen konkreten Schaltplan hast du nicht? Wo also die komplette 
Beschaltung des Atmegas drauf ist? Hast du z.B. auch AVCC angeschlossen 
gemäß Datenblatt?

Aus Erfahrung kann ich dir sagen, dass man mit dem Atmega ohne große 
Anstrengung auf ±(1-3) LSB genau messen kann. Tut er das bei dir nicht 
so stimmt entweder deiner Beschaltung nicht oder dein Programm oder es 
ist eine Kombination aus beiden.

Daher wäre es wichtig:

Wie sieht die konkrete Schaltung aus, die das Problem zeigt?

Wie sieht das konkrete Programm aus, dass das Problem zeigt?

Liefere uns beides und wir können dir auch besser helfen. Vielleicht 
aber fällt dir beim Zusammenstellen dieser Dinge auch selbst der Fehler 
auf.

von Malte (Gast)


Lesenswert?

Auch wenn das jetzt schon fast Korinthenkackerei ist, du musst durch 
1023 und nicht durch 1024 bei einem 10Bit Wandler teilen, denn bei 1024 
Werten ist der Wertebereich 0...1023.

Meiner Erfahrung nach ist die Interne Referenz nicht so sehr genau - und 
Unterschiedlich beim mega8, mega88, oder xmega.

> Wenn also am ganzen ding 21,1 Volt abfallen müsste am 1,1kO Teil 1,1V
> abfallen richtig?
Ja. 21.1V/(21.1KOhm)*1.1KOhm = 1.1V.

2.7V/1023 = 0.002639V/digit

1.1V/(0.002639V/digit) = ~416 als erwarteter ADC Wert.

von Malte (Gast)


Lesenswert?

Korrektur:
2.56V/1023 = 0.002502V/digit

1.1V/(0.002502V/digit) = ~439 als erwarteter ADC Wert.

Zur Genauigkeit hatte ich mir das mal für ein Projekt durchgerechnet, 
bei dem ein Temperatursensur mit einem Widerstand an 5V Vcc hing:
1
/*The bandgap voltage allows measuring the temperature with a higher resolution,
2
  unfornutately, the 2.56V reference is not so precise, no exact rage is given
3
  in the datasheet. Simly assume 2.4 to 2.6V.
4
  So we measure Vcc with +5V and the bandgap voltage
5
  and determine the bandgap voltage to have a correct scaling value.
6
  Vcc can be in the range 4.9V to 5.1V.
7
  So the scaling can be in the range
8
  2.6V/4.9V = 140/490 = 0.531
9
  2.4V/5.1V = 115/510 = 0.470
10
*/

von Karl M. (Gast)


Lesenswert?

Malte schrieb:
> Auch wenn das jetzt schon fast Korinthenkackerei ist, du musst
> durch 1023 und nicht durch 1024 bei einem 10Bit Wandler teilen, denn bei
> 1024 Werten ist der Wertebereich 0...1023

Nein, laut Datenblatt, s.o., ist der Teiler 1024!

von Axel S. (a-za-z0-9)


Lesenswert?

Alex Niemer schrieb:
> ich verwende die interne Spannungsreferenz (hoffe das es 1,1Volt sind)

Nicht beim ATMega8.

> Jetzt heißt es das ADC4 und 5 eine Genauigkeit von 8 Bit hätten.

Ein ATMega8 hat nur einen ADC. Und dessen Auflösung (nicht: 
Genauigkeit) ist 10 Bit. ADC4 und ADC5 sind Bezeichnungen für µC-Pins, 
die man per Analogmultiplexer mit dem (einen) ADC verbinden kann.

> Bedeutet das dass es einen wert zwischen 1 und 256 zurück gibt?

Daß was einen solchen Wert zurückgibt? Wie sprichst du den ADC an? Wir 
kennen ja noch nicht mal die Programmiersprache, die du benutzt. Aber 
ja, es gibt Programmiersprachen und auch Frameworks, die den Zugriff auf 
den ADC kapseln. Mag gut sein, daß die auch den Wertebereich auf 8 Bit 
verkürzen. Also: was genau machst du da?


Alex Niemer schrieb:
> 1000V Dc schrieb:
>> Code?
>
> Spielt hier, glaube ich, keine Rolle.

Falsch. Das ist das einzig wichtige an dieser Stelle.

von Rolf M. (rmagnus)


Lesenswert?

Malte schrieb:
> Auch wenn das jetzt schon fast Korinthenkackerei ist, du musst durch
> 1023 und nicht durch 1024 bei einem 10Bit Wandler teilen, denn bei 1024
> Werten ist der Wertebereich 0...1023.

Jedes mal wieder, wenn es um den ADC geht, kommt diese Behauptung. Der 
ADC hat 1024 Schritte, daher muss man durch 1024 teilen. Auf den ersten 
Blick bedeutet das, dass man den Maximalwert nicht erreichen kann, da 
man nur auf 1023/1024 kommt. Das liegt daran, dass jeder ADC-Wert nicht 
einer exakten Spannung, sondern einem Spannungsbereich entspricht und 
die Berechnung sich auf die untere Grenze dieses Bereichs bezieht. Man 
müsste eigentlich noch ein halbes Bit dazuaddieren, um auf die Mitte 
dieses Bereichs zu kommen.
Ein Wert von 0 heißt nicht, dass die Spannung 0V ist, sondern dass sie 
zwischen 0V und 1/1024*Vref liegt. Der Wert 1023 bedeutet, dass die 
Spannung zwischen 1023/1024*Vref und Vref liegt.

: Bearbeitet durch User
von Malte (Gast)


Lesenswert?

Rolf M. schrieb:
> Ein Wert von 0 heißt nicht, dass die Spannung 0V ist, sondern dass sie
> zwischen 0V und 1/1024*Vref liegt. Der Wert 1023 bedeutet, dass die
> Spannung zwischen 1023/1024*Vref und Vref liegt.

Ok, ja ich habe mir mal einen Thread dazu durchgelesen:
Beitrag "Re: 1023 oder 1024"
Der Beitrag zeigt die Vor-und Nachteile recht gut.
Wieder was gelernt :)

von Gerhard (Gast)


Lesenswert?

Wenn der ADC bei den Atmegas(zumindest bei ATMEGA328P gemessen) genau 
sein soll, ist auf die Entkopplung der Versorgungsspannungsanschlüsse zu 
achten.
Siehe:

Beitrag "Re: Arduino Nano / ATMEGA328P interne 1,1 V Referenz nicht stabil"

Ist übrigens ein Mangel bei allen Arduino-Breakout-Boards die ich kenne.

Gerhard

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.