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]);
}
}
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?
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
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