www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega1281 & ADC


Autor: Tommy Tacker (tommy776)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Ich nutze einen ATmega1281 und möchte mit dem Analog-Digital Converter 
meine  Batteriespannung überwachen.Aus anderen Beiträgen hab ich schon 
erfahren,dass ich dazu AVCC als interne Referenz nehmen muss und V(BG) 
als Input Channel.
Mir stellt nun nur die Frage ob dies bei meinem Controller überhaupt 
geht,da im Datenblatt des ATmega1281 S.291 zum ADCSRB-Register und 
dessen Bit MUX5 steht:

"This bit is not valid for ATmega1281/2561." ???

Ich habe mal das Programmierbeispiel aus dem Tutorial zum ADC genommen 
und mit meinen benötigten Einstellungen umgeändert.
An Vcc des Controllers habe ich Spannungen von 2V, 2,5V und 3V 
angelegt.Dabei waren die erhaltenen Werte im ADCH-Register bei 2,5V Vcc 
größer als bei 2V und auch 3V.
Das verwirrt mich ein wenig.

Gruß,Tommy

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich finde im Datenblatt nichts über ein "VBG"...was soll das sein?

> Mir stellt nun nur die Frage ob dies bei meinem Controller überhaupt
> geht,da im Datenblatt des ATmega1281 S.291 zum ADCSRB-Register und
> dessen Bit MUX5 steht:

der 1281 hat nur 8 Input Pins, darum braucht du MUX5 doch gar nicht...

Autor: jussa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
komisch, ploetzlich findet der Reader doch was wegen VBG...

aber warum willst du die bandgap voltage den messen? du willst sie doch 
nur als Referenz nehmen...

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jussa wrote:

> aber warum willst du die bandgap voltage den messen? du willst sie doch
> nur als Referenz nehmen...

AVCC als Referenz + V(BG) messen = Versorgungsspannung des µC messen 
ohne zusätzliche externe Beschaltung.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
grmpf..sorry, war ein Zuordnungsfehler meinerseits...irgendwie kam das 
bei mir so an, dass er die Bandgap sowohl als Referenz als auch als 
Messeingang benutzen will...

wobei immer noch die Frage offen bleibt, was er mit MUX5 will, das 
braucht man ja nur zur Auswahl von Kanälen > 7...

aber nochmal in Datenblatt geschaut:

> An Vcc des Controllers habe ich Spannungen von 2V, 2,5V und 3V

der braucht doch mindestens 2,7V ?

Autor: Tommy Tacker (tommy776)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Justus Skorps:

VBG steht z.B. auf Seite 283 "ADC Voltage Reference", oder im 
Blockdiagramm Figure 26-1 links unten.

Falls das wirklich nicht geht mit VBG, welche Möglichkeit habe ich da 
noch mit Hilfe des ADC die Batteriespannung zu überwachen?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tommy Tacker wrote:

> Falls das wirklich nicht geht mit VBG

Warum sollte es nicht gehen? Du brauchst doch MUX5 für V(BG) als 
Messquelle gar nicht.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tommy Tacker wrote:

> VBG steht z.B. auf Seite 283 "ADC Voltage Reference", oder im
> Blockdiagramm Figure 26-1 links unten.

habs inzwischen auch gefunden...nur als ich VBG beim ersten Mal vom 
Reader im Datenblatt hab suchen lassen, hat er es nicht gefunden, erst 
BG hat was geliefert...

Autor: Tommy Tacker (tommy776)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ich weiss das ich das MUX5 nicht brauch,aber meine Frage ist vor 
allem auch, warum mir mir das ADCH nach meinem Programmcode so komische 
Werte ausgibt?

Dezimal ausgegeben liegen die Werte für 2,5V Vcc höher (zwischen 103 und 
112) als bei 2,0V (94 bis 97) und 3,0V (70 bis 71)???Die Wertespanne ist 
zu klein in Relation zu den unterschiedlichen Spannungswerten an Vcc?!

Oder habe ich irgendwelche Einstellungen vergessen?

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da das wohl untergangen ist:

mit Vcc < 2,7V bist du außerhalb der Sperifikation für den ATmega1281, 
da wundert es mich nicht, wenn da Quark rauskommt

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wobei mir jetzt noch was auffällt: in deinem Code machst du den Dummy 
Readout mit

> result = ADC;

statt

> result = ADCW;

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

