Forum: Mikrocontroller und Digitale Elektronik AVR MCU ADC: nicht alles klar


von Georg M. (g_m)


Lesenswert?

Auch nach dem sorgfältigen und aufmerksamen Durchlesen von Datenblättern 
sind immer noch nicht alle Unklarheit ausgeräumt.
Es ist mir immer noch nicht vollständig klar, welche Aufgaben von der 
Hardware übernommen werden, und was im Programmcode unbedingt 
berücksichtigt werden muss.

Z.B. beim Umschalten von ADC-Kanälen:
1
ADC0.MUXPOS = ADC_MUXPOS_AIN7_gc;   // select AIN7 (PA7) as ADC Input
2
( delay??? )
3
ADC0.COMMAND = ADC_STCONV_bm;       // start conversion

von Ralf (Gast)


Lesenswert?

Georg M. schrieb:
> Es ist mir immer noch nicht vollständig klar, welche Aufgaben von der
> Hardware übernommen werden

Das ist doch im Datenblatt Deines AVR eindeutig beschrieben.
So eine Umwandlung kann man z.B. einmalig anstoßen oder permanent 
ausführen lassen.

> und was im Programmcode unbedingt
> berücksichtigt werden muss

- die Initialisierung des ADC
- die Quellen-Umschaltung
- ggf. Start der Umwandlung anstoßen

von Georg M. (g_m)


Lesenswert?

Ralf schrieb:
> - die Quellen-Umschaltung
> - ggf. Start der Umwandlung anstoßen

- die Quellen-Umschaltung
- ( delay??? )
- ggf. Start der Umwandlung anstoßen


Das war meine Frage. Verstanden?

von Harry R. (harry_r2)


Lesenswert?

wenn du es "händisch" startest machst du also single conversion?!
Sample&Hold erfolgt 1,5 ADC-Takte nach deinem Conc-Start.
(erstmaliges S&H nach der Aktivierung des ADC erst später)
Ob du zwischen Mux und Start noch zusätzlich warten muss hängt von 
deiner Quellimpedanz ab: Der Sample-Kondensator muss auf den Endwert 
geladen worden sein.

z.B. in 
https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf
steht das in
26.6.1 Analog Input Circuitry

: Bearbeitet durch User
von Georg M. (g_m)


Lesenswert?

Harry R. schrieb:
> wenn du es "händisch" startest machst du also single conversion?!

Nein, Burst Accumulation Mode.


Harry R. schrieb:
> Ob du zwischen Mux und Start noch zusätzlich warten muss hängt von
> deiner Quellimpedanz ab

Meine Impedanz ist sehr niedrig:
Ein 100nF Kondensator ist direkt angeschlossen, und seine Spannung 
(50...500mV) wird direkt gemessen. Kein Widerstand meinerseits.

von M. K. (sylaina)


Lesenswert?

Georg M. schrieb:
> Ralf schrieb:
>> - die Quellen-Umschaltung
>> - ggf. Start der Umwandlung anstoßen
>
> - die Quellen-Umschaltung
> - ( delay??? )
> - ggf. Start der Umwandlung anstoßen
>
>
> Das war meine Frage. Verstanden?

Wenn du die Quelle umschaltest soll man die erste Messung verwerfen da 
man nicht sicher sein kann, dass das erste Wandlerergebnis korrekt ist. 
Ein Delay hilft da nicht soweit ich weiß.

von Achim H. (pluto25)


Lesenswert?

Das kann man eigendlich nur probieren. Mit der Umschaltung wird etwas 
Ladung von dem vorherigen Pin auf dem zu messenden übertragen. Wäre der 
offen reichen auch 3 Messungen nicht bis er wieder 0 ist.
Delays stören eigendlich den Programmablauf. Wie wäre es das Ergebnis 
direkt nach der Konvertierung ab zu holen und sofort den Mux zu setzen 
dann sollte reichlich Zeit sein bevor der nächste Burst kommt?

von Falk B. (falk)


