Forum: Mikrocontroller und Digitale Elektronik ATMEGA328P: Messung VBG per ADC


von Harald (Gast)


Lesenswert?

Hallo zusammen,

ich brauche eine Info von euch: An einem ATMEGA328P nutze ich den ADC 
(AVCC = 5V, AREF über Kondensator mit Masse verbunden). Das Ganze 
funktioniert auch wie gewünscht. Jetzt habe ich im Datenblatt die 
Möglichkeit gesehen, über den ADC-Kanal 14 auch die interne VBG (1.1V) 
zu messen. Den ADC habe ich jetzt auch entsprechend konfiguriert, 
bekomme aber für diesen Kanal keinen stabilen Messwert heraus, sondern 
ein Rauschen von ca. 0,2-0,5V.
Im Datenblatt habe ich keinen Hinweis darauf gefunden, dass der Kanal im 
Betrieb mit externer AVCC nicht verfügbar wäre. Könnt ihr mir sagen, ob 
das grundsätzlich möglich ist?

Grüße
Harald
1
ADMUX  = (1 << ADLAR);    // Left adjust result
2
ADMUX  |= 0x0E;            // Select channel VBG
3
ADMUX  |= (1 << REFS0);   // AVCC with external capacitor at AREF pin
4
ADCSRA |= (1 << ADSC);    // Start Conversion

von Stefan F. (Gast)


Lesenswert?

Du musst nach dem Einschalten des ADC 70µs warten, bis die Bandgap 
Referenz stabilisiert ist.

Du hast AREF als externe Referenzquelle gewählt. Da musst du dann auch 
eine Spannung >1.1V anlegen, sonst kann das nicht funktionieren.

von Gerhard (Gast)


Lesenswert?

und Du musst den ADC auch einschalten!
1
 ADCSRA= 1<<ADEN|1<<ADSC|0<<ADATE|0<<ADIF|0<<ADIE|0<<ADPS2|1<<ADPS1|1<<ADPS0;

ADPSn an clk anpassen.

Gerhard

von Sebastian W. (wangnick)


Lesenswert?

Harald schrieb:
> Den ADC habe ich jetzt auch entsprechend konfiguriert,
> bekomme aber für diesen Kanal keinen stabilen Messwert heraus, sondern
> ein Rauschen von ca. 0,2-0,5V.

Wenn du über REFS die Spannungsreferenz des ADC änderst dann wird der 
Kondensator an AREF auf die neue Spannungsreferenz umgeladen. Das kann 
je nach Größe des AREF-Kondensators und Innenwiderstand der 
Spannungsreferenz ein wenig dauern.

Stefan ⛄ F. schrieb:
> Du hast AREF als externe Referenzquelle gewählt. Da musst du dann auch
> eine Spannung >1.1V anlegen, sonst kann das nicht funktionieren.

Stefan, REFS0 wird gesetzt, die gewählte Referenz ist also AVCC, nicht 
AREF.

LG, Sebastian

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Stefan, REFS0 wird gesetzt, die gewählte Referenz ist
> also AVCC, nicht AREF.

Ja stimmt.

von Peter D. (peda)


Lesenswert?

Die internen 1,1V sind sehr hochohmig beim Messen.
Du mußt den MUX setzen und dann erst 16 Dummy-Messungen machen oder die 
gleiche Zeit abwarten.

https://www.avrfreaks.net/forum/avrs-measure-their-own-vcc-do-it-badly

von Harald (Gast)


Lesenswert?

Hi,

der ADC läuft zyklisch über mehreren Kanäle. Die Initialisierung 
passiert natürlich im Programm, das hatte ich euch nur im Eingangspost 
unterschlagen.
1
  ADCSRA = (1 << ADEN)   // ADC Enable
2
         | (1 << ADSC)   // Start Conversion
3
     | (0 << ADATE)  // Free running mode
4
     | (1 << ADIE)   // Enable Interrupt
5
     | (1 << ADPS2) 
6
     | (1 << ADPS1) 
7
     | (0 << ADPS0); // Prescaler 64 (ADC-Freq 125kHz)

Stefan ⛄ F. schrieb:
> Du musst nach dem Einschalten des ADC 70µs warten, bis die Bandgap
> Referenz stabilisiert ist.

Die 70us muss ich nur nach dem initialen Einschalten abwarten, danach 
sollte die VGB doch eingeschwungen sein. Oder?

Peter D. schrieb:
> Die internen 1,1V sind sehr hochohmig beim Messen.
> Du mußt den MUX setzen und dann erst 16 Dummy-Messungen machen oder die
> gleiche Zeit abwarten.
>
> https://www.avrfreaks.net/forum/avrs-measure-their-own-vcc-do-it-badly

