Forum: Mikrocontroller und Digitale Elektronik ADC vom ATmega16 liefert immer 0x3FF


von Philipp B. (philipp_burch)


Lesenswert?

Hallo zusammen,

ich habe ein merkwürdiges Problem mit dem ADC meines ATmega16. Ich 
möchte ihn verwenden, um die Versorgungsspannung zu überwachen. Dazu 
schalte ich AREF intern auf AVcc und verwende Kanal 30 (Interne 1.22V 
Referenz). Bei einem ATmega8, bei dem ich sowas kürzlich gemacht hatte, 
funktionierte das bestens, aber hier lese ich immer nur 0x3FF, also alle 
Bits gesetzt. Ich habe an ARef keinen Kondensator, aber eigentlich 
sollte der ja nur das Rauschen unterdrücken, oder? Jedenfalls nehme ich 
später eh den Mittelwert von 256 Messungen, da kann der rauschen so viel 
er will. Allerdings müsste ich dazu erstmal ein gescheites Signal 
rausbekommen.
Ich schätze mal, dass ich irgendwo einen blöden Fehler gemacht habe, 
aber ich komm' nicht drauf...
Hier meine Initialisierung des ADCs:
1
void init_vsupervisor()
2
{
3
  //Initialize ADC with Vcc as Vref and internal 1.22V on ch. 30
4
  ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(ADLAR);
5
  ADMUX |= _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
6
7
  ADCSRA = _BV(ADEN) | _BV(ADIE);
8
  ADCSRA |= _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);
9
}

Was ebenfalls komisch ist: Die Referenz ist weder AVcc (Wenn ich REFS1 
rausnehme), noch 2.56V mit obigem Code. Ausserdem habe ich auch mal an 
Kanal 0 gemessen. Das Ergebnis war das Selbe, was mich aber sehr 
verwundert: An PA0 (Bzw. am ganzen PortA) hängt ein Eingang von einem 
74AC138 und das funktioniert alles wunderbar weiter...
Was kann das sein?!

Wäre froh, wenn mir jemand helfen könnte. Danke im Voraus!

Grüsse
Philipp

von Sonic (Gast)


Lesenswert?

1. evtl. versehentlich Pullups am PORTA eingeschaltet?
2. min. 40µs Pause nach Umschalten des MUX vor der Messung?
3. Spannungsteiler i.O.? Messung mit Multimeter am Pin?

von Philipp B. (philipp_burch)


Lesenswert?

Also:
1. PORTA ist komplett auf Ausgang geschaltet. Damit will ich ja auch nix 
messen, nur an Kanal 30, also an der internen 1.22V Referenz.
2. Ich habe es nicht gemessen, aber die Wandlung wird alle 10ms 
angekickt, die erste müsste eigentlich auch schon eine ordentliche 
Verzögerung haben. Kann ich aber nochmal überprüfen.
3. Spannungsteiler? Wie gesagt, ich messe ja die INTERNE Referenz. Was 
mir aber mehr Sorgen bereitet ist, dass der ARef-Pin dauernd offen ist, 
auch wenn ich ihn mit obigem Code intern auf AVcc hänge...

von Sonic (Gast)


Lesenswert?

Wenn die interne Referenz benutzt wird muss doch ein 100nF-Kerko gegen 
Masse an den Uref-Pin, oder?

von D. W. (dave) Benutzerseite


Lesenswert?

Wo ist _BV(ADSC) ?

von Sonic (Gast)


Lesenswert?

Und mit 'left-adjusted' willst du nur 8 bit (ADCH) auslesen, sehe ich 
das richtig?

von Philipp B. (philipp_burch)


Lesenswert?

@Sonic:

Ich bin eben nicht sicher, ob es den wirklich braucht. Aber kann ich 
nachher mal ausprobieren. Ausserdem will ich nur die oberen 8 Bit 
auslesen, ja.

@David:

Das mache ich alle 10ms in einer anderen Funktion.

von Sonic (Gast)


Lesenswert?

Nunja, vielleicht hat's der ADC auch hinter sich? Haste 'n zweiten 
(neuen) zum Testen da? hatte auch mal das Problem dass er hin war, 
obwohl ich den µC im Gerät gelassen habe und nur neu programmiert.

von Philipp B. (philipp_burch)


Lesenswert?

Jep, hab' ihn schonmal gewechselt, genau gleiches Problem.

von Hannes L. (hannes)


Lesenswert?

Das Messen der Bandgap-Referenz gegen die interne Referenz zum Zwecke 
des Batterietests macht keinen Sinn, man muss schon gegen AVcc messen. 
REFS1 sollte also aus sein.

Mit Mega16 habe ich das noch nicht gemacht, da halte ich mich also 
zurück.

Hannes

P.S.: Bin noch nicht fertig mit den Tests zu Stepper und StepUp, dauert 
noch...

von Philipp B. (philipp_burch)


Lesenswert?

@Hannes:

Schon klar, dass das REFS1 weg muss, das hatte ich auch nur zum Testen 
drin um zu sehen, ob am ARef-Pin überhaupt irgendwas dran ist. Dem war 
nicht so.

Mach dir nur keinen Stress wegen dem Stepper, es eilt ja nicht ;)

von Philipp B. (philipp_burch)


Lesenswert?

Ok, es hat sich erledigt. Ich... ähm... naja... hatte eine Verbindung 
zwischen ARef und GND schäm
Verbindung entfernt und alles funktioniert :)

Trotzdem besten Dank an alle und noch ein schöner Rest vom Sonntag!
Philipp

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.