Forum: Compiler & IDEs ADC Vref im Programm umschalten


von Andreas (Gast)


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

von Rainer (Gast)


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

von Walter (Gast)


Lesenswert?

Andreas schrieb:
> PORTC |= (1<<PC4) | (1<<PC5);

das würde ich weglassen

und eine Fehlerbeschreibung wäre auch hilfreich

von Andreas (Gast)


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!

von Holger L. (max5v)


Lesenswert?

ADCSRA |= _BV(ADEN); // ADC ausschalten! Setzt ADEN und löscht es nicht.

Erst ADMUX setzen und anschließend ADCSRA.

Datenblatt : "Changing Channel or
Reference Selection" Seite (197) ist recht informativ.

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.