Messgeschwindigkeit Arduino Nano erhöhen

Hallo Leute,

ich bin relativ neu mit Arduino und ich hab da gleich schon ein Problem.

Ich möchte mit dem Nano und einem ADXL Beschleunigungssensor die Beschleunigung messen.

Ist alles soweit gut nur ich bekomm es nicht schneller als ungefähr 3Ks/s ich benötige so um und bei 20Ks/s also da fehlt noch einiges.

Einmal zum Programm ich hab versucht die Werte einzeln über Serial.Print auszugeben war deutlich zu langsam dann hab ich ein Array mit 500 Werten gemacht war schon etwas schneller dann noch die baudrate auf 2.000.000 erhöht und irgendwann war ich dann bei ungefähr 2Ks/s.

Weshalb misst er so langsam liegt das an dem Serial.print Befehl oder wie sehe ich das?
Der Chip daruaf hat ja 20 MHz wenn ich es das richtig verstanden habe brauch er für jeden Schritt 20 MHz und das wäre deutlich schneller als ich benötige?

Was gibt es für alternativen? gibt es schnellere gibt es andere Möglichkeiten den Code aufzubauen?

Schon danke für die Hilfe

Anbei einmal mit Code mit Array und ohne Array:

const int ax = A6;
int accelerationax;

int arrayax[501];
int iax = 0;

               

void setup() {
  
  Serial.begin(2000000);

}

void loop() {
  
  for (iax = 0; iax < 501; iax++) {
    arrayax[iax] = analogRead(ax);
  }

  for (iax = 0 ; iax < 501 ; iax++ ) {
    Serial.println(arrayax[iax]);

  }
}
 const int ax = A6;

void setup() {
  
  Serial.begin(2000000);

}

void loop() {
  
Serial.print(analogRead(ax));
}

einzeln.jpg

miss mal die Zeiten mit micros vor dem Messen und nach dem Messen damit du weist wie lange deine 501 Messungen brauchen.

und - Sketche stellt man in Code-tags rein zum rauskopieren, nicht als Grafik ...

Ok wird beachtet beim nächsten Mal.

Was meinst du mit micros vor und nach den dem Messen ich könnte mir darunter vorstellen ein Serial.Print vor und einen nach dem Messen also vor der Übertragung noch einfügen und dann im Seriellen Monitor den Zeitstempel einfügen?

Meinst du das damit?

bachatero18:
Ok wird beachtet beim nächsten Mal.

Das hilft aktuell keinem, auch nicht deinen Helfern.

Also mach es bitte direkt und du hast mehr Helfer.

Wurde erledigt.

So hab jetzt einfach mal vor der Messung und nach der Messung jeweils ein Serial.print eingefügt und den Zeitstempel dahinter gesetzt.

Mit 2.000.000 Baud war die Differenz 47 ms.

Mit 9.600 Baud war die Differenz 94 ms.

wobei die Serial.print Befehle ja auch ihre Zeit brauchen.

rein von der Zeit inkl. der Serial.print´s wäre es jetzt ungefähr 10Ks/s ist schon schneller aber eig. ja nicht das was der Nano können soll.

Weshalb misst er so langsam liegt das an dem Serial.print Befehl oder wie sehe ich das?
Der Chip daruaf hat ja 20 MHz wenn ich es das richtig verstanden habe brauch er für jeden Schritt 20 MHz und das wäre deutlich schneller als ich benötige?

Bitte im Datenblatt des µC, den ADC Abschnitt, aufmerksam lesen.

Also die Arduinos laufen mit 16Mhz also etwas langsamer als erwartet.
Hier: >Klick< ist zu entnehmen das ein analog Read 100µS dauert was "nur" beim messen und noch nix "getan" ca 10kS sind der Rest verhagelt dir Serial.print.
>HIERMIT< kommst du zum Ziel aber die Frage ist ob du 20.000 Messungen in der Sekunde vom Chip runterbekommst.
Faster

Gruß
DerDani

Ja auch gerade gesehen dass er mit 16 MHz läuft hatte die 20 MHz vom nackten Chip im Kopf.

Ok das macht alles soweit Sinn und geht auch mit den Beobachtungen auf.

Wäre schon schön die alle in der Zeit vom Chip runter zu bekommen.

Was ist eine Alternative ich bin nicht unbedingt an Arduino gebunden bin da relativ frei.

Wie sieht es mit einem nackten Mikrocontroller aus oder gibt es schnelle Arduinos die das schaffen?

Interessant dürfte auch "ADC conversion on the Arduino (analogRead)" von Nick Gammon sein (Gammon Forum : Electronics : Microprocessors : ADC conversion on the Arduino (analogRead)).

Da wird gezeigt wie der analogRead Vorgang beschleunigt werden kann.

Gruß, Jürgen

Es gibt zwei Möglichkeiten den ADC schneller machen, die auch kombinierbar sind

1.) man macht den Prescaler niedriger, damit der ADC mit einem höheren Takt läuft. Das kann auf Kosten der Genauigkeit gehen, aber meistens macht es nichts aus. Das geht auch mit analogRead()
2.) man programmiert den ADC per Hand und arbeitet mit dem Auto-Trigger Modus. Dann werden ständig im Hintergrund Messungen durchgeführt und am Ende jeder Messung bekommt man einen Interrupt . analogRead() dagegen wartet einfach bis zum Ende. Dazwischen kann man dann noch andere Dinge tun wie die serielle Übertragung. Die Daten kann man da gut mit einem Ringpuffer verarbeiten

Was auch noch geht ist dass man die Auflösung auf 8 Bit heruntersetzt. Damit hat man nur noch 1 Byte pro Messung statt 2

Für die zweite Version sind aber sehr gute Programmier-Kenntnisse und etwas mehr Sinn für das Zeitverhalten des Prozessors nötig