mikrocontroller.net

Forum: Analoge Elektronik und Schaltungstechnik AVR: Bandgap Spannung messen ist von anderen ADC Eingängen abhängig?


Autor: Malte __ (malte) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich messe in einer Interrupt Routine zwei ADC Eingänge und die interne 
1,23V Referenz. Allerdings scheinen die Werte der Referenz von den ADC 
Eingängen beeinflusst zu werden. Was nicht sein kann. Es wird 64x 
abwechselnd erst ein und dann der andere ADC Pin und zum Abschluss 
einmalig die Referenz gemessen.
ISR(ADC_vect) {
u08 cycle_l = cycle;    //local variable improves speed
if (cycle_l <= 128) {
  if (cycle_l & 1) {    //odd -> lower sum has been converted
    lowersum_cnt += ADCW;
    ADMUX = (1<< REFS0) | UPPER_PIN; //upper voltage comes next
  } else {      //even -> upper sum has been converted
    uppersum_cnt += ADCW;
    if (cycle_l != 128) {
      ADMUX = (1<< REFS0) | LOWER_PIN; //lower voltage comes next
     } else
      ADMUX = (1<< REFS0) | BANDGAP_PIN; //measure internal vcc
  //if (cycle_l == 128) {
    
  } 
} else {
  cycle_l = 0;
  lowersum_raw = lowersum_cnt;
  lowersum_cnt = 0;
  uppersum_raw = uppersum_cnt;
  uppersum_cnt = 0;
  bandgap_raw = ADCW;
  ADMUX = (1<< REFS0) | LOWER_PIN;
  updated = 1;
}
ADCSRA |= (1<<ADSC);    //start conversion
cycle_l++;      //number of started conversion
cycle = cycle_l;    //write back local variable
}
ist die Interrupt Routine.

Ansonsten:
Intitialisierung:
//A/D converter with a prescaler of 64
//resulting in a frequency of 125KHZ (at F_CPU = 8MHZ)
ADCSRA = (1 << ADEN) | (1<< ADIE) | (0x06); //enable with prescaler
ADMUX = (1<< REFS0) | LOWER_PIN;  //set to lower pin
cycle = 1;        //first conversion will be started
ADCSRA |= (1<<ADSC);      //start first conversion
Konstanten:
#define UPPER_PIN 1
#define LOWER_PIN 0
#define BANDGAP_PIN 0x0e

lowersum und uppersum sind wunderbar, nur die Referenz macht Probleme, 
sprich ist von den anderen Werten Abhängig. Der AVR ist ein ATMEGA168. 
Ich messe die Referenz um damit festzustellen ob die Betriebsspannung im 
ordentlichem Bereich (> 4,7V) liegt. Alle notwendigen Variablen sind 
natürlich volatile.

Hat jemand Ideen?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Malte __ wrote:
> Hallo,
> ich messe in einer Interrupt Routine zwei ADC Eingänge und die interne
> 1,23V Referenz. Allerdings scheinen die Werte der Referenz von den ADC
> Eingängen beeinflusst zu werden.

Ich hab mich schon gewundert, warum das nur bei mir so ist und nirgends 
was dazu steht.

Der Bandgap-Eingang ist wohl extrem hochohmig.
Ich habe mal an einen Eingang VCC angelegt und dann zwischen beiden 
umgeschaltet.
VCC stimmte ab der ersten Messung (1023), aber die Bandgap sank nur 
langsam ab. Erst ab der 5.Messung stimmte der Wert.

Zur Sicherheit schmeiße ich jetzt die ersten 8 Messungen weg, wenn der 
Eingang die Bandgap ist.

Ich muß die Bandgap messen, um eine Unterspannung zu erkennen und dann 
Daten im EEPROM zu speichern, bevor der 2,7V Brownout zuschlägt.


Peter

Autor: Malte __ (malte) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger wrote:
> Ich hab mich schon gewundert, warum das nur bei mir so ist und nirgends
> was dazu steht.
>
> Der Bandgap-Eingang ist wohl extrem hochohmig.
> Ich habe mal an einen Eingang VCC angelegt und dann zwischen beiden
> umgeschaltet.
> VCC stimmte ab der ersten Messung (1023), aber die Bandgap sank nur
> langsam ab. Erst ab der 5.Messung stimmte der Wert.
>
> Zur Sicherheit schmeiße ich jetzt die ersten 8 Messungen weg, wenn der
> Eingang die Bandgap ist.
Danke für die Bestätigung, mit der 8. Messung ändert sich in der Tat 
kaum noch was.
Außerdem ist mir aufgefallen dass ich als Bandgap Spannung noch die 
1,23V des Mega8 annahm, der Mega168 hier aber 1,0-1,2V (mit 1,1V 
typisch) hat. Mein Exemplar liegt wohl an der unteren Grenze mit ~1,02V.

Hätte Atmel die Hochohmiggkeit ins Errata geschrieben, hätte ich nur den 
Halben und nicht den ganzen Vormittag im Quellcode Fehler gesucht...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier nochmal die Meßwerte:


228
228
228
228
Channel: 1
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
1014
Channel: 12
774
350
264
229
229
229
229
228
228
228
228
228
228
228
228
228
228
228
228
228


Peter

Autor: DerDan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stand genau vor dem gleichen Problem,

Bandgap ist von anderen Eingängen abhängig, mann muss dann den Bandgap 
oft genug nacheinander messen und schon gehts.

Vielen Dank für diesen Beitrag!

Autor: Matthias Larisch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry fürs Thread hochholen, aber genau das hat mich gestern abend 2 
Stunden und eben eine weitere gekostet... Wäre doch mal was fürs 
Tutorial auf dieser Seite oder so... Bei meinem 3,3V Mega328P hier 
brauche ich mindestens 8 Messungen, um ein stabiles Signal zu bekommen 
(16 MHz, ADC /128, Messung wird manuell im Interrupt getriggert, wenn 
vorherige fertig)

Autor: Kai Klaas (klaas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Sorry fürs Thread hochholen, aber genau das hat mich gestern abend 2
>Stunden und eben eine weitere gekostet...

Steht da nicht im Datenblatt was dazu beim ATMEGA328?

Autor: Matthias Larisch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kai Klaas schrieb:
> Steht da nicht im Datenblatt was dazu beim ATMEGA328?

"When the bandgap reference voltage is used as input to the ADC, it will 
take a certain time for the voltage to stabi-
lize. If not stabilized, the first value read after the first conversion 
may be wrong."

Habe ich gerade entdeckt... Sehr genaue Angabe :) Hab ich wohl vorher 
auch überlesen...

Autor: Kai Klaas (klaas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Habe ich gerade entdeckt... Sehr genaue Angabe :) Hab ich wohl vorher
>auch überlesen...

Ja, hast Recht, ist schon sehr schwammig.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.