Hallo,
ich bin jetzt seit knapp drei Tagen beschäftigt, den ADC in einem
ATMega32 zum Laufen zu bekommen. Beziehungsweise, er funktioniert, aber
eben nicht so, wie er soll.
Das Problem ist, dass ich immer 1016 zurückgeliefert bekomme. Ziel ist
es die Spannung einer 9V Block-Batterie zu ermitteln. Ich habe PC2 des
AVRs (Kanal 3 ADC) an einen Spannungsteiler anliegen, der die aktuell
noch 7V der Blockbatterie auf 2,5V reduziert. Zwischen PC2 und
Spannungsteiler ist noch eine einfache Siliziumdiode geschaltet.
Daraus folgt rechnerisch, dass an PC2 etwa 1,8V anliegen müssten,
gemessen sind es dann 1,67V.
Deshalb müsste der ADC einen Wert von 342 zurückliefern, tut er aber
nicht, stattdessen gibt er ganz stabil 1016 aus.
Ich habe den Wert mit einem Multimeter nachgemessen, das erstaunliche
Ergebnis: Am PIN liegen bei Betrieb 4,8V an. Genauso, wie an allen
anderen Pins von PORTC. Ich habe daraufhin mein Programm überprüft, ob
ich vielleicht irgendwo PortC auf High gesetzt habe, ist aber nicht so.
Später habe ich in meinem Hauptprogramm in der while-Schleife DDRC auf
Eingang und PORTC auf Low gesetzt. Trotzdem liegen an den PORTC Pins
weiterhin 4,8V an.
Dass heißt, dass mein ADC ja funktioniert, aber irrtümlicherweise immer
4,8V anliegt.
Ich habe auf meiner Platine auch nach Überbrückungen gesucht, die für
den hohen Pegel verantwortlich sein könnten, aber alles ist ok.
Das JTAG Fuse bit habe auch schon auf 1 gesetzt, also gelöscht. Ändert
aber nichts.
Woran kann es noch liegen? So langsam gehen mir echt die Ideen aus.
Hier noch einmal mein ADC-Programmcode:
1 | void ADC_init()
|
2 | {
|
3 | uint16_t result;
|
4 |
|
5 | ADMUX |= (1<<REFS0);
|
6 | ADMUX |= (1 << MUX1);
|
7 |
|
8 | ADCSRA = (1<<ADPS1) | (1<<ADPS0); //64
|
9 | ADCSRA |= (1<<ADEN);
|
10 |
|
11 | ADCSRA |= (1<<ADSC);
|
12 | while (ADCSRA & (1<<ADSC) ) {}
|
13 |
|
14 | result = ADCW;
|
15 |
|
16 | }
|
17 |
|
18 | void ADC_start() //Funktion zum Auswerten des ADCs mit Umrechnung in Volt
|
19 | {
|
20 | ADCSRA |= (1 << ADSC);
|
21 | while (ADCSRA & (1<<ADSC) ) {}
|
22 | ADC_Wert = ADCW*0.004883;
|
23 | }
|
Die Funktion ADC_init wird im Hauptprogramm einmal aufgerufen und dann
immer wieder die Funktion ADC_start.
Mein ATMega32 läuft auf 8Mhz, deshalb der ADC Prescaler von 64, um
innerhalb der 50-200kHz zu bleiben.
Ich hoffe euch fällt noch etwas ein. Ist der Controller vielleicht
kaputt?
Viele Grüße
Jan