Forum: Mikrocontroller und Digitale Elektronik ATmega1281 & ADC


von Tommy T. (tommy776)


Angehängte Dateien:

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

von Justus S. (jussa)


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...

von jussa (Gast)


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...

von Stefan E. (sternst)


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.

von Justus S. (jussa)


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 ?

von Tommy T. (tommy776)


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?

von Stefan E. (sternst)


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.

von Justus S. (jussa)


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...

von Tommy T. (tommy776)


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?

von Justus S. (jussa)


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

von Justus S. (jussa)


Lesenswert?

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

> result = ADC;

statt

> result = ADCW;

von Johannes M. (johnny-m)


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.

von Justus S. (jussa)


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.

von Tommy T. (tommy776)


Lesenswert?

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

von Justus S. (jussa)


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..

von Johannes M. (johnny-m)


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? ;-)

von Justus S. (jussa)


Lesenswert?

Johannes M. wrote:

> Oder vertippt? ;-)

grmpf2..ja, zu schnell getippt.

von Tommy T. (tommy776)


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.

von Justus S. (jussa)


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.

von Tommy T. (tommy776)


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. :(

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.