Lesenswert?

M. K. schrieb:
>> Das war meine Frage. Verstanden?
>
> Wenn du die Quelle umschaltest soll man die erste Messung verwerfen da
> man nicht sicher sein kann, dass das erste Wandlerergebnis korrekt ist.

FALSCH!!! Das gilt nur, wenn man die Referenzspannung umschaltet!

> Ein Delay hilft da nicht soweit ich weiß.

Zwischen dem Umschalten des MUX um dem Start der Messung braucht es 
KEINE zusätzliche Wartezeit, neudeutsch "delay".

von Falk B. (falk)


Lesenswert?

A. H. schrieb:
> Das kann man eigendlich nur probieren. Mit der Umschaltung wird etwas
> Ladung von dem vorherigen Pin auf dem zu messenden übertragen.

Nein! Nicht, wenn die Eingangsschaltung was taugt.

von Georg M. (g_m)


Lesenswert?

Gefunden:
Beitrag "Settling Time ADC Atmega 4808"


A. H. schrieb:
> Delays stören eigendlich den Programmablauf. Wie wäre es das Ergebnis
> direkt nach der Konvertierung ab zu holen und sofort den Mux zu setzen
> dann sollte reichlich Zeit sein bevor der nächste Burst kommt?

Ja, das wäre auch eine Lösung.

von M. K. (sylaina)


Lesenswert?

Falk B. schrieb:
> Das gilt nur, wenn man die Referenzspannung umschaltet!

Genau das meinte ich mit Quelle (Referenzspannungsquelle). Da hab ich 
mich Kacke ausgedrückt.

von Stefan F. (Gast)


Lesenswert?

M. K. schrieb:
> Wenn du die Quelle umschaltest soll man die erste Messung verwerfen da
> man nicht sicher sein kann, dass das erste Wandlerergebnis korrekt ist.

Nein

A. H. schrieb:
> Das kann man eigendlich nur probieren.

Nein.

Zu Beginn jeder Messung wird intern ein Kondensator mit der 
Eingangsspannung geladen. Der Multiplexer wählt dabei einen 
Eingang/Kanal aus. Danach wird der Eingang wieder getrennt und der ADC 
misst die Spannung am seinem internen Kondensator.

Die Sample Phase (das Laden des Kondensators) wird durch gleichzeitiges 
Umkonfigurieren des Multiplexers nicht beeinträchtigt, weil die 
Umschaltung in der Hardware ggf. verzögert stattfindet. Das steht 
irgendwo im Datenblatt oder in einer Application Note.

Das Ergebnis des ADC kommt immer von dem Eingang, der unmittelbar vor 
der Messung durch den Multiplexer ausgewählt war.

Die Konsequenz daraus ist, dass bei einer Umschaltung des Kanal während 
einer laufenden Messung erst das übernächste Ergebnis zum gewählten 
Kanal gehört.

Im Freilaufenden Modus kann man in jedem IRQ
a) das Ergebnis der vorherigen abgeschlossenen Messung auslesen und
b) während schon die nächste Messung läuft
c) den Kanal für die übernächste Messung einstellen

Es ist also durchaus möglich, alle Kanäle abwechselnd mit maximaler 
Geschwindigkeit zu messen ohne auch nur ein einziges Messergebnis 
verwerfen zu müssen.

Zur Referenzspannung:

Die interne Referenzquelle ist recht hochohmig. Wenn man diese auf eine 
andere Spannung umstellt, dauert es eine Weile, bis sie sich 
stabilisiert hat. Wie lange das dauert, hängt hauptsächlich davon ab, 
wie viel Kapazität am Aref Pin hängt. Ohne Stützkondensator gehen viele 
Entwickler von der Dauer einer ADC Messung aus. Aber das hängt ja auch 
wieder von der Taktfrequenz des ADC ab.

von Ralf (Gast)


Lesenswert?

Das hast Du gut erklärt, Stefan!
Also: Obacht nur bei Änderung der Referenzspannung.
Da sollte man etwas Wartezeit einplanen.
Dabei hatte ich schon die merkwürdigsten Effekte.

