PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abtast-Rate und Auflösung beim ATMega8-ADC



radbruch
10.08.2007, 15:17
Hallo,

bei der Suche nach der maximalen Abtasterate des ATMega8-ADCs bin ich im Datenblatt auf folgendes gestossen:


By default, the successive approximation circuitry requires an input clock frequency
between 50 kHz and 200 kHz to get maximum resolution. If a lower resolution than 10
bits is needed, the input clock frequency to the ADC can be higher than 200 kHz to get a
higher sample rate.
(unter "Analog to Digital Converter"->"Prescaling and Conversion Timing")

Das erscheint mir auch logisch, denn bei ca. 13 Zyklen minus 2,5 Zyklen Overhead bleiben pro gesampeltem Bit ein Zyklus. Allerdings finde ich den entscheidenden Hinweis nicht, wie man weniger als 10Bit einstellen und nutzen kann.

Ich meine nicht(!) die linksbündige Ausrichtung des Ergebnisses und nur ADCH auswerten. Damit werden nur die genutzten Datenbits verringert und die Verzögerung beim (und nach dem) Auslesen des Low-Bytes gespart, gesampelt werden trotzdem 10 Bit in 13 Zyklen.

Gruß

mic

franzl
10.08.2007, 16:23
Hi,
das ist auch nicht möglich. Allerdings ist es auch besser wenn man bei höheren Samplingrates die unteren 2 Bits wegfallen lässt damit das ergebniss letztendlich genauer wird. Denn wenn du jetzt nur 8 Bit hättest währen ja die untersten von denen auch ungenau. So sind diese wenigstens verwertbar.
Hoffe ich konnt dir weiterhelfen.
mfg franz

radbruch
10.08.2007, 19:35
Hallo


Hoffe ich konnt dir weiterhelfen.
Vielleicht schon, danke für die Mühe.

Ich bin bei den avrfreaks (http://www.avrfreaks.net) auf die Design-Notes #021 (http://www.avrfreaks.net/modules/FreaksFiles/files/383/DN_021.pdf) gestossen. Und das verwirrt mich jetzt total. Die Sampeln in ihrem Beispiel mit einem 8MHz-ATMega mit 500kHz gleichzeitig 5 (oder 4?) ADC-Kanäle mit ISR. Ich habe keine Ahnung, wie das funktionieren soll.

Unter "Conversion Resolution/Speed" steht da:


If a fast sampling rate is required, it could be necessary to use only 8-bit resolution or
less, and if full 10-bit resolution is desired, “slower” sampling could be enforced (the
example below also relates to this question).


und beim Beispiel ("Example Using the ADC") heißt es dazu:


An ADC clock at 500 kHz violates the limit in ADC clocking for full 10 bit resolution (ADC
clock 200 kHz for 10-bit resolution). Considering the table regarding “ADC characteristics”
section “Analog to Digital Converter” in the data sheet, the absolute accuracy would
probably be 2 - 3 LSB. This means that the ADC can be considered to be a 9-bit ADC
since the LSB is not reliable.

Bedeutet das nun, dass bei Tastraten über 200kHz die Zeit nicht ausreicht, um 10 Bit sauber zu wandeln? Und dass man dann damit rechnen muss, dass die unteren LSBs Schrott sind, aber die MSBs trotzdem stimmen?

Das würde mir nämlich dann schon reichen, mehr als 4 Bit will ich gar nicht auflösen. Wenn ich dafür den Takt hochschrauben kann, ist das ok.

Gruß

mic

franzl
10.08.2007, 22:45
Hi,
ja so könnte man es grob sagen. Denn jede Schaltung braucht einfach eine gewisse Zeit zum einschwingen und wenn jetz die Abtastrate hochgeschraubt wird, dann wird logischerweiße auch die Genauigkeit darunter leiden. Wenn es dir nicht auf die Genauigkeit ankommt sondern auf die Geschwindigkeit kannst du natürlich wie du schon gesagt hast die Abtastrate erhöhen. Allerdings eine frage was willst du mit 4-Bit, das ist ja extrem ungenau.
mfg franz

radbruch
17.08.2007, 15:40
Hallo


Allerdings eine frage was willst du mit 4-Bit, das ist ja extrem ungenau.
Wenn ich nur schwarz oder weis unterscheiden will, sind 4Bit mehr als genug.

Inzwischen habe ich das mit dem ADC gut im Griff und kann mit einem 8MHz-ATMega ein Fernsehbild(bas (http://de.wikipedia.org/wiki/FBAS)) digitalisieren. Allerdings nicht mit der maximalen horizontalen Auflösung, dafür reichen die 8MHz nicht aus. Vertikal habe ich aber volle Auflösung (bei 384*288 Punkten).

Um die maximale Abtastrate zu erreichen betreibt man den ADC im free-running-Modus mit dem kleinsten prescaler-Wert (clk/2). Dann muss man nur noch möglichst schnell die gewandelten Daten auslesen, weil der ADC pro Wandlung nur 2 Takte benötigt. Deshalb kommt es quasi auf jeden Takt an, der zum Lesen benötigt wird. Da der ADC nur einen neuen Wert bildet, wenn ein alter gelesen wurde, kann man sich die ganze Handshakerei sparen. Da 8 Bit schneller als 16Bit gelesen werden können, stellt man ein linksbündiges Ergebniss ein und liest nur ADCH aus. Hier das Setup meines ADCs:


// ADC interne Referenz 2,56V, Ergebniss linksbündig, Kanal ADC4 (E_INT1)
ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<ADLAR) | 4;
// setzte free running triggern
SFIOR = (0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
// kein interupt, Wandler einschalten, prescaller /2
ADCSRA = (0<<ADIE) | (1<<ADEN) | (0<<ADPS2) | (0<<ADPS1) | (1<<ADPS0);
// Autotriggern bedeutet jetzt free running aktivieren, altes Flag löschen
ADCSRA |= (1<<ADATE) | (1<<ADIF);
// Initialisierung starten
ADCSRA |= (1<<ADSC);
// und noch die wohl eher unnötige Initiallesung
while (!(ADCSRA & (1<<ADIF)));
ADCSRA |= (1<<ADIF);

Nach diesem Code sampelt der ADC ununterbrochen die angelegte Spannung. Nun muss man die Daten so schnell wie möglich in den Speicher übertragen um sie später auszuwerten. In C geht das wohl mit Zeigern auf Felder am schnellsten:

uint8_t pixel[256],*pixelzeiger=pixel[0];
do *pixelzeiger=ADCH; while (*pixelzeiger++ > 20);

So schaffe ich ca. 60 Werte/Zeile des Videobilds. Andere Varianten die ohne Zeiger direkt auf das Feld zugreifen liefern max. 50 Werte pro Zeile.

Wegen der internen 2,56V-Referenz des ADCs bedeuten Werte < 30 ein Synchronsignal, also den Start einer neuen Zeile. Um eine Zeile einzulesen um die Werte anschliesend in einem Diagramm darzustellen, genügt dieser kurze Code:


cli();
while (ADCH > 20); // warten bis aktuelle Zeile zu Ende
while (ADCH < 30); // warten bis Synchronimpuls fertig
do *pixelzeiger=ADCH; while (*pixelzeiger++ > 20);
sei();
*pixelzeiger=0; // Endekennung der Daten

Danach stehen die Daten in pixel[] mit einer 0 im letzten Element.

Bei der schrittweisen Erhöhung der Abtast- und Auslesegeschwindigkeit habe ich übrigens keine nennenswerten Fehllesungen festgestellt. Bei der verwendeten linksbündigen Darstellung des Ergebnisses betrug die Abweichung bei der Messung einer 1,5V-Batterie nur 0,02V gegenüber einer langsamen Messung mit prescaler /64.

Gruß

mic

franzl
17.08.2007, 16:17
Hi,
ja ist doch super wenn alles funktioniert. Herzlichen Glückwunsch.
mfg franz