Forum: Mikrocontroller und Digitale Elektronik Kanalwechsel beim AVR-ADC: Falsche Werte kurz nach dem Wechsel


von Mario M. (Gast)


Lesenswert?

Hallo zusammen,

Folgendes: mit einem AVR ATmega88 (20MHz) möchte ich zwei analoge 
Spannungen messen.
Der ADC läuft mit ca. 150kHz im continuous conversion mode, conversion 
complete interrupt ist eingeschaltet. AVR-Studio, WinAVR. Die beiden 
Messkanäle werden als "normale" ADC-Eingangskanäle verwendet, also keine 
differentielle gain o.Ä. Die Hardware-Beschaltung der Kanäle ist auch in 
Ordnung und funktioniert

Messe ich nur einen Kanal, funktioniert alles wunderbar, auf beiden 
Kanälen.

Schalte ich hingegen im Programm auf den anderen zu messenden Kanal um, 
tritt ein merkwürdiger Fehler auf, zu dem ich auch im Datenblatt nichts 
finde.
Es stimmen nämlich die Messwerte, welche gleich nach dem Umschalten 
genommen werden, hinten und vorne nicht. Ich kann auch 10(!) Dummy-Reads 
gleich nach dem Umschalten einbauen, und die Werte stimmen immer noch 
nicht.
Erst wenn ich einen _delay_ms(10) nach dem Umschalten des Kanals 
einbaue, liefert die Mühle die korrekten Werte...

Es braucht also offensichtlich eine Pause zwischen dem Kanalumschalten 
und der ersten Messung...Wie kann ich eleganter (ohne delay...) 
sicherstellen, dass die erste Messung nach dem Umschalten korrekt ist? 
(Zeit spielt eine Rolle..)

Ist das ein bekanntes Problem? Im DB find ich irgendwie nix dazu...?

Herzlichen Gruss und Danke
Mario

von spess53 (Gast)


Lesenswert?

Hi

Um den Sample&Hold-Kondensator des ADCs von 0 auf 5V umzuladen, braucht 
es (bei angenommenen 150k Widerstand und 14pF in der S&H-Stufe) ca.65µs. 
Das gilt aber nur für eine sehr niederohmige Quelle.
Also stellt sich die Frage nach der Impedanz deiner Quelle.

MfG Spess

von Andreas R. (rebirama)


Lesenswert?

1) Dummyreads gehören in die Kategorie "Legenden". Halte dich ans 
Datenblatt, dann stimmt die erste Messung.

2) du hast zwar keinen Code gepostet, da kann keiner nachvollziehen was 
du treibst und wo es klemmt.

- Wann wechselst du den Kanal? Steht da der ADC oder macht der grad ne 
Wandlung?

- 150 kHz? ADC-Takt oder Samplerate?

- Was steht in der ADC-ISR?

von spacedog (Gast)


Lesenswert?

Lies das Datenblatt mal genau. Der MUX braucht zum Kanalwechsel 
irgendwie auch noch Zeit, weil er den Kanal ja erst wechseln kann, wenn 
der ADC fertig gewandelt hat. Dann könnte es nämlich sein, dass dein 
"falscher" Messwert in Tat und Wahrheit ziemlich gut zum vorhergehenden 
Kanal "passt".

von spess53 (Gast)


Lesenswert?

Hi

>Lies das Datenblatt mal genau.

Richtig .

>Der MUX braucht zum Kanalwechsel irgendwie auch noch Zeit, weil er den
>Kanal ja erst wechseln kann, wenn der ADC fertig gewandelt hat.

Dann sieh dir mal die Diagramme in den Datenblättern. Da steht genau, 
was wann umgeschaltet und abgetastet wird.

MfG Spess

von markusj (Gast)


Lesenswert?

Hi,

Andreas R. schrieb:
> 1) Dummyreads gehören in die Kategorie "Legenden". Halte dich ans
> Datenblatt, dann stimmt die erste Messung.

hast du dafür eine Quelle? Das Datenblatt empfiehlt bei gewissen 
Szenarien (Umschaltung der Referenzspannung, Umschalten von 
differentiellen Kanälen) nämlich eben jene Dummyreads. (Hier Konkret: 
ATTiny861 Rev. 2588C, Abs. 15.6.2 S. 149 sowie Abs. 15.13.1 S. 156)

mfG
Markus

von Mario M. (Gast)


Lesenswert?

Hallo zusammen,

die 150kHz sind ADC-Takt. In der ISR wird nur eine Variable geändert. 
Habe den Interrupt aber auch schon abgeschaltet, hatte keinen Effekt.

Den Kanal schalte ich zu einer beliebigen Zeit um, der ADC kann also 
mitten in einer Messung stecken. Habe ihn aber auch schon vor dem 
Kanalwechsen über das ADSC-Bit abgeschaltet, dann den Kanal gewechselt, 
wieder per ADSC = 1 angeschaltet, ein Dummy-Read und kommt immernoch 
Quark raus.

Im DB steht:

If both ADATE and ADEN is written to one, an interrupt event can occur 
at any time. If the
ADMUX Register is changed in this period, the user cannot tell if the 
next conversion is based
on the old or the new settings. ADMUX can be safely updated in the 
following ways:
1. When ADATE or ADEN is cleared.
2. During conversion, minimum one ADC clock cycle after the trigger 
event.
3. After a conversion, before the Interrupt Flag used as trigger source 
is cleared.
When updating ADMUX in one of these conditions, the new settings will 
affect the next ADC conversion.

Also wäre es für mich am Optimalsten, wenn man den ganzen ADC per ADEN 
ausschaltet, dann den Kanal wechselt und dann wieder loslegt.

Werde das morgen mal probieren...

Gruss und gute N8

von Mario M. (Gast)


Lesenswert?

Update: habs jetzt mit dem ADEN-Bit probiert - klappt! Also ADC mit ADEN 
ausschalten, Kanal wechseln, wieder einschalten. Kein Dummy-Read nötig.

Gruss
Mario

von Peter D. (peda)


Lesenswert?

Mario M. schrieb:
> Es stimmen nämlich die Messwerte, welche gleich nach dem Umschalten
> genommen werden, hinten und vorne nicht. Ich kann auch 10(!) Dummy-Reads
> gleich nach dem Umschalten einbauen, und die Werte stimmen immer noch
> nicht.

[Glaskugelmodus an]
Du wartest nicht das Ende einer Wandlung ab, d.h. Du liest 10-mal den 
gleichen Mumpitz ein.

Der continuous conversion mode ist nicht fürs Umschalten geeignet.
Starte einfach im ADC-Interrupt die nächste Messung, dann klappts auch 
mit dem Umschalten.
Also:
- alten Wert auslesen
- MUX umschalten
- neue Messung starten
nächster Interrupt:
- neuen Wert auslesen


> Erst wenn ich einen _delay_ms(10) nach dem Umschalten des Kanals
> einbaue, liefert die Mühle die korrekten Werte...

Wenn man nicht auf das Ende der Messung testet, muß man eben warten.
10ms sind aber extrem lang.


Peter

von doofie (Gast)


Lesenswert?

hallo,

ich habe ein ähnliches problem mit einem ATmega165. Dabei handelt es 
sich um eine schaltung(inkl. Software) die bereits besteht und von 
jemanden mir unbekannten entwickelt wurde.

und zwar wird fogendes gemacht:
- single conversion mode
- 4 ADC pins werden gemuxt(dabei wird pro pin 32x gesamplet und dann 
mux)
- es wird nur dann gemuxt, wenn die vorherige wandlung abgeschlossen ist
- nach dem umschalten wird auch noch relativ lange gewartet
Problem:
bei einem der eingänge wird ab und zu falsche werte gelesen, was 
folgendermaßen aussieht(wenn der fehler auftritt):
- die ersten 2-20 samples haben den ADCwert ca. 580(die folgenden sind 
i.o.)
- der korrekte wert wäre ca. 602
- der vorherige pin hatte den ADCwert ca. 500
- die quelle ist ein strommäßig vernünftig dimensionierter 
spannungsteiler mit poti(nicht bewegt+mit oszi "sauber") Iq=16mA

das ganze unterliegt einer Serienstreuung von etwa 10%. durch tauschen 
eines controllers konnte man den effekt auf einem Board eliminieren

Frage:
- kann sich etwas der oben genannten punkte auf den Fehler auswirken?
- wie sieht es eigentlich mit dem ADC-clock aus? im datenblatt steht 
50-200 kHz und welche einschränkungen es bei höherer frequenz gibt. aber 
wie sieht es bei niedrigerer f aus, da der µC mit der internen 1MHz + 
CKDIV8 fuse gesetzt läuft und der ADC prescaler auf 128 eingestellt ist, 
was heist, dass ich weit unter 50 kHz mit der ADC clock bin! - kann hier 
der hase im pfeffer liegen?

Gruß+Danke

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.