Mit den neuen AVRs und vergleichsweise zahmen Anforderungen an die 
Messungen schalte ich mir im freilaufenden Modus die Eingänge in einem 
Timer-Interrupt regelmäßig um und nutze die maximalmögliche 
Aufsummierung (Sample Accumulation) für einen guten Mittelwert. Das 
klappt prima und neuerdings mit 12 Bit Auflösung :)

von M. K. (sylaina)


Lesenswert?

Stefan F. schrieb:
> Ohne Stützkondensator gehen viele
> Entwickler von der Dauer einer ADC Messung aus.

Ich zitiere aus dem Datenblatt des Atmega328P

> If no external voltage is applied to the AREF pin, the user may switch
> between AVCC and 1.1V as reference selection. The first ADC conversion
> result after switching reference voltage source may be inaccurate, and
> the user is advised to discard this result.

Da muss ich also als Entwickler nicht von irgend etwas ausgehen, da muss 
ich nur mal das Datenblatt lesen ;)

von Sebastian W. (wangnick)


Lesenswert?

M. K. schrieb:
> Stefan F. schrieb:
>> Ohne Stützkondensator gehen viele
>> Entwickler von der Dauer einer ADC Messung aus.
>
> Ich zitiere aus dem Datenblatt des Atmega328P
>
>> If no external voltage is applied to the AREF pin, the user may switch
>> between AVCC and 1.1V as reference selection. The first ADC conversion
>> result after switching reference voltage source may be inaccurate, and
>> the user is advised to discard this result.
>
> Da muss ich also als Entwickler nicht von irgend etwas ausgehen, da muss
> ich nur mal das Datenblatt lesen ;)

Das Datenblatt berücksichtigt bei dieser Aussage NICHT eine eventuelle 
(ja im Datenblatt soger empfohlene) Stützkapazität an AREF.

Wenn man bei einem Atmega328P von AVCC auf 1.1V als ADC-Referenz 
umschaltet, so kann es mit dem üblichen 100nF-Kondensator zwischen AREF 
und GND sehr lange dauern, WESENTLICH LÄNGER als die Dauer einer 
Messung, bis sich AREF stabilisiert hat, weil die internen 1.1V, wie 
Stefan oben schon beschrieben hat, recht hochohmig ist.

Wir haben das in einem früheren Thread schon mal en detail durchgekaut 
-> Beitrag "AVR AREF intern: 100n zu GND wirklich hilfreich?". Ich benutze seitdem 
standardmäßig nur noch 10nF als Stützkapazität an AREF.

LG, Sebastian

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Sebastian W. schrieb:
> Wir haben das in einem früheren Thread schon mal en detail durchgekaut
> -> Beitrag "AVR AREF intern: 100n zu GND wirklich hilfreich?". Ich
> benutze seitdem
> standardmäßig nur noch 10nF als Stützkapazität an AREF.

Und wozu? Wie oft und wie schnell must du denn die Referenz umschalten?
Das ist wohl eher die Ausnahme. 90% und mehr aller Anwendungen des ADC 
schalten einmal die Referenz ein und gut.

von c-hater (Gast)


Lesenswert?

Falk B. schrieb:

> Und wozu? Wie oft und wie schnell must du denn die Referenz umschalten?
> Das ist wohl eher die Ausnahme. 90% und mehr aller Anwendungen des ADC
> schalten einmal die Referenz ein und gut.

Das ist ja mal wieder das typische Statement eines Schmalspur-Denkers 
ohne umfangreiche Erfahrung.

Natürlich kann es bei einer entsprechenden Anwendung vorkommen, dass man 
tatsächlich schnell mehrere Kanäle mit unterschiedlichen Referenzen 
messen muss. Kommt z.B. regelmäßig vor, wenn man nur einen einzigen(!) 
Messwert über einen sehr großen Dynamikbereich möglichst genau erfassen 
muss.

