Forum: Mikrocontroller und Digitale Elektronik AVR Versorgungsspannung messen mit ADC


von jimbo (Gast)


Lesenswert?

hi
ich habe folgendes problem....
ich betreibe den atmega324p mit ca. 3.3V Batteriespannung....
nun möchte ich mit diesem controller mit dem adc beliebige 
spannungswerte z.b. von sensoren messen...

da diese werte jedoch über 2.54 volt liegen muss ich eine externe 
referenzspannung verwenden.
da ich beim benutzen einer dieser externen referenzspannung genau diesen 
wert ja zur umrechnung benötige (also ADCW*AREF / 1024 oder?), und die 
batteriespannung mit der zeit ja kleiner wird kann ich nie einen genauen 
messwert erzeugen... nun wollte ich fragen, obs eine möglichkeit gibt, 
den aref wert ebenfalls zu messen und diesen wert dann für die 
umrechnung zu benutzen?

mfg

von aglavi (Gast)


Lesenswert?

Du könntest natürlich auch die 3.3V per Spannungteiler runterschrauben 
und nachher zurückrechnen..

von Thomas E. (thomase)


Lesenswert?

Wenn du deine Aref gegen sich selber misst, ist dein Messwert immer 
1023.

Du brauchst einen Spannungsteiler. Dann kannst du auch die interne 
Referenzspannung verwenden.

mfg.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

jimbo schrieb:

> ich betreibe den atmega324p mit ca. 3.3V Batteriespannung....
> nun möchte ich mit diesem controller mit dem adc beliebige
> spannungswerte z.b. von sensoren messen...
>
> da diese werte jedoch über 2.54 volt liegen muss ich eine externe
> referenzspannung verwenden.

Wieso?

Kann der atmega324p nicht wie andere AVR auch die Vcc intern auf AREF 
schalten?

Bei anderen AVR kann man auch die bekannte, intere Bandgap-Referenz (< 
Vcc) gegen AREF (interne Vcc) messen und damit zurückrechnen wie groß 
Vcc ist.

Beim Atmega8 hatte ich das nach Anregung aus dem Forum mal gemacht:
http://www.mikrocontroller.net/articles/Pollin_Funk-AVR-Evaluationsboard#Die_Versorgung_muss_stimmen

von jimbo (Gast)


Lesenswert?

ja aber müsst ich so dann nicht jeden weiteren eingang des adc wieder 
mit einem spannungsteiler beschalten? weil ich kann ja aufgrund der 
beschaltung nicht einfach einmal die interene vref benutzen udn dann 
wieder die externe oder? wegen dem buffer bzw. glättungskondensator am 
vref gegen masse...

von usuru (Gast)


Lesenswert?

Wenn eine interne Referenz nicht zur Verfügung steht oder nicht genau 
genug ist, verbindet man den VREF-Eingang mit der Versorgungsspannung 
und misst dann an einem Analog-Eingang des µC eine externe Referenz, die 
gibt es hochgenau z.B. um 1.2 / 1.25 Volt herum (z.B. 
http://www.maxim-ic.com/products/references/). Wenn ich nun eine 
bekannte Spannung mit dem ADC messe, kann ich auf die Spannung am 
VREF-Eingang der ja mit der Versorungsspannung verbunden ist, 
zurückrechnen, das funktioniert herunter bis zur Spannung der externen 
Referenz.

Weiterer Vorteil: keine Messfehler durch Spannungsteiler.

von Peter R. (pnu)


Lesenswert?

mit VCC als Referenzspannung die interne Referenzspannung messen, indem 
aref mit einem analogeingang verbunden wird.(Puffer-C nicht vergessen). 
Das Verhältnis Messwert durch 1023 entspricht dann doch Aref durch VCC.

Mit diesem Faktor können, auch bei langsam absinkendem VCC die an den 
anderen Eingängen gewonnenen Messergebnisse korrigiert werden. Der 
Korrekturfaktor wandert natürlich mit dem sich ändernden VCC.

Da brauchts keinen einzigen Spannungsteiler, solange im Inbtervall 
0..VCC gemessen wird.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Peter R. schrieb:

> mit VCC als Referenzspannung die interne Referenzspannung messen, indem
> aref mit einem analogeingang verbunden wird.(Puffer-C nicht vergessen).

Bei manchen AVR z.B. Atmega8 in meinem Versuch kann exakt diese 
Verbindung intern im Chip ein- und ausgeschaltet werden. Durch die 
Konfigurationsregister des ADC. Näheres im Datenblatt.

> Das Verhältnis Messwert durch 1023 entspricht dann doch Aref durch VCC.

1024

von Peter R. (pnu)


Lesenswert?

Das interne Umschalten ist da nicht so gut.

Aref sollte einegeschaltet sein, sodass am Puffer-C-Anschluss die 
interne Referenzspannung ständig ansteht. Intern bleibt aber ständig die 
Verbindung AD-Wandler zu Vcc erhalten. Mit VCC als "Ref" wird dann 
gemessen. Es werden nur die Analog-Eingänge umgeschaltet.

Also 1. Schritt Aref am zugehörigen Eingang messen. entsprechenden 
Korrekturfaktor ermitteln und speichern.
2. auf Eingang X umschalten, messen, mit Korrekturfaktor echte Spannung 
an Eingang X errechnen.

Vorgerechnet mit : VCC = 3,4V  , Aref 2,48V

AD misst zuerst die 2,48V, mit 3,4V als "Referenz". Ergebnis N = 747.

Man weiß also, das 2,48V an einem Eingang N = 747 erzeugen.

Am anderen Eingang ist das Messergebnis z.B.800

Dann ist U = ( 800 / 747 ) *2,48 V = 2,66V

von ulrich (Gast)


Lesenswert?

Man kann über den MUX intern die Bandgap Referenz (ca. 1.1 V) messen. 
Dafür braucht man die Ref. Spannungnicht umschalten. Es ist also egal ob 
man AREF fest extern auf VCC verdrahtet, oder einen Kondensator an AREF 
hat, und intern AVcc an ARef legt.

Die Messung der Bandgap Ref. gibt dann  1.1 V / Vcc * 1023.


Die einzige Schwierigkeit ist das die Bandgap Ref. eventuell einige Zeit 
braucht um stabil zu werden. Etwas Zeit sollte man also für die Messung 
einplanen - man sollte ohnehin besser mehrfach (z.B. 8 mal) messen, weil 
man mit den 1,1 V nur einen Teil des Wertebereichs ausnutzt.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

ulrich schrieb:
> Die einzige Schwierigkeit ist das die Bandgap Ref. eventuell einige Zeit
> braucht um stabil zu werden.

Größer 70µs.

ulrich schrieb:
> Etwas Zeit sollte man also für die Messung
> einplanen

Maximal mit 100kHz Abtastrate messen.

ulrich schrieb:
> man sollte ohnehin besser mehrfach (z.B. 8 mal) messen,

Muss man nicht, 1x reicht.

von jimbo (Gast)


Lesenswert?

ok hab das jetzt mit der bandgap spannung gemacht und es funktioniert 
sehr gut. mit nur einmal messen kommt man schon auf 2 kommastellen genau 
hin...

danke auf jedenfall

von Torsten B. (torty)


Lesenswert?

Hallo Gemeinde
Ich habe eine Frage zu dem QuellCode aus:
http://www.mikrocontroller.net/articles/Pollin_Funk-AVR-Evaluationsboard#Die_Versorgung_muss_stimmen

Warum muss bei der Mittelwertberechnung so gerechnet werden ?

  return (adcval + NUM_MESS_ADC/2)/NUM_MESS_ADC;

Ich würde verstehen, dass der aufsummierte Wert in adcval durch die 
Anzahl der Messungen dividiert wird.
Warum wird zu der Summe der Messwerte auch noch die halbe Anzahl der 
Messungen addiert ?

return (adcval ???+ NUM_MESS_ADC/2???)/NUM_MESS_ADC;

Grüße
Torsten

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.