mikrocontroller.net

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


Autor: Elko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Puppetmaster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mal hier:

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

und hier:

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

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

Grüße Puppetmaster

Autor: Roman K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Elko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Elko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0-1023

Autor: Elko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: J. K. (rooot)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Elko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Elko (Gast)
Datum:

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

gruss elko

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Elko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.