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 ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.