Forum: Mikrocontroller und Digitale Elektronik Zwei ADC Messungen gleiches Ergebnis ATMega1280


von Bene J. (terfagter)


Lesenswert?

Hallo zusammen,

Ich möchte mit meinem ATMEGA1280 zwei Spannungen an zwei verschiedenen 
ADC-Eingängen messen. Ich erhalte aber immer das gleiche Ergebnis. Immer 
die Spannung des ersten.
Als erstes Initialisiere ich den ADC:
1
void adcinit(void)
2
{
3
  uint16_t result;
4
  
5
  ADMUX |= (1<<REFS0);                // AVCC als Referenzspannung nutzen
6
  ADCSRA = (1<<ADPS1) | (1<<ADPS2);         // Frequenzvorteiler 64
7
  ADCSRA |= (1<<ADEN);                    // ADC aktivieren
8
  
9
  ADCSRA |= (1<<ADSC);                     // eine ADC-Wandlung 
10
  while (ADCSRA & (1<<ADSC) ) {}           // auf Abschluss der Konvertierung warten
11
  
12
  result = ADCW;                // ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten Wandlung nicht übernommen.
13
14
}

Dann lese ich die zwei Spannungen hintereinander in einer Funktion ein:
1
void spgmessungakkus(void)
2
{
3
  float umrechnung = 0;
4
   
5
  //Akkuspg Hauptplatine
6
  ADMUX |= (1<<MUX0) | (1<<MUX1) | (1<<MUX2);   // Kanal wählen; hier: ADC7
7
  ADCSRA |= (1<<ADSC);                      // eine Wandlung "single conversion"
8
  while (ADCSRA & (1<<ADSC) ) {}            // auf Abschluss der Konvertierung warten
9
  
10
  umrechnung = ADCW;                         // ADC auslesen und speichern
11
  
12
  umrechnung = umrechnung*3300/1024;
13
  reg1[0] = umrechnung * 2;
14
  sprintf(spgakkuplatine, "%d.%02d", (reg1[0]/1000), (reg1[0] % 1000)/10);
15
  
16
  //Akkuspg Heizung
17
  ADMUX |= (1<<MUX1) | (1<<MUX2);           // Kanal wählen; hier: ADC6
18
  ADCSRA |= (1<<ADSC);                      // eine Wandlung "single conversion"
19
  while (ADCSRA & (1<<ADSC) ) {}            // auf Abschluss der Konvertierung warten
20
  
21
  umrechnung = ADCW;                         // ADC auslesen und speichern
22
  
23
  umrechnung = umrechnung*3300/1024;
24
  reg1[1] = umrechnung*2;
25
  sprintf(spgheizung, "%d.%02d", (reg1[1]/1000), (reg1[1] % 1000)/10);
26
}

Es liegen zur Zeit 0V an ADC6 an, trotzdem wird aber die Spannung vom 
ADC7 angezeigt!
Vielen Dank für eure Hilfe.

von hdd (Gast)


Lesenswert?

ADMUX |= (1<<MUX1) | (1<<MUX2);           // Kanal wählen; hier: ADC6
Damit löschst du nicht MUX0, mach mal aus dem |= nur ein =

von Bene J. (terfagter)


Lesenswert?

hdd schrieb:
> ADMUX |= (1<<MUX1) | (1<<MUX2);           // Kanal wählen; hier: ADC6
> Damit löschst du nicht MUX0, mach mal aus dem |= nur ein =

Lösche ich damit nicht auch meine Einstellungen zur Referenzspannung?
Ich habs jetzt mal mit den Zusatz ADMUX &= ~(1<<MUX0); gelöst.
Jetzt funktioniert es! Danke. Da hätte ich ja auch selber drauf kommen 
können...

von hdd (Gast)


Lesenswert?

Bene Jan schrieb:
> Lösche ich damit nicht auch meine Einstellungen zur Referenzspannung?

Stimmt, hatte nicht mehr im Kopf, dass die ja im selben Register 
stecken. Ist doch schon etwas spät ;)

von Klaus D. (kolisson)


Lesenswert?

Hi Bene Jan,
ich verstehe zwar nix von deinem C Quelltext , biete dir aber
folgendes an:



ADMUX = REFS1  REFS0  ADLAR  MUX4  MUX3  MUX2  MUX1 / MUX 0

gewünscht ist Ref = AVCC .. entspricht 01xxxxxx

Zudem gewünscht ist Kanal 6 = xx000110
und alternativ kanal 7      = xx000111

Die Grundeinstellung für ref = Avcc und kanal 0 ist also:
ADMUXBASIS = &b01000000


Wenn jetzt Kanalnummer in var "Kanal" gespeichert ist kannst du den 
Kanal (5Bit)
ja schonmal so isolieren : Kanal = Kanal and &B00011111

.. nun sind nur noch 5Bit aktiv.

admux = admuxbasis or Kanal setzt dir dann den Kanal.

Ich hoffe es hilft.

Gruss Klaus

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.