ADC Vref im Programm umschalten

Gast #4015093
Lesenswert?

Hallo zusammen,

ich möchte mit meinem ADC zwei verschiedene Eingangssignale erfassen. 
Hierzu wäre es sinnvoll, die Referenzspannung des ADC's umzuschalten 
(von 5V auf 2,56V).

Leider funktioniert es nicht.
Könnt Ihr mir sagen, wo der Knoten in meinem Hirn ist?

 - Prozessor ist ein Mega 8
 - AVR Studio 6
 - Benutzt werden ADC 4 (5V) und ADC 5 (2,56V)
 - Wenn der 5V - Kanal auskommentiert wird, funktioniert der 2,56V Kanal
 - habe heute schon einiges probiert, daher ist der code etwas 
"verwuchert"



Hier die ADC - Funktion:
1
#include <avr/io.h>
2

3
// Eingänge für ADC initialisieren
4

5
void adc_init ()
6
{
7
  DDRC &= ~((1<<PC4) | (1<<PC5));
8
  PORTC |= (1<<PC4) | (1<<PC5);
9
}
10

11

12
//  ##################   ADC Routine    #############################
13

14
int adc (int ch)
15
{
16
  int i=0;
17
  int res =0;
18
  int z=0;
19
  int filter = 4;  // digitaler Filter
20
  
21
  // Activate ADC with Prescaler 16 --> 1Mhz/16 = 62.5kHz  => Bremst Ablauf aus!!!
22
  ADCSRA = _BV(ADEN) | _BV(ADPS2);
23
  
24
  // Register auf 0 setzen ???
25
  ADMUX = 0x00;
26
  
27
  if (ch==4)
28
  {
29
    ADMUX = ch;
30
    ADMUX |= (1<<REFS0);    // interne Referenzspannung
31
    ADMUX &= ~(1<<REFS1);  // Referenzspannung 5V
32
  }
33
  
34
  if (ch==5)
35
  {
36
    ADMUX = ch;
37
    ADMUX |= (1<<REFS0);    // interne Referenzspannung
38
    ADMUX |= (1<<REFS1);  // Referenzspannung 2,56V
39
  }
40
  
41
  // ADC einmal ausführen und warmlaufen lassen
42
  //Start conversion
43
  ADCSRA |= _BV(ADSC);
44
  // wait until converstion completed
45
  while (ADCSRA & _BV(ADSC) ) {}
46
    
47
  res = 0;  // Summierung auf 0 setzten  
48
  
49
  for (z=0;z<filter;z++)
50
  {
51
    
52
    //Start conversion
53
    ADCSRA |= _BV(ADSC);
54
    
55
    // wait until converstion completed
56
    while (ADCSRA & _BV(ADSC) ) {}
57
  
58
    // get converted value
59
    i = ADCW;
60
    res = res + i;
61
  }
62
  i = (res /filter);
63
  //i=500; // Angabe zum Betrieb ohne Poti
64
  ADCSRA |= _BV(ADEN); // ADC ausschalten!
65
  return i;
66
}

Danke!!!!

Andreas
Gast #4015120
Lesenswert?

Hi,
messe mal die Aref Spannung am µC beim Wechsel der 
Referenzspannungsquelle. Du wirst sehen, dass sie eine gewisse Zeit 
benötigt um sich einzustellen, auch bedingt durch den Kondensator, den 
Du ja wahrscheinlich an Aref angeschlossen hast. Diese Wartezeit must Du 
beachten, dann wird es funktionieren.
Viele Grüße,
Rainer
Gast #4015150
Lesenswert?

Hallo Rainer,

ja, das klingt logisch. Daran hatte ich im Eifer des Gefechts nicht 
gedacht, dass der Kondensator umgeladen werden muss.
Die Physik gilt halt immer noch...

Für mein Vorhaben werde ich dann mit der geringeren Genauigkeit von Vref 
= 5 V Leben müssen. Sonst muss ich meinen Code zu stark ausbremsen.

Danke für die Antwort!

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