Hallo, ich habe den ADC im Atmega8 in Betrieb genommen. Die ADC-Eingangsspannung von 0-5V wird über ein Poti eingestellt, Ausgabe über UART auf PC. Auf den ersten Blick funktioniert alles sehr gut. Ich vergleiche die am PC (über UART) angezeigten Werte mit der gemessenen ADC- Eingangsspannung (gemessen mit Digitalvoltmeter DVM). Sehr gute Übereinstimmung. Allerdings sieht es so aus, als würden der ADC in einem sehr kleinen Spannungsbereich zwischen 3.62 Volt und 3.72 Volt nicht mehr richtig wandeln. Die Ergebnisse sehen da immer so aus und sind reproduzierbar: DVM PC(UART) .. .. 3.60 Volt 3.60 Volt 3.61 Volt 3.61 Volt 3.62 Volt 3.62 Volt 3.63 Volt 3.62 Volt 3.64 Volt 3.62 Volt u.s.w. ... ... ... 3.70 Volt 3.62 Volt 3.71 Volt 3.62 Volt 3.72 Volt 3.62 Volt 3.73 Volt 3.73 Volt ... ... d.h. regele ich die Spannung am Poti von 0...5Volt, bleibt der ADC-Ausgang im Bereich von 3.62 Volt bis 3.72 Volt bei konstanten 3.62 Volt hängen und zeigt erst oberhalb 3.72 Volt wieder korrekt an. Ähnliches passiert auch, wenn ich von 5...0Volt regele, dann bleibt der ADC in dem gleichen Bereich, allerdings dann bei 3.72 Volt hängen, um unterhalb von 3.62 Volt wieder richtig anzuzeigen. Folgende Maßnahmen haben bisher nicht geholfen: verschiedene prescaler (Abtastrate) unterschiedliche Mittelwertbildung neuer Controller Ausgabe an LCD Modul und nicht über UART alle Spannungen mit Oszi gemessen (keine Besonderheiten) anderes Poti Kann mir jemand noch einen Hinweis zur Fehlersuche geben? Danke im Voraus.
Lass dir mal zusätzlich die direkten ADC Werte ausgeben, damit du erst mal weißt, ob der ADC schon in der Messung das Problem hat, oder ob dir in der Umrechnung nach Volt etwas Unvorhergesehenes passiert.
1 | uint16_t wert; |
2 | |
3 | ...
|
4 | while(1) |
5 | {
|
6 | wert = ADC_read_avg(0, 64); |
7 | res = (wert * 4.96) / 1023; |
8 | |
9 | utoa( wert, buffer, 10 ); |
10 | uart_puts( buffer ); |
11 | uartPuts( " " ); |
12 | |
13 | dtostrf(res, 5, 2, buffer); |
14 | uart_puts( buffer ); |
15 | uart_puts( "\r\n" ); |
16 | }
|
17 | }
|
Christoph Heer schrieb: > Kann mir jemand noch einen Hinweis zur Fehlersuche geben? ich sehe keinen fehler
Vielen Dank für die schnellen Antworten. Leider ist das Problem auch bei den reinen ADC Werten schon vorhanden. Werde es noch mal mit 2.56Volt interner Referenzspannung versuchen.
Hallo, ich finde zwei Probleme: a) in der adc-init wird 3x ADCSRA = ..; geschrieben. somit überschreibt man alle vorherigen Einstellungen und der ADC wird nicht korrekt initialisiert. b) in der adc-read wird der ADC-Kanal geändert, aber nicht die erste Wandlung verworfen. Siehe dazu das Datenblatt !
1 | /* ADC Prescale (64) */
|
2 | ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0); |
3 | |
4 | /* Activate ADC */
|
5 | ADCSRA = (1<<ADEN); |
Du betreibst den ADC ohne Prescaler, also mit viel zu hohem Takt.
Des weiteren ist noch in der main.c ein Fehler:
1 | char buffer[5]; |
das reicht nicht für den String aus.
Uwe S. schrieb: > b) in der adc-read wird der ADC-Kanal geändert, aber nicht die erste > Wandlung verworfen. Siehe dazu das Datenblatt ! In welchem Datenblatt soll denn das stehen? Das ist nur nötig beim Wechseln der Referenzspannung, oder beim Kanal-Wechsel im Differential-Mode, aber nicht beim "Otto-Normal" Kanal-Wechsel.
Danke für die guten Tips. Letztendlich war's dann in der ADC Routine ein fehlerhafte Anweisung. Falsch war: ADCSRA = (1<<ADEN); Richtig ist: ADCSRA |= (1<<ADEN);
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.