Forum: Mikrocontroller und Digitale Elektronik ADC + ATMEGA8 + Spannung messen


von Elko (Gast)


Lesenswert?

Hallo Leute,

ich wollte mal fragen, ob mir jemand bei einer Verständnisfrage helfen 
kann. Also ich würde gerne mit dem Adc des Mega8 eine Spannung einlesen. 
Nun bin ich beim Durchabreiten diverser Beiträge über dieses Zitat 
gestolpert, welcher laut Datenblatt auch korrekt ist.
>"Es muss grundsätzlich immer das ADCH ausgelesen werden! Steht auch im
>Datenblatt. Abgesehen davon, dass es sinnfrei ist, nur das Low-Byte
>auszuwerten, wird das Ergebnisregister erst wieder freigegeben, wenn
>ADCH gelesen wurde. Wird nur ADCL gelesen, dann kann der ADC keinen
>neuen Wert im Ergebnisregister ablegen. Ist klar, dass Du immer den
>selben Wert ausliest. Wenn Du nur 8 Bit Auflösung brauchst, dann setze
>ADLAR und lies nur das High-Byte aus. Dann gibts auch keine Probleme."

Nun zu meiner Frage: Gilt diese Aussage für 2 8bit Variablen (uint8_t), 
wo ich die Register einzeln auslesen muss?
Wenn ich den ADC-Wert mit ADCW auslese und in eine 16bit Variable 
(uint16_t) ablege, sollte das doch auch ohne die oben genannte Aktion 
klappen, oder? Wäre für jeden Tip sehr dankbar...
schönes WE
Elko

von Puppetmaster (Gast)


Lesenswert?

Versuchs mal hier:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#16-Bit_Portregister_.28ADC.2C_ICR1.2C_OCR1.2C_TCNT1.2C_UBRR.29

und hier:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29

Da steht eigendlich alles drinn was man darüber wissen musss und wie man 
es anspricht/ausliest.

Grüße Puppetmaster

von Roman K. (Gast)


Lesenswert?

uint16_t Analog;

Analog = ADC;

der Code sollte ausreichen.

Wenn du es komplizierter, aber vielleicht verständlicher haben willst.
Dieser Code ist meines Wissens nach gleichwertig:

uint16_t Analog;

Analog = ADCL;
Analog += (ADCH<<8);

Ich hoffe das hat deine Frage geklärt, wenn du nur 8-Bit brauchst weiss 
ich gerade auch nicht wie man das macht.

ich kann mir vorstellen, dass das so geht:

uint16_t Analog16;
uint8_t Analog8;

Analog16 = ADC; //10-bit Analogwert in 16bit Variablen speichern
Analog8 = (Analog16>>2); //den 10-bit Wert um zwei Stellen nach rechts
                         //schieben, danach ist es ein 8-bit Wert

Bin mir nicht sicher ob das geht, da uint16_t und uint8_t evtl. 
inkompatibel ist.

von Johannes M. (johnny-m)


Lesenswert?

Elko wrote:
> Nun zu meiner Frage: Gilt diese Aussage für 2 8bit Variablen (uint8_t),
> wo ich die Register einzeln auslesen muss?
Ich verstehe nicht ganz, was Du genau machen willst. Die Reihenfolge des 
Auslesens der Register muss grundsätzlich eingehalten werden. Wenn Du 
den ADC-Wert nicht als 16-Bit-Wert auslesen willst, sondern die beiden 
Ergebnis-Teilregister einzeln weiterverarbeiten willst, dann muss 
trotzdem erst ADCL in eine entsprechende 8-Bit-Variable geladen werden 
und dann ADCH.

> Wenn ich den ADC-Wert mit ADCW auslese und in eine 16bit Variable
> (uint16_t) ablege, sollte das doch auch ohne die oben genannte Aktion
> klappen, oder?
Wenn Du ADCW benutzt, dann übernimmt der Compiler die Sache mit der 
Reihenfolge. Wenn man nicht die volle Auflösung benötigt, sondern eben 
nur maximal 8 Bit, dann kann man durch Setzen von ADLAR dafür sorgen, 
dass das Ergebnis linksbündig abgelegt wird und die 8 MSB im ADCH 
stehen. Dann genügt es, nur ADCH auszulesen.