Ah, vielen Dank für den Link. Das was Steve hier beschreibt trifft auch 
meine Anwendung: Die grobe Kontrolle der 5V AVCC durch die interne 
Referenz. Ich teste morgen mal, ob ich mit den Dummy-Messungen ins Ziel 
komme. Ist irgendwie eine Frickelei, aber wenn's am Ende hilft... :)

Grüße
Harald

von Stefan F. (Gast)


Lesenswert?

Harald schrieb:
> Die 70us muss ich nur nach dem initialen Einschalten abwarten, danach
> sollte die VGB doch eingeschwungen sein. Oder?

Ich denke Ja

von Hermann W. (hermannw)


Lesenswert?

Ich habe auch gerade mit Vref=Vcc die Bandgab-Messung bei Tiny 85 
gemacht, um Vcc zu messen. Ich bekomme sehr stabile Messwerte, aber nur 
wenn ich mich an das Datenblatt halte und beim Umschalten der Kanäle ein 
paar ms warte. Im Datenblatt steht in der MUX-Tabelle als Fußnote, dass 
eine Wartezeit von 1ms erforderlich ist.
also: Mux setzen, warten, dann erst Messung und zurück das gleiche.
Ich habe allerdings im M328-Datenblatt in der MUX-Tabelle diesen Hinweis 
nicht gefunden. Vielleicht steht es wo anders. Ich würde zum Test diese 
Wartezeit probieren.

von Hermann W. (hermannw)


Lesenswert?

Noch ein Hinweis: man darf keine hohe Auflösung für die Vcc-Messung 
erwarten. Hier mal die Abschätzung der Auflösung mit Daumenwerten: 
Vcc=5V ergibt eine Auflösung von ca. 5mV/Roh. Ein Rohwert der 
Vbg-Messung muß man ca. mit 5 multiplizieren, um die Vcc-Auflösung zu 
erhalten. Das ergibt eine Vcc-Auflösung von 20mV. Oder genau nach der 
Formel Vcc/1024=Vbg/Roh --> Vcc=Vbg*1024/Roh. Und dann kommt hinzu, dass 
Vbg von Vcc abhängt. Ich kalibriere immer bei der Vcc, bei der ich genau 
sein will. Bei LiIon-Akku-Versorgung mache ich 2 Kalibrierungen: für 
4,2V und 3V.

von Hermann W. (hermannw)


Lesenswert?

Ich habe jetzt mal die Vbg-Messung auch beim M328 durchgeführt. Die 
erforderliche Wartezeit war noch viel höher.
Der Test für stabile Messung:
- von Vref=1,1V auf Vref=Vcc umgeschaltet
- Dummy-Messung mit Mux=8
- Wartezeit 8ms!! (bei <7ms starke Schwankungen)
- richtige Messung mit Mux=8
Beim Rückweg Vref von 1,1V auf Vcc war die Wartezeit nicht notwendig, es 
reichte die Dummy-Messung. Das liegt wohl daran, dass Vbg sehr hochohmig 
ist und Vcc natürlich nicht.
Seltsamerweise unterscheiden sich die Prozessoren erheblich:
Eine Nachmessung mit gleichem Testverfahren ergab bei T861, T84 und T85, 
dass eine Dummy-Messung ohne Wartezeit in beiden Richtungen reicht. 
Alles ist nur jeweils mit einem Exemplar gemessen.

von Einer K. (Gast)


Lesenswert?

Hermann W. schrieb:
> - Wartezeit 8ms!!
Ganz normal, wenn man an ARef einen 100nF Kondensator montiert hat.

von Hermann W. (hermannw)


Lesenswert?

Ja, richtig. Da bin ich gar nicht drauf gekommen. Vref=1,1V erfordert an 
Aref einen Kondensator (anders als z.B. beim T861). Und der wird 
Umschalten erst geladen.
Danke.

von Stefan F. (Gast)


Lesenswert?

Ich finde immer gut und wichtig, die Erkenntnisse aus solchen Versuchen 
zu berichten.

von Peter D. (peda)


Lesenswert?

Hermann W. schrieb:
> Vref=1,1V erfordert an
> Aref einen Kondensator

Erforderlich ist er nicht. Er kann was bringen, muß aber nicht.
Ich hatte mal bei einem Atmega8 nachträglich den ADC benötigt, d.h. der 
AREF-Pin war unbeschaltet. Die ADC-Messungen waren auch so stabil.

von H.Joachim S. (crazyhorse)


Angehängte Dateien:

Lesenswert?

Ich nehm i.a. 10nF an ARef.
Jetzt hatte ich gerade mit dem Tiny841 zu tun und brauchte den Pin 
anderweitig. Man kann alle internen Referenzspannungen auf den Pin legen 
oden eben auch nicht. Für die 2,2V habe ich es kurz untersucht - mit 
externem Kondensator ist es nur minimal besser.

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.