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

Persönliche Seite #853059
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.
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
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
Persönliche Seite #853226
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...
Gast #2933547
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)
Gast #2933964
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...

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