AVR: Bandgap Spannung messen ist von anderen ADC Eingängen abhängig?

OP Persönliche Seite #853059
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.
1
ISR(ADC_vect) {
2
u08 cycle_l = cycle;    //local variable improves speed
3
if (cycle_l <= 128) {
4
  if (cycle_l & 1) {    //odd -> lower sum has been converted
5
    lowersum_cnt += ADCW;
6
    ADMUX = (1<< REFS0) | UPPER_PIN; //upper voltage comes next
7
  } else {      //even -> upper sum has been converted
8
    uppersum_cnt += ADCW;
9
    if (cycle_l != 128) {
10
      ADMUX = (1<< REFS0) | LOWER_PIN; //lower voltage comes next
11
     } else
12
      ADMUX = (1<< REFS0) | BANDGAP_PIN; //measure internal vcc
13
  //if (cycle_l == 128) {
14
    
15
  } 
16
} else {
17
  cycle_l = 0;
18
  lowersum_raw = lowersum_cnt;
19
  lowersum_cnt = 0;
20
  uppersum_raw = uppersum_cnt;
21
  uppersum_cnt = 0;
22
  bandgap_raw = ADCW;
23
  ADMUX = (1<< REFS0) | LOWER_PIN;
24
  updated = 1;
25
}
26
ADCSRA |= (1<<ADSC);    //start conversion
27
cycle_l++;      //number of started conversion
28
cycle = cycle_l;    //write back local variable
29
}
ist die Interrupt Routine.

Ansonsten:
Intitialisierung:
1
//A/D converter with a prescaler of 64
2
//resulting in a frequency of 125KHZ (at F_CPU = 8MHZ)
3
ADCSRA = (1 << ADEN) | (1<< ADIE) | (0x06); //enable with prescaler
4
ADMUX = (1<< REFS0) | LOWER_PIN;  //set to lower pin
5
cycle = 1;        //first conversion will be started
6
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?
#853068
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
OP Persönliche Seite #853226
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...
#854272
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
Gast #862630
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!
Gast #2933547
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)
Gast #2933964
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...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.