Bewertung
0 lesenswert
nicht lesenswert
Justus Skorps wrote:
> wobei mir jetzt noch was auffällt: in deinem Code machst du den Dummy
> Readout mit
>
>> result = ADC;
>
> statt
>
>> result = ADCW;
Das ist auch völlig wurscht. ADC und ADCW sind identisch. ADCW gibt es 
nur deshalb, weil die Header auch für Assembler geeignet sein sollen und 
es in Assembler den Befehl adc gibt, der hier kollidieren würde.

Eigentlich ist es in C-Programmen sinnvoll, immer ADC zu verwenden, da 
das dem üblichen Schema für 16-Bit-Register entspricht. Es heißt ja 
schließlich auch nicht TCNT1W, oder?

Allerdings hast Du in einer Hinsicht völlig Recht: Man sollte sich 
zumindest innerhalb eines Projektes für eine der beiden 
Möglichkeiten entscheiden...

Siehe übrigens auch AVR 16-Bit-Register. Da habe ich unlängst mal 
den ganzen Kram zusammengefasst.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:

> Das ist auch völlig wurscht. ADC und ADCW sind identisch.

ah ok, ich benutze halt nur immer ADCW bzw ADCWH/L und habs bis jetzt 
auch nur immer so gesehen.

Autor: Tommy Tacker (tommy776)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
soweit ich das im Tutorial gelesen habe ist es controllerabhängig ob man 
ADC oder ADCW schreibt und bei mir trifft ersteres zu.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tommy Tacker wrote:
> soweit ich das im Tutorial gelesen habe ist es controllerabhängig ob man
> ADC oder ADCW schreibt und bei mir trifft ersteres zu.

nein, wie johnny-m schon geschrieben hat ist das wurscht. Schau mal in 
deine contoller Datei von deinem GCC oder was du sonst benutzt..

und vor allem benutzt du beim Abfragen der nicht-dummy Werte dann eh 
ADCW..

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

Bewertung
0 lesenswert
nicht lesenswert
Justus Skorps wrote:
> ah ok, ich benutze halt nur immer ADCW bzw ADCWH/L und habs bis jetzt
> auch nur immer so gesehen.
Und bei ADCWH/L meckert der Compiler nicht?

Oder vertippt? ;-)

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:

> Oder vertippt? ;-)

grmpf2..ja, zu schnell getippt.

Autor: Tommy Tacker (tommy776)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Justus Skorps wrote:

>mit Vcc < 2,7V bist du außerhalb der Sperifikation für den ATmega1281,
>da wundert es mich nicht, wenn da Quark rauskommt.

Ja das hast du recht.Ich merke das bei meinen Messungen. Da ich mit 
ADC´s bisher noch nicht viel gemacht habe,kannst du mir das erklären,was 
da im Manual des ATmega1281 mit "0 - Vcc ADC Differential ADC Voltage 
Range" gemeint ist?

Mein Vorhaben ist es halt,dass bei einem bestimmten ADC-Wert etwas 
ausgelöst wird.Um das für mich zu testen leuchtet dann halt z.B. eine 
LED.

Kann ich das realisieren,dass die LED erst ab einem Wert unter 2,7V 
leuchtet?
z.B. 2,1V??

Danke für eure bisherigen Antworten.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube, du hast da ein anderes Problem: Deine Grenze für die 
Batteriespannung darf nicht kleiner als 2,7V sein, da dort dein µC nicht 
mehr richtig funktionieren wird. Spannungen kleiner als 2,7V lassen sich 
natürlich trotzdem messen, solange es sich dabei nicht um die 
Versorgungsspannung handelt. Solange Vcc > 2,7V ist, sollte auch ein 
ursprüngliches Konzept funktionieren, also V_BG gegen Vcc messen, um so 
einen Absolutwert zu erhalten.

Autor: Tommy Tacker (tommy776)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Deine Grenze für die Batteriespannung darf nicht kleiner als 2,7V sein, da >dort 
dein µC nicht mehr richtig funktionieren wird.

mit Grenze meinst duch sicherlich den Spannungsabfall der Batterie,oder?

Naja,ich teste das gerade mit einem Spannungsversorgungsgerät.Ich gehe 
mit der Spannungs in 0,01V-Schritten von 3V abwärts und schaue mir die 
entsprechenden Werte in ADC-Register an. Bereits bei ca. 2,80V stehen im 
ADC auch Werte,die ich manchmal bei 2,72V erhalte.
Allerdings soll die LED erst leuchten,wenn die minimale Grenze (also 
nahe 2,7V) erreicht ist. Durch die schwankenden Werte im ADC ist das 
nicht gerade verlässlich das dies funktioniert. :(

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.