Arduino analogRead Dauer des Auslesens

Hallo liebe Community,

ich möchte aller 200 Mikrosekunden die Eingangsspannung an einem Port meines Arduino Leonardos auslesen.
Dazu gibt es die Funktion analogRead.
Diese benötigt laut dieser Seite:

http://arduino.cc/de/Reference/AnalogRead

... ungefähr 100 Mikrosekunden, um den Wert auszulesen.

Nun meine Frage:
Wenn ich das aller 200 Mikrosekunden machen möchte, würde ich das so machen:

analogRead (...);
delayMicroseconds(200);

Da das analogRead nun aber selber auch schon ca. 100 Mikrosekunden benötigt, frage ich mich, ob das Programm solange wartet, bis der Wert ausgelesen ist und somit ein Zyklus ca. 300 Mikrosekunden lang wäre, oder ob das Programm während des Auslesens weiterarbeite würde und somit der Zyklus wie gewünscht nur 200 Mikrosekunden lang ist.

Danke für eure Hilfe,
Liebe Grüße Tim

Die Arduino Implementierung ist blockierend. Er wartet bis die Konvertierung fertig ist.

Das kann man auch so machen, dass es nicht blockiert und nach jeder Konvertierung ein Interrupt ausgelöst wird um das Ergebnis auszulesen, aber dazu muss man direkt auf die Register zugreifen.

Du kannst das aber auch so etwas beschleunigen, in dem du den Prescaler des ADCs verringerst, was aber eventuell auf Kosten der Genauigkeit geht:
http://www.marulaberry.co.za/index.php/tutorials/code/arduino-adc/
60µs geht dabei wahrscheinlich ohne Probleme

Das gilt übrigens nur für die AVR Prozessoren. Auf dem Due ist das wesentlich schneller.

Dankeschön!

"Das kann man auch so machen, dass es nicht blockiert und nach jeder Konvertierung ein Interrupt ausgelöst wird um das Ergebnis auszulesen, aber dazu muss man direkt auf die Register zugreifen."

Das wäre dann das hier, oder?:

http://arduino.cc/de/Reference/Interrupts

LG Tim

Nein. interrupts() aktiviert nur globale alle Interrupts wenn man sie abgeschaltet hat. Wenn du das nicht verstehst, dann lass es lieber, da es nicht trivial ist.

Und wie gesagt, wenn du wie in deinem Namen auf einem Due bist, dann ist der ADC sowieso schneller getaktet. Da geht eine Messung glaube ich selbst im langsamsten Fall in unter 20µs.

Nein, das läuft gerade auf einem Arduino Leonardo.
Es ist halt so, dass ich genau wissen muss, dass dieser Zyklus wirklich genau 200 Mikrosekunden lang war.
Gibt es dafür eine Möglichkeit?

Arg. Sorry. Jetzt sehe ich es.

Wie man die Zeit misst, wird in dem Link oben gezeigt

Man macht zweimal micros() und die Differenz ist dann die Zeitspanne, die man auf Serial ausgeben kann. Die Ausgabe dauert allerdings ein paar Millisekunden, deshalb werden in dem Beispiel hundert Messungen gemacht, die Werte in Arrays geschrieben und die Ausgabe erst danach gemacht. Wenn man immer jeden Wert gleich auf Serial ausgibt kommst du nicht auf 200µs zwischen den Messungen.

Die Auflösung von micros() beträgt 4µs

Welchen Link meinst du?

Serial ist doch die Übertragung auf den PC oder?
Meine Berechnungen werden allerdings nur auf dem Arduino stattfinden.

Dankeschön!

http://www.marulaberry.co.za/index.php/tutorials/code/arduino-adc/

Unter "Coding the ADC" ist die Standardversion ohne veränderten Prescaler

Vielen Dank, ich werd mir das alles anschauen. :slight_smile: