Fragen zum Prescaler

Wie ich bereits erfahren habe kann man einen Prescaler verwenden um das einlesen der Analogports zu beschleunigen.

Arduino Cookbook p.571 - 18.9 Measuring Analog Values Quickly

//Prescaler 16
bitClear(ADCSRA,ADPS0) ;
bitClear(ADCSRA,ADPS1) ;
bitSet(ADCSRA,ADPS2) ;

Mich würde interessieren warum das so ist. Wenn ich den Takt von 16MHz mit den Prescaler Bits auf 62500Hz runterbreche müsste das System doch langsamer reagieren und nicht schneller?

Muss irgendetwas Beachtet werden bei verwendung eines Prescaler?
Ich nutze micors(), analogRead(), digitalRead() und die timerOne library

gruß Jens

DrThunderhell:
Mich würde interessieren warum das so ist. Wenn ich den Takt von 16MHz mit den Prescaler Bits auf 62500Hz runterbreche müsste das System doch langsamer reagieren und nicht schneller?

Die ADC clock tickt immer mit "Systemtakt durch Prescaler", und der normale Prescaler-Wert ist 128.
16 MHz Systemtakt / 128 = 125 kHz ADC clock

Wenn Du den Prescaler auf 16 verkleinerst, dann gilt:
16 MHz Systemtakt / 16 = 1 MHz = 1000 kHz ADC clock

Mit Prescaler 16 statt 128 taktet die ADC clock achtmal schneller.

Aber mit mehr als 200 kHz ADC clock liefert der ADC keine 10 bit Auflösung mehr, sondern es geht Genauigkeit verloren.
In jedem Fall benötigt eine ADC-Wandlung 13 ADC clock Takte.

Danke sehr aufschlussreich,

das würde ja bedeuten, dass schon ab einem Prescaler von 32 ~ 500KHz Genauigkeit verloren ginge.
In wie fern macht sich das bemerkbar bzw wie kann ich mir das vorstellen?
Wieviel Genauigkeit geht verloren?

Hat die ADC clock auswirkungen auf die Funktionen?
micors(), analogRead(), digitalRead() und die timerOne library

DrThunderhell:
In wie fern macht sich das bemerkbar bzw wie kann ich mir das vorstellen?
Wieviel Genauigkeit geht verloren?

Ich habe das selbst nicht getestet und kann nur http://www.atmel.com/Images/doc8444.pdf zitieren:

If ADC resolution of less than 10 bits
required, then the ADC clock frequency can be higher than 200kHz. At 1MHz it is
possible to achieve eight bits of resolution maximum.

Ob es bei der geringeren Auflösung so ist, dass bestimmte Messwerte überhaupt nicht mehr gemessen werden, so dass es nicht jeden Wert zwischen 0 und 1023 auch als Messwert gibt, oder ob die Messwerte bei gleichbleibender Messspannung schwanken und bei direkt nacheinander ausgeführten Messungen leicht springende Werte zurückgeliefert werden, kann ich Dir nicht sagen. Aber wenn Du es aufgebaut und programmiert hast, kannst Du das natürlich selbst mal austesten, indem Du mal ein feinfühlig einstellbares 10-Gang Poti verbaust und verschiedene nebeneinander liegende Einstellungen ausmißt, einmal mit normalem Prescaler und einmal mit gedoptem Prescaler.

hmm, ja aber wenn ich nacher sowiso nur Werte zwischen 0 und 1023 erhalte (8bit) is doch egal ob das Analogsignal mit 8 oder 10 bit auflösung eingelesen wird oder nicht?

hab jetzt ein bisschen rumgespielt mir ist in der hinsicht aber nichts aufgefallen.

Was mir aber aufgefallen ist:

  • ich hab am Anfang meines Programms ein einmaliges einleses des aktuellen Analogwertes als Referenz für den Offset.
    Mit prescaler wird dieser erst falsch eingelesen und normalisiert sich nur nach weiterer Analogwert Nutzung mit der Zeit.
    Ich bin es so umgangen, dass ich ihn einfach 3 mal hintereinander einlese, da ich beim initialisieren die Zeit dazu habe.

ne halt, Denkfehler. 8bit sind ja 255 Werte...

Aber es werden trotzdem als max 1023 angezeigt und als min 0. Ist dann nur jeder 4te ein Schritt oder wie funktioniert das dann?

DrThunderhell:
hmm, ja aber wenn ich nacher sowiso nur Werte zwischen 0 und 1023 erhalte (8bit) is doch egal ob das Analogsignal mit 8 oder 10 bit auflösung eingelesen wird oder nicht?

hab jetzt ein bisschen rumgespielt mir ist in der hinsicht aber nichts aufgefallen.

Was mir aber aufgefallen ist:

  • ich hab am Anfang meines Programms ein einmaliges einleses des aktuellen Analogwertes als Referenz für den Offset.
    Mit prescaler wird dieser erst falsch eingelesen und normalisiert sich nur nach weiterer Analogwert Nutzung mit der Zeit.
    Ich bin es so umgangen, dass ich ihn einfach 3 mal hintereinander einlese, da ich beim initialisieren die Zeit dazu habe.

0 bis 1023 sind 10 Bit nicht 8.
0 bis 255 sind 8 Bit

Wenn Du schneller konvetierst, aber mehrere Messungen brauchst, damit der Wert richtig ist hast Du keinen Geschwindigkeitsvorteil.

Grüße Uwe

Auflösung und Genauigkeit werden gern verwechselt :wink:
Einen konstanten Wert zu messen und nach mehreren Messungen nur ein Flattern von 1/1024 zu haben, kann dir auch bei schnellerem Messen gelingen.

Den Fehler merkst du bei schnell wechselnden Werten und wenn du mehrere Kanäle "gleichzeitig" misst.

void setup()
{
   //Prescaler 16
   bitClear(ADCSRA,ADPS0) ;
   bitClear(ADCSRA,ADPS1) ;
   bitSet(ADCSRA,ADPS2) ;

   Serial.begin(115200);
}

void loop () 
{
    analogRead(A0); 
    Serial.println(analogRead(A1));
}

Lass an A1 eine konstante Spannung, aber ändere die an A0.
Ohne prescaler-Tuning sollte der mit A1 gemessene Wert sich dadurch nicht so stören lassen.

@ Uwe:

ich brauch ja nur am Anfang die Zeit, ich denk das es mit der initialisierung des Analogeingangs zu tun hat.

Atmel schreibt im Atmega 2560 Handbuch S. 281 Redirect Notice

Das bei der ersten conversation des AD Converters der Sample&Hold 13,5 Takte und die conversation 25 Takte braucht. alle weiteren normalen conversationen dauern 1,5 bzw. 13 Takte (bei single ended).

also gut das 2,5 fache am Start als Normal. Oder seh ich das falsch?