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.