Aber solchen Schmalspur-Denkern ist ja sogar verwehrt, für sowas ein 
Konzept zu entwickeln. Weil: könnten sie es, würden sie verstehen, warum 
es sinnvoll sein kann auch schnell zwischen verschiedenen 
Referenzspannungen wechseln zu können...

Und das ist nur eine von vielen Anwendungen, wo das nötig sein kann. 
Man denke z.B. nur an die (möglichst zeitgleiche) parallele Erfassung 
von Spannung und Strom. Auch hier ist es oft mehr als nötig, die 
Referenz schnell schalten zu können, um die Shunts für die Strommessung 
möglichst klein halten zu können.

Das waren jetzt schon zwei typische Anwendungsfälle. Es gibt aber noch 
viel mehr...

Sprich: du hast keine Ahnung.

von Stefan F. (Gast)


Lesenswert?

Es reicht doch schon, unterschiedliche Sensoren abzufragen. Der eine 
wird gegen VCC gemessen, der andere gegen eine stabile Referenz. Schon 
muss man umschalten.

Ein batteriebetriebenes Thermometer zum Beispiel.

von Ralf (Gast)


Lesenswert?

Stefan F. schrieb:
> Schon muss man umschalten.

Bei einer dieser Umschaltungen hatte ich in unerfahreneren Jahren mal 
ein großes Problem, welches sich als Programm-Reset äußerte. Ich glaube 
da war die Ursache eine bestimmte Referenzspannung, die (leicht) über 
der Betriebsspannung lag.

von c-hater (Gast)


Lesenswert?

Ralf schrieb:

> Bei einer dieser Umschaltungen hatte ich in unerfahreneren Jahren mal
> ein großes Problem, welches sich als Programm-Reset äußerte. Ich glaube
> da war die Ursache eine bestimmte Referenzspannung, die (leicht) über
> der Betriebsspannung lag.

Das dürfte das Problem mit der auch vom BOD benutzten 1.1V-Referenz bei 
vielen neueren ATMegas sein. Das Problem habe ich vor Jahren schon 
geposted (damals konkret zum Mega1284P) , aber nur den Hohn der hiesigen 
Vollidioten geerntet...

Der Wirkungsmechanismus ist dabei so: Man mißt irgendwas mit einer 
relativ hohen Referenzspannung (z.B. Vcc), schaltet dann um auf die 
interne 1.1V-Quelle und hat außen an ARef einen "fetten" Bypass (der 
braucht garnicht so sehr fett zu sein, um den Effekt auszulösen).
Dadurch sieht der BOD kurzzeitig (aber locker lang genug, denn er ist 
sehr schnell) ein viel zu hohe Referenzspannung, was ihn natürlich zu 
der Annahme bringt, dass sein Messwert, nämlich Vcc, zu gering wäre. Und 
dann tut er das, was er tun muss, nämlich einen Reset auslösen...

von Achim H. (pluto25)


Lesenswert?

Stefan F. schrieb:
> Es ist also durchaus möglich, alle Kanäle abwechselnd mit maximaler
> Geschwindigkeit zu messen ohne auch nur ein einziges Messergebnis
> verwerfen zu müssen.

Vielleicht doch mal ausprobieren um zu erkennen das das recht ungenaue 
Ergebnisse bringt. Stark abhängig von dem was am vorherigen Pin hängt.

von Stefan F. (Gast)


Lesenswert?

A. H. schrieb:
> Vielleicht doch mal ausprobieren

Habe ich, ist lange her.

> um zu erkennen das das recht ungenaue
> Ergebnisse bringt. Stark abhängig von dem was am vorherigen Pin hängt.

Das Problem hast du nur, wenn deine Quelle zu hochohmig ist. Der ADC 
erreicht die versprochene Genauigkeit, wenn man sich an die Bedingungen 
hält. In diesem Fall muss die Quelle einen Ausgangswiderstand kleiner 
als 10 kΩ haben, soweit ich mich erinnere.

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.