von Elko (Gast)


Lesenswert?

Vielen Dank für die Antworten.
Das war halt eine Verständnisfrage, die jetzt so langsam aufleuchtet. 
Allerdings habe ich nun das Problem, den ADCWert auf einem Display 
auszugeben. Werd mich heut mal bissl in die thematik einarbeiten. Zur 
Zeit gibt mein Display nur wirre zahlen aus, ich denke dass die 
Konvertierung des ADC soweit ok ist, ich habe Werte von 0-1024 (mit LEDs 
und IF abfragen geprüft. Wenn ich allerdings die Zahl auf dem Display 
ausgeben will, dann kommen Zahlen von ca 360 bis 570 raus. Ich denke, 
dass ich noch ein Wurm bei der Displaydarstellung habe.

Danke nochmal und Schönen Sonntag
Elko

von Elko (Gast)


Lesenswert?

0-1023

von Elko (Gast)


Lesenswert?

Hallo lieben user,

also das mit der LCD anzeige funktioniert jetzt auch soweit. Ich kann 
mir eine Spannung von 0-5.5 über den ADWandler in 0-1023 schritte 
einteilen. Allerdings habe ich nun das Problem, dass ich laut 
Umrechnungsformel U=Vref*adwert/1024 mit Vref 2.56V und einem ADwert von 
1023 eine Spannung anliegen habe von ca 2.56V. Gemessen sind es jedoch 
5.5? Wenn ich für Vref die 5.5V in die Formel einsetze, passt der Wert. 
Was läuft da schief? Ich habe durch setzen der bits die interne 
Referenzspannung ausgewählt. Oder wieder ein denkfehler? Vorteiler ist 
auf 8 gesetzt. (Mega8 3.6Mhz)

Würd mich über eine kleine Hilfe sehr freuen

MFG Elko

von J. K. (rooot)


Lesenswert?

Die Referenzspannung gibt die höchst mögliche Spannung an die du messen 
kanst. wenn du jetzt Aref=2,56V hast kanst du nicht 5,5V messen!

von spess53 (Gast)


Lesenswert?

Hi

Wenn die Eingangsspannung den Wert der Referenzspannung überschreitet 
gibt der ADC 1023 aus. In deinem Fall gehört ein Spannungsteiler vor den 
ADC.

MfG Spess

von Falk B. (falk)


Lesenswert?


von Elko (Gast)


Lesenswert?

Danke an alle,

das mit dem Spannungsteiler habe ich zwar noch nicht getan, weil ich 
dachte dass ich bis 5V locker anlegen kann, aber werd mich gleich 
dranstzen. Nur ich messe tatsächlich am ADC erst bei 5.5V die 1023 und 
nicht bei 2.56 weil da ist der adcwert rund die hälfte. Das verwundert 
mich ein wenig.
ADMUX = (1<<REFS1) | (1<<REFS0) |(1<<MUX2)|(1<<MUX0) ist hier vielleicht 
mein Wurm?

Besten Dank
Elko

von spess53 (Gast)


Lesenswert?

Hi

>Das verwundert mich ein wenig.

Mich ehrlich gesagt auch. Deine Initialisierung sieht OK aus. Hast du 
mal die Referenzspannung am VREF-Pin gemessen?

MfG Spess

von Elko (Gast)


Lesenswert?

@spess: eine sehr gute idee... verwunderlicherweise 5.5V an avcc und 
aref... aber warum???
kennt da jemand eine antwort zu???

gruss elko

von spess53 (Gast)


Lesenswert?

Hi

Ich kenne deine Hardware nicht. Entweder wird AREF irgendwo auf VCC 
gelegt (nicht gut für die interne Referenz) oder deine Initialisierung 
wird nicht ausgeführt (->Simulator).

MfG Spess

von Elko (Gast)


Lesenswert?

simulator keine ahung :-(
ist ein myavr-usb board. will eigentlich nur eine 12V spannung mittels 
poti regeln und mit dem adc messen. Ist das so überhaupt möglich?
mfg Elko

von spess53 (Gast)


Lesenswert?

Hi

Ich kenne die myavr-Umgebung nicht. Sieh mal in der Hilfe nach.

MfG Spess

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.