Forum: Mikrocontroller und Digitale Elektronik BandGap bei m168


von Fritz S. (alterbastler)


Lesenswert?

Hallo AVR-Spezialisten.

Habe einen Atmel 168PA in einer kleinen Aufsteckplatine
(Pollin 810 366 ) und habe bei der Messung von der BandGap -Spannung 
Hausnummern.
u0=ADC0-Kanal ...u7=ADC7-Kanal  BG= BandGap __=Masse  iT= interne 
Tempratur
meine Messwert-Ausgabe sieht so aus. (Zahlen sind alle Hexwerte)
u0=000;u1=000;u2=000;u3=000;u4=000;u5=000;u6=000;u7=000;BG=2DE;__=000;iT 
=143;
hierbei sind alle ADC-Eingänge mittels Draht auf GND gelegt
und die interne Tempratur-Messung reagiert auch auf Erwärmung.
nur die BandGap liefert Hausnummern
ausschnitt aus asm
ldi bb,((1<<REFS1) |(1<<REFS0)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(0<<MUX0) ) 
;; kanal VBG
sts ADMUX,bb
;start der wandlung
ldi bb,(1<<ADEN) |(1<<ADSC) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
sts ADCSRA,bb
go_adcloop:
;warte bis aktuelle wandlung fertig
lds bb,ADCSRA
sbrc bb ,ADSC
rjmp go_adcloop
;und abholen
lds bb,ADCL ;zuerst low
lds akku,ADCH ;dann hi
.........anzeigen der messwerte
Frage: für was ist die Messung von BandGap und Masse gut ??
im Datenblatt
"Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA 
-328-328P_datasheet_Complete.pdf"
auf Seite 238  steht am AD-Mux "BANDGAP REFERENCE" und am Referenz-Mux 
"INTERNAL 1.1V REFERENCE"
Handelt es sich um das gleiche ????
eigentlich müsste doch 0x3ff gemessen werden wie dann bei GND 0x000 
herauskommt?

Nebenbei muss ich noch was loswerden.
Was haben sich die Chip-Designer bei der Adressvergabe gedacht?
Da gibt es im IN/Out-Bereich jede Menge freie (reserviert für was ??) 
Adressen
und sowas wichtiges wie z.Bsp. das ADCSRA -Register muss mit Krücken 
abgefragt werden.
wenn die schon so viel vom M8 verwerfen, so könnte doch eine Umstellung 
etwas besseres liefern.
(oder hatte schon damals Microchip den Daumen drauf ??)
noch was: gibt es eine sinnvolle Verwendung für GPIOR0 GPIOR1 GPIOR2
sind die wirklich frei und benutzbar ??
und was passiert, wenn man reservierte Adressen benützt (beschreibt)

mit freundlichem Gruß
Fritz

von Hannes (Gast)


Lesenswert?

Fritz S. schrieb:
> Frage: für was ist die Messung von BandGap und Masse gut ??

Man kann bei Batteriebetrieb die Bandgap-Spannung z.B. gegen Vcc messen 
und damit Rückschlüsse auf die Batteriespannung ziehen.

> auf Seite 238  steht am AD-Mux "BANDGAP REFERENCE" und am Referenz-Mux
> "INTERNAL 1.1V REFERENCE"
> Handelt es sich um das gleiche ????

Eigentlich ja.

> Was haben sich die Chip-Designer bei der Adressvergabe gedacht?

Das habe ich mich bei Einführung des Mega48 auch gefragt. Da ich die 
Situation aber nicht ändern kann, muss ich es so hinnehmen. Inzwischen 
habe ich mich daran gewöhnt und nutze ganz gerne die kleinen preiswerten 
Mini-Pro-Module mit Mega168 und Mega328.

...

von Fritz S. (alterbastler)


Lesenswert?

Bandgap: eigene Antwort.
Hannes schrieb wegen BG:
     Eigentlich ja.
