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.
/* 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
returnresult;
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
Georg schrieb:> ADMUX = mux; // Kanal waehlen> ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
Schaltet die Referenzspannung für jede Messung an und wieder aus...
Besser:
ADMUX = mux | (1<<REFS1) | (1<<REFS0);
Negative eingangsspannungen mögen die nunmal garnich gerne..
wenn dann musst du deine 4k7 nehmen und danach mit dioden (am besten
shotky) gegen GND absichern. das mag er womöglich noch vertragen
Georg schrieb:> Die Spannung am AVCC sieht am Oszi gut aus. Trotzdem brücken?
eigentlich gehört da eine kleine Spule oder ferritperle hin, 47Ohm sind
"gefühlt" etwas viel.
Aber egal: Erst die geänderte Software testen, dann notfalls zum
Lötkolben greifen.
Hallo,
wenn der Controller nicht Strom sparen muss, lässt man den ADC nach der
Initialisierung dauerhaft eingeschaltet und triggert ihn bei Bedarf
(nach Auswahl des Kanals). Das spart das Dummy-Read des Wertes (ausser
beim ersten Einschalten des ADC).
Initialisierung des ADC wäre dann:
>> ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
und wird zu Beginn des Programms aufgerufen.
Der Rest läuft dann in der Routine ab, aber ohne die Zeilen
> ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);> ADCSRA &= ~(1<<ADEN); // ADC deaktivieren
Bekomme immer noch Werte zwischen 350 und 380, egal welche Spannungen
anliegen.
Gerade liegen vor dem 4k7 -3V an, nach dem 4k7 sind es noch -0.6V.
Wahrscheinlich ist der ADC auf grund der neg. Spannungen defekt?!
Hier im Forum wird aber öfter geschrieben, dass einen Absicherung nur
mit einem Widerstand reicht (in Verbindung mit den internen Dioden). Ist
das nicht zutreffend?
Die -0,6 Volt entstehen durch den Spannungsteiler:
-3Volt Widerstand -0,6Volt Diode |>| Masse
Daher passt das schon, du musst nur aufpassen, dass der Strom durch die
Diode nicht größer als 1 mA wird, sonst ist sie kaputt und dein Eingang
gleich mit.
jepp ... sollte ja nicht passieren.
(-4V + 0.6V) / 4k7 = 0.7 mA (-4V ist der max. auftretende Wert).
Sollte also im grünen Bereich sein.
Gibt es eine Möglichkeit festzustellen, ob der ADC definitiv defekt ist
(z.b. messtechnisch)?
> Bekomme immer noch Werte zwischen 350 und 380
Sind diese Werte denn konstant, oder schwanken sie?
Versuche es mal zum Testen mit AVcc als Referenz (REFS1 = 0, REFS0 = 1).
Ändert sich der A/D Wert?
Georg schrieb:> Gibt es eine Möglichkeit festzustellen, ob der ADC definitiv defekt ist> (z.b. messtechnisch)?
Die neueren ADCs können über ADMUX mit einem internen Vergleichswert
belegt werden, z.B. 1,2 Volt.
Bei diesen Vergleichwerten weist du ja dann, was ungefähr rauskommen
muss. Stimmts überein, funktioniert der AD-Umsetzer noch, dann liegen
die Probleme entweder beim Verdrahten oder beim Sensor.
> Die neueren ADCs können über ADMUX mit einem internen Vergleichswert> belegt werden, z.B. 1,2 Volt.
Beim Mega128 ist dies:
MUX4..0 = 11110 - ADC misst interne Referenz (1.1V)
MUX4..0 = 11111 - ADC misst GND (sollte A/D-Wert von Null ergeben)
Aber eigentlich kann es nicht sein, dass bei höherer Referenzspannung
ein grösserer A/D-Wert herauskommt (wie du beschrieben hast) ...