Hallo Forum,
ich hab hier ein kleines Problem. Ich will mit dem ADC einen Poti
auswählen. Momentan hab ich ein 50:50 Spannungsteiler mit 5V
angeschlossen. Ich lese also max 5V aus, so dass ich die interne
Referenzspannung verwenden kann.
Den gelesenen Wert lasse ich mir per utoa auf dem LCD anzeigen. Nur
Leider geht der Wert bis 16368 und erzeugt damit insgesamt 3 mal einen
Überlauf. Nur wieso? Bei einem 10Bit ADC müsste der maximalwert doch
1023 sein?!
Hier mein Code:
ADC
1 | uint16_t readADC(uint8_t channel){
|
2 |
|
3 | uint8_t i;
|
4 | uint16_t result;
|
5 |
|
6 | ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); //ADC aktiviert, prescaler 128
|
7 | ADMUX = channel; //Kanal auswählen
|
8 | ADMUX |= (1<<REFS1)|(1<<REFS0)|(1<<ADLAR); //interne Referenzspannung 2,65V
|
9 |
|
10 |
|
11 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
|
12 | while ( !(ADCSRA & (1<<ADIF)) ); //warte auf Konvertierung
|
13 | result = ADC; // ADCW muss gelesen werden
|
14 |
|
15 | result = 0;
|
16 | for( i=0; i<4; i++ )
|
17 | {
|
18 | ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
|
19 | while ( !(ADCSRA & (1<<ADIF)) ); //warte auf Konvertierung
|
20 | result += ADC; // Wandlungsergebnisse aufaddieren
|
21 | }
|
22 | ADCSRA &= ~(1<<ADEN); // ADC deaktivieren
|
23 |
|
24 | result /= 4; // Summe durch vier teilen = arithm. Mittelwert
|
25 |
|
26 | return result;
|
27 | }
|
und die routine zum lesen und ausgeben auf dem LCD:
1 | while(1){
|
2 | lcd_clrscr(); //display löschen
|
3 | uint16_t adcvalue = readADC(7);
|
4 | char adcstring[6];
|
5 | lcd_puts(utoa(adcvalue, adcstring, 10));
|
6 | _delay_ms(400);
|
7 | }
|
jemand ne Idee? Ist bestimmt nur ein doofer Fehler den ich vor lauter
Bäumen nicht sehe...