Und das gab den Anstoß.
Lösung der Bandgap-Messung ist:
Man muss als Referenz AVcc oder externe Referenz in "REFS1 REFS0" 
einstellen.
Dann misst man mit dem Voltmeter die AVref am Pin 20 (32p TQFP Gehäuse)
Nun startet man die ADC-Messung der BG
Berechnungs-Beispiel:
Aref=3.28 Volt
BG gemessener ADC-Wert=0x14d
die interne BG-Spannung ist dann BG = Aref / 1024 * ADC-Wert
hier ist also die BG-Referenz 1.07 V
dieser Wert kann auch bei der interen Tempraturmessung herangezogen 
werden.
als Hinweis noch:
verändert man die Referenz von BG zu AVcc, so geht der Aref-Pin
innerhalb mikroSekunden hoch, verändert man die Referenz von AVcc auf BG
so dauert es über 3 milliSekunden, bis Aref auf 1.1 Volt runterkommt
wenn man dies nicht beachtet, misst man zu kleine Werte!!!
rätselhaft bleibt aber doch die Messung,wenn Referenz und Mux-Kanal
auf BG stehen. Eigentlich müsste doch Vollausschlag 0x3ff herauskommen!!

mit freundlichem Gruß
Fritz

von S. Landolt (Gast)


Lesenswert?

> rätselhaft ... 0x3ff ...
Wie sieht Ihr Programm aus? Springen Sie vielleicht nach Anzeigen der 
Messwerte auf §go_adcloop zurück?

von Hannes (Gast)


Lesenswert?

Fritz S. schrieb:
> Eigentlich müsste doch Vollausschlag 0x3ff herauskommen!!

Wenn ich Dich richtig verstehe, misst Du $2DE und erwartest $3FF.

Kann es sein, dass Du zu schnell nach dem Umschalten der Referenz misst, 
die Referenz also noch gar nicht bei 1,1 V angekommen ist? Versuche es 
doch mal mit einer größeren Verzögerung zwischen Umstellen von ADMUX und 
Starten der Messung.

Zyklische Messungen an mehreren Eingängen mache ich gern nach folgendem 
Schema:

Im RAM ein Array für ADMUX-Werte und Ergebnisse einrichten,
dabei (bei 10-Bit-Messung) 3 mal so viele Bytes benutzen, wie 
Mess-Stellen vorhanden sind. Bei 8-Bit-Messung (ADLAR-Bit gesetzt) die 
zweifache Anzahl, da hier ADCL nicht gebraucht wird. Die Anzahl der 
Mess-Stellen bezeichne ich jetzt mal als "Offset".

Das Array hat also 3 Bereiche, im ersten Bereich stehen die ADMUX-Werte,
im zweiten Bereich die Werte aus ADCL und im dritten Bereich die Werte 
aus ADCH.

Den (ersten) Bereich mit ADMUX-Werten mit Daten füllen (Referenz und 
Messquelle),
Index für Array einrichten (Zähler für Mess-Stelle).
Ersten Wert in ADMUX schreiben,
ADC im Free-Run-Mode starten.

Per Timer-Interrupt, dessen Intervall größer als der Zeitbedarf mehrerer 
Messungen sein muss, also z.B. den für Tastenentprellung benötigten 
Takt, neben der eigentlichen Arbeit noch Folgendes tun:

- Y-Pointer per PUSH sichern, dann auf Array-Basisadresse plus Index 
setzen
- ADCL lesen
- Daten mit STD und Offset ins Array schreiben (Array-Bereich 2)
- ADCH lesen
- Daten mit STD und doppeltem Offset ins Array schreiben (Bereich 3)
- Index erhöhen und zum Ring begrenzen, bei Bedarf ein Flag setzen, dass 
die Mainloop informiert, dass eine komplette Runde gelesen wurde und 
alle Daten neu sind.
- Array ohne Offset lesen (ADMUX-Wert aus Bereich 1 holen)
- Wert in ADMUX schreiben
- Y-Pointer per POP wiederherstellen...

Die Mainloop kann dann das Flag prüfen und wenn es aktiv ist alle 
benötigten Daten aus dem Array lesen und verarbeiten, dabei natürlich 
das Flag wieder löschen, die Daten sind ja gelesen.

Braucht man unterschiedliche "Einschwingzeiten" für ADMUX, so kann man 
die Anzahl der Mess-Stellen erhöhen und die Messung mit der längsten 
Vorbereitungszeit durch identische ADMUX-Einträge mehrfach durchführen 
und nur die letzte Messung auswerten. Das kostet zwar ein paar 
zusätzliche Bytes im Array, spart aber einen weiteren Zähler und 
Rechenzeit im Interrupt.

...

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.