Forum: Mikrocontroller und Digitale Elektronik Seltsames Adc Verhalten


von lex (Gast)


Lesenswert?

Hallo,

ich betreibe an meinen ATmega1284P zur Zeit eine einfache Adc Schaltung.

Benutze die interne Referenz von 2.54V.

Ein 250k Poti hängt zwischen Aref und GND, der Schleifer geht auf Adc1.
Zwischen Aref und GND hängen außerdem noch 100nF.

Meine Initialisierung schaut so aus:
1
/* select internal reference AVCC */
2
  ADMUX |= (1 << REFS1) | (1 << REFS0);
3
  /* setting the alignment of the ADC data register */
4
  ADMUX |= (1 << ADLAR);
5
  /* select single pin measurement on PA0 */
6
  ADMUX |= (0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (0 << MUX0);
7
8
  /* enable the ADC module */
9
  ADCSRA |= (1 << ADEN);
10
  /* disable the auto trigger */
11
  ADCSRA |= (0 << ADATE);
12
  /* enable the ADC complete interrupt */
13
  ADCSRA |= (1 << ADIE);
14
  /* setting the prescaler to 128 */
15
  ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
16
17
  /* setting the auto trigger to free running mode, however, auto triggering is disabled */
18
  ADCSRB |= (0 << ADTS2) | (0 << ADTS1) | (0 << ADTS0);
19
20
  /* disabling the digital input on pins used for ADC */
21
  DIDR0 |= (0 << ADC7D) | (0 << ADC6D) | (0 << ADC5D) | (0 << ADC4D) | (0 << ADC3D) | (0 << ADC2D) | (0 << ADC1D) | (1 << ADC0D);

Alle 640ms wird eine neue Messung gestartet:
1
ADCSRA |= (1 << ADSC);

Im Interrupt wird der Wert nur kurz abgespeichert.

Der Wert wird in einen String gewandelt und per USART und Lcd 
ausgebeben.

Funkt auch erstmal alles super.
Aber nach einiger Zeit steht der Wert fest auf 255.
Dreh ich einige Zeit am Poti läufts wieder.

Kennt das jemand?
Liegt das irgendwie am Adc?
Meine Software macht sonst nichts mehr, auch die Ausgabe auf USART und 
Lcd klappt ansonsten.

Ist mein Poti vielleicht zu groß? Wollte erst 100k benutzen, aber die 
hatte ich grad nicht da...

Viele Grüße,
lex

von spess53 (Gast)


Lesenswert?

Hi

>Ein 250k Poti hängt zwischen Aref und GND,

Ist arg viel. Datenblatt:

The ADC is optimized for analog signals with an output impedance of 
approximately 10 kΩ or less.

MfG spess

von lex (Gast)


Lesenswert?

Naja ich hab mich am Avr-gcc Tut hier orientiert, da hieß es mindestens 
100k, besser mehr.

Hab zum Testen aber no a 10er rumliegen. Werd einfach bisl mit den 
Umgebungsbedienungen rumspielen. Morgen hab ich dann auch ein Multimeter 
und kann schaun ob bei 255 tatsächlich 2.54v anliegen.

Also erstmal,
Viele Grüße,
lex

von spess53 (Gast)


Lesenswert?

Hi

>Naja ich hab mich am Avr-gcc Tut hier orientiert, da hieß es mindestens
>100k, besser mehr.

Vertrauen ist gut, Kontrolle ist besser.

Hast du schon mal die Spannung am ADC-Pin gemessen?

MfG Spess

von HildeK (Gast)


Lesenswert?

lex schrieb:
1
> ADMUX |= (0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (0 << MUX0);
Diese Befehl bewirkt gar nichts.
Es müsste heißen (wenn du die MUX-Bits explizit auf Null setzen willst):
1
ADMUX &= ~( (1 << MUX4) | (1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0) );
Kann sein, dass es hier nicht problematisch ist, weil die nach dem Reset 
eh auf Null stehen, aber du verwendest dies auch an anderer Stelle. Ich 
habe jetzt nicht geprüft, ob das dort zu einem Fehler führt.

von lex (Gast)


Lesenswert?

Natürlich bewirkt dieser Befehl nichts. Bits löschen geht anders, ich 
weis :)
Aber er erhöht die Übersicht, vor allem wenn ich später verschiedene 
Kanäle benutze, oder per Defines die Init konfiguriere.

@spess: nein, mein Multi hab ich grad nicht daheim, morgen aber!

von name vergessen (Gast)


Lesenswert?

ich hab das Datenblatt nicht angeschaut aber mir war so als ob beim ADC 
das ADEN in ADCSRA (was das Dingens einschaltet) zuerst erfolgen muss. 
Irgendwo stand da doch was...?

von spess53 (Gast)


Lesenswert?

Hi

>ich hab das Datenblatt nicht angeschaut aber mir war so als ob beim ADC
>das ADEN in ADCSRA (was das Dingens einschaltet) zuerst erfolgen muss.
>Irgendwo stand da doch was...?

Ja. Muss man. Bevor man anfängt zu Messen.

MfG Spess

von lex (Gast)


Lesenswert?

Ich schalte doch das Adc Modul ein bevor ich die Messung starte.

Siehe Code in meinem ersten Beitrag, 3. Befehlszeile.

Aber wie gesagt, heut Abend hab ich mein Multi zur Hand und kann 
nachmessen, ob bei einer ausgegebenen 255 wirklich 2.54V am Adc Eingang 
anliegen.
Würd mich aber schon sehr wundern, denn das Poti bewegt sich ja nicht :/

Ich konnte den Effekt gestern übrigens nochmal besser beobachten:

"Starten" der Schaltung durch auslösen eines Resets => Programm läuft 
los

Anzeige des richtigen Wertes am Lcd, z.B. 130 bei ca. mittlerer 
Potistelllung

Nach  ca. 10-20s ändert sich der Wert auf 255

Nach ca. 10-20s wird wieder der richtige Wert angezeigt

usw.usw.

Eine Messung wird alle 640ms gestartet, das Ergebnis wird sofort 
ausgegeben.

Aber momentan kann ich nur spekulieren, also heut Abend erstmal 
nachmessen...

Viele Grüße,
lex

von Karl H. (kbuchegg)


Lesenswert?

lex schrieb:

> Siehe Code in meinem ersten Beitrag,

Dieser Code zeigt die Initialisierung. Soweit so gut.
Da bleiben noch 3 Millionen 8 hundert sechsundneunzig Möglichkeiten was 
noch alles schief gehen kann.

Daher ist es bei dubiosen Fehlern meistens die bessere Variante den 
kompletten Code zu zeigen. Oder zumindest den Code auf ein compililier 
und lauffähiges Programm abzuspecken, welches den Fehler immer noch 
zeigt.
Und sei es nur dazu, damit jemand anderer den Code auf seiner Hardware 
laufen lässt und mit der Aussage kommt: läuft bei mir problemlos, könnte 
daher was mit deiner Hardware zu tun haben.

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
Noch kein Account? Hier anmelden.