Forum: Mikrocontroller und Digitale Elektronik Verhalten des ADC des ATmega328P


von Alex (Gast)


Lesenswert?

Ich nutze einen ATmega328P um ein analoges Signal im "free running mode" 
zu sampeln. Der Prescaler ist auf ÷128 eingestellt, woraus sich die 
Tacktrate des ADCs ergibt. Im Datenblat steht, dass ein 
Umsetzungsvorgang auf diese Weise 13 clock cycles benötigt.
Über das ADIE-Registerbit kann man Einstellen, ob am Ende jedes 
Umsetzungsvorgangs ein Interrupt im µC ausgelöst wird. Ich würde gerne 
wissen, ob sich die Anzahl der nötigen clock cycles verändert, je 
nachdem ob ein Interrupt ausgelöst werden muss oder nicht. Oder startet 
der nächste Vorgang immer genau im 14. clock cycle?

Das Ergebnis eines Umsetzungsvorgangs findet man in den Registern ADCL 
und ADCH. Zu welchem Zeitpunkt der 13 clock cycle wird dieses Ergebnis 
in diese Register geschrieben? Wenn das im 13. passiert, habe ich dann 
bis zum 26. (dem nächsten 13.) Zeit, um das Ergebnis auszulesen, bevor 
es überschrieben wird?
Wird das Ergebnis auch in diese Register geschrieben, wenn ADIE auf 0 
gesetzt wurde und daher keine Interrupts ausgelöst werden?

von Michael U. (amiga)


Lesenswert?

Hallo,

irgendwo im Datenblatt waren die Abläufe genauer beschrieben.
So aus der Erinnerung: es sind 13 Zyklen, so oder so.
Für den Interrupt wird ein Flag gesetzt oder eben nicht.
Die Daten werden logoschweise immer in ADCL und ADCH geschriben, wie 
sollte man sonst rankommen? Vermutlich wird am Ende des 13. ADC-Taktes 
geschrieben, da sind die Daten ja erst gültig.
Die bleiben auch drin bis es neue Daten gibt.

Irgendwo steht auch, daß man ab dem 3. ADC-Takt den Eingang wechseln 
kann, weil die S&H-Schaltung da bereits abgekoppelt ist.
Gibt auch noch ein paar Sachen zum Umschalten der Referenzspannung usw.

Gruß aus Berlin
Michael

von c-hater (Gast)


Lesenswert?

Alex schrieb:

> Ich nutze einen ATmega328P um ein analoges Signal im "free running mode"
> zu sampeln. Der Prescaler ist auf ÷128 eingestellt, woraus sich die
> Tacktrate des ADCs ergibt.

Ganz sicher nicht. Was sich bestenfalls ergibt, ist die Samplerate des 
ADC (ganz ohne Idioten-"c" in "Takt").

> Im Datenblat steht, dass ein
> Umsetzungsvorgang auf diese Weise 13 clock cycles benötigt.

Multipliziert mit dem Prescaler. Nur wenn der 1 ist, benötigt die ADC 13 
Takte, ansonsten natürlich entsprechende Vielfache davon.

> Über das ADIE-Registerbit kann man Einstellen, ob am Ende jedes
> Umsetzungsvorgangs ein Interrupt im µC ausgelöst wird. Ich würde gerne
> wissen, ob sich die Anzahl der nötigen clock cycles verändert, je
> nachdem ob ein Interrupt ausgelöst werden muss oder nicht.

Natürlich nicht.

> Das Ergebnis eines Umsetzungsvorgangs findet man in den Registern ADCL
> und ADCH. Zu welchem Zeitpunkt der 13 clock cycle wird dieses Ergebnis
> in diese Register geschrieben?

Es gibt keine Granularität jenseits des Prescalers. Das Ergebnis der 
Wandlung wird immer im letzen Takt der Wandlung geschrieben, unabhängig 
von der Registerbreite.

> Wenn das im 13. passiert, habe ich dann
> bis zum 26. (dem nächsten 13.) Zeit, um das Ergebnis auszulesen, bevor
> es überschrieben wird?

Ja.

> Wird das Ergebnis auch in diese Register geschrieben, wenn ADIE auf 0
> gesetzt wurde und daher keine Interrupts ausgelöst werden?

Ja.

von Alex (Gast)


Lesenswert?

Danke für die schnelle Antwort!
Da ich eine konstante aber etwas langsamere Abtastrate als 9615 Hz 
benötige, und nicht will dass mein Programm immer wieder von 
ADC-Interrupts unterbrochen wird (obwohl ich die Resultate gar nicht 
benötige), sollte es dann ja möglich sein, einen Timer Interrupt mit der 
richtigen Frequenz zu aktivieren und in dieser ISR die aktuellen Werte 
von ADCL und ADCH auszulesen. Nur auf das richtige Timing muss man dabei 
achten.

von c-hater (Gast)


Lesenswert?

Alex schrieb:

> Da ich eine konstante aber etwas langsamere Abtastrate als 9615 Hz
> benötige, und nicht will dass mein Programm immer wieder von
> ADC-Interrupts unterbrochen wird (obwohl ich die Resultate gar nicht
> benötige), sollte es dann ja möglich sein, einen Timer Interrupt mit der
> richtigen Frequenz zu aktivieren und in dieser ISR die aktuellen Werte
> von ADCL und ADCH auszulesen. Nur auf das richtige Timing muss man dabei
> achten.

Oder (sehr viel sinnvoller): man benutzt die ADC eben nicht im 
FreeRunning-Mode, sondern läßt sie gleich vom Timer exakt in der 
gewünschten Samplerate anstoßen...

von Oldie (Gast)


Lesenswert?

Nur bis zu einem ADC-Takt von 200 kHz, werden die ADC-
Spezifikationen von Atmel garantiert. Damit ergibt sich eine
maximale Samplerate von 15,384 kHz

Bei allen für die Signalverarbeitung mit dem ADC üblichen
CPU-CLK-Frequenzen von 1 ... 20 MHz lässt sich mit dem
ADC-Prescaler ein ADC-Takt von 100 ... 200 kHz einstellen.

Ungünstig sind die intern mit dem RC-Oszillator vorgegebenen
CPU-Clks von etwa 1 MHz, oder 8 MHz: Es lassen sich nur
maximal 125 kHz im erlaubten Bereich bereitstellen.
Max. Samplerate ist 125 kHz / 13 = 9615 kHz.

Will man die Vorgaben "ausknautschen", empfiehlt sich ein
externer Taktgeber, oder Quarz mit 1,6 - 3,2 - 6,4 - 12,8 MHz.
Damit lassen sich 200 kHz ADC-Takt einstellen.

Zur Not lässt sich auch der interne RC-Oszillator mit OSCCAL
auf 6,4 MHz ziehen!

Im Datenblatt diverser AVR-Mega und -Tiny wird gezeigt, dass
beim Free-Running-ADC alle 13 ADC-Takte ein neuer ADC-Wert
bereitgestellt wird. Nutzt man den Conversion-Complete-Interrupt,
ist man an dieses Zeitregime gebunden und muss die Daten in
dieser Zeit verarbeiten können.

Persönlich würde ich es bevorzugen, den ADC mit maximalem
ADC-Clock im Single-Conversion-Mode arbeiten zu lassen.
Mit einem Timer-Interrupt, der etwas langsamer läuft, als
die Samplerate, lese ich den ADC aus und starte ihn neu.

Kommt aber drauf an, ob man möglichst nahe an die maximale Rate
kommen will, oder eine langsamere Abtastrate möglichst genau
haben will, oder, oder, und und  ...

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.