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


von Malte _. (malte) Benutzerseite


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?

von Peter D. (peda)


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

von Malte _. (malte) Benutzerseite


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...

von Peter D. (peda)


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

von DerDan (Gast)


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!

von Matthias Larisch (Gast)


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)

von Kai K. (klaas)


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?

von Matthias Larisch (Gast)


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...

von Kai K. (klaas)


Lesenswert?

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

Ja, hast Recht, ist schon sehr schwammig.

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.