AVR Versorgungsspannung messen mit ADC

Gast #1970775
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
Persönliche Seite #1970835
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
Gast #1970845
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...
Gast #1970856
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.
#1970867
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.
Persönliche Seite #1970880
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
#1970898
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
Gast #1970948
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.
(Firma: TravelRec.) Persönliche Seite #1971032
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.
#2923414
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren