Hallo zusammen,
ich habe ein Problem mit den ADC des Atmega8. Er zeigt mir ziemlich
genau immer den halben Wert des erwarteten an.
D.h. ich benutze die interne Referenzspannung von 2,56V und wenn ich mit
einem Poti und Spannungsteiler 2,5V anlege bekomme ich als Wert 128
anstatt erwartete 255. Ich habe die Wandlung absichtlich nur auf 8bit da
mir das genügt und sich die werte per I²C so besser übertragen lassen.
Die werte überprüfe ich ohne veränderungen an der Ausgabe des Programms
das die I²C daten empfängt.
Anbei mein Code:
1 |
|
2 | #define NO_ADC_READS 5
|
3 |
|
4 | uint8_t readADC(uint8_t channel)
|
5 | {
|
6 | uint8_t i;
|
7 | uint16_t result = 0;
|
8 |
|
9 | // Den ADC aktivieren und Teilungsfaktor auf 64 stellen
|
10 | ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
|
11 |
|
12 | // Kanal des Multiplexers waehlen, linke Anordnung da nur 8bit genauigkeit benötigt werden
|
13 | // Interne Referenzspannung verwenden (also 2,56 V)
|
14 | ADMUX = channel | (1<<REFS1) | (1<<REFS0) | (1<<ADLAR);
|
15 |
|
16 | // Den ADC initialisieren und einen sog. Dummyreadout machen
|
17 | ADCSRA |= (1<<ADSC);
|
18 | while(ADCSRA & (1<<ADSC));
|
19 |
|
20 | // Jetzt NO_ADC_READS x die analoge Spannung am Kanal auslesen
|
21 | // und dann Durchschnittswert ausrechnen.
|
22 | for(i=0; i < NO_ADC_READS; i++)
|
23 | {
|
24 | // Eine Wandlung
|
25 | ADCSRA |= (1<<ADSC);
|
26 | // Auf Ergebnis warten...
|
27 | while(ADCSRA & (1<<ADSC));
|
28 | //Ergebnis aufaddieren
|
29 | result += ADCH;
|
30 | }
|
31 |
|
32 | // ADC wieder deaktivieren
|
33 | ADCSRA &= ~(1<<ADEN);
|
34 | // Durchschnittswert ermitteln
|
35 | result /= NO_ADC_READS;
|
36 |
|
37 | return result;
|
38 |
|
39 | }
|
40 |
|
41 | temp_motordriver = readADC(2);
|
Vielen Dank im Voraus
Striker1985