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?
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
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.
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.
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...
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 ...