Hallo,
ich habe bei einem ATmega128L (3.3V) probleme mit dem ADC. Ich bekomme
keine vernünftigen Werte. Ich messe an ADC0 und ADC1. Ich bekomme
jeweils einen Wert um die 350 raus (int16t_t-Wert), egal welche Spannung
am den Eingängen anliegt. Ich verwende den Code aus dem
AVR-ggc-Tutorial.
1 | uint16_t ReadChannel(uint8_t mux)
|
2 | {
|
3 | uint8_t i;
|
4 | uint16_t result;
|
5 |
|
6 | ADMUX = mux; // Kanal waehlen
|
7 | ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
|
8 |
|
9 | ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
|
10 | // setzen auf 8 (1) und ADC aktivieren (1)
|
11 |
|
12 | /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
|
13 | also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
|
14 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
|
15 | while ( ADCSRA & (1<<ADSC) ) {
|
16 | ; // auf Abschluss der Konvertierung warten
|
17 | }
|
18 | result = ADCW; // ADCW muss einmal gelesen werden,
|
19 | // sonst wird Ergebnis der nächsten Wandlung
|
20 | // nicht übernommen.
|
21 |
|
22 | /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
|
23 | result = 0;
|
24 | for( i=0; i<4; i++ )
|
25 | {
|
26 | ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
|
27 | while ( ADCSRA & (1<<ADSC) ) {
|
28 | ; // auf Abschluss der Konvertierung warten
|
29 | }
|
30 | result += ADCW; // Wandlungsergebnisse aufaddieren
|
31 | }
|
32 | ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
|
33 |
|
34 | result /= 4; // Summe durch vier teilen = arithm. Mittelwert
|
35 |
|
36 | return result;
|
37 | }
|
38 |
|
39 |
|
40 | temp1 = ReadChannel(0);
|
41 | temp2 = ReadChannel(1);
|
Ich habe mal mit dem Oszi die Pins durchgemessen und festgestellt, das
AREF sägezahnförmig zwischen 1 V und 2,5 V schwingt. Frequenz ca. 1Hz.
Ist das normal?
Es kommt vor, das an den Eingängen manchmal neg. Spannung von ca. -4V
anliegen. Ich habe die Eingänge mit 4k7 Widerständen abgesichert. Könnte
der ADC beschädeigt worden sein.
Jemand eine Idee wo mein Problem liegen könnte?
Gruß
Georg