Taktrate beim Auslesen

Moin zusammen,

ich habe eine Frage zu der Taktrate bei der Ausgabe von Werten.
Ich möchte gerne ein Signal auslesen, das eine Trägerfrequenz von 9 kHz hat.
Dafür habe ich mir, um einen groben Überblick zu bekommen, die Zeitstempel angeschaut und 10.000 Werte ausgeben lassen. Hierbei komme ich auf 15.33 Sekunden, also 0,001533 Sekunden (652 Hz) pro Ausgabe .
Sehe ich das richtig, dass mit der einfachen Verwendung von Serial.print kein schnellerer Takt erreicht werden kann?
Über eine Antwort würde ich mich freuen.

Bsp.:

int i=10000;
void setup() {
Serial.begin(9600);
}

void loop() {
while(i==0)
{
}
Serial.println(i);
i--;
}

Serial.begin(9600);

Dieser Wert ist nicht in Stein gemeißelt, da geht auch mehr.

Das Maximum hängt vom Arduino und seinem Takt ab. Ein PullDown-Menü des seriellen Monitors gibt Dir Hinweise, aber auch die Beschreibungen zu den µCs.

Vielen Dank für die schnelle Antwort!
Also kann ich meinen ATMEGA 2560 (16MHz) maximal auf 500k oder 1M bps setzen, ohne das es zu Fehlern kommt. Das sind dann ung. 5kHz für die auszulesenden Daten.

Gibt es noch eine schneller Möglichkeit? Würde es etwas bringen, wenn ich die Daten direkt auf einer SSD speichern würde, statt auf dem PC auszugeben?

Drag1011100:
Gibt es noch eine schneller Möglichkeit?

Ja, bei Arduinos mit eigener USB-Schnittstelle, also ohne USB-Seriell Wandler, ist die Geschwindigkeit meist deutlich höher. Die bei Serial.begin angegebene Geschwindigkeit spielt zumindest bei den Teensy Boards laut deren Doku keine Rolle. Das sollte meiner Meinung nach allgemein gelten, also z.B. auch für Arduino Leonardo/Micro, Zero und Due. Die Implementierungen unterscheiden sich aber noch in ihrer Effizienz.

Drag1011100:
Würde es etwas bringen, wenn ich die Daten direkt auf einer SSD speichern würde, statt auf dem PC auszugeben?

Meinst du eine SD Karte ? Eine echte SSD ist am Arduino etwas schwierig.

Auch da gibt es Unterschiede bei der Anbindung. SPI ist langsamer als SDIO.

Hi

Die Serielle-Schnittstelle ist zum Rest eines PC grotten-lahm.
Die anfangs gezeigten 9600 Baud sagen ja nur, daß 9600 Bits pro Sekunde übertragen werden.
Jedes Byte wird mit einem Start- und einem Stop-Bit übertragen, plus die 8 Bit des Byte selber, sind 10 Bit pro Zeichen nötig.
Bei (knapp) 10000 Bits/Sekunde entspricht Das ziemlich genau 1000 Zeichen, Die in einer Sekunde übertragen werden.

An den 10 Bit pro Zeichen kannst Du nicht viel rütteln, an der Geschwindigkeit schon - Das sollte sogar in beide Richtungen möglich sein, wenngleich noch langsamer kaum Sinn macht.

MfG

Auf einem normalen Arduino, wie Uno oder Mega, finden die 9600 Bit pro Sekunde aber nur zwischen dem Controller und dem USB-Interface IC statt. Der USB überträgt die Daten dann paketweise, normalerweise mit 11 MBit/s, die meisten Arduinos sind USB 2.0 High Speed Devices.

Beim USB ist der PC der Master, er fragt die Daten vom Arduino ab. Das ist zusammen mit der USB Busauslastung natürlich auch ein Geschwindigkeitsfaktor, aber eher ein kleiner.

Ein wichtiger Faktor ist das Umpacken der Bytes in USB Datenpakete. Normalerweise wartet ein Wandler eine gewisse Zeit auf weitere Datenbytes vom Arduino, wenn ein Datenpaket noch nicht voll ist. Er vermeidet das ineffiziente Senden nicht voller Pakete. Damit holt man sich aber auch wieder eine Verzögerung hinein.

Diese Paketproblematik haben auch die Boards mit nativem USB. Da hängt es von der Implementierung und ggf. Einstellmöglichkeiten ab, diese Zeiten zu reduzieren.

Die Prozessorleistung des Arduinos (Interrupts) trägt auch noch etwas zur USB Performance bei. Die 32 Bitter sind da im Vorteil gegenüber Leonardo und Co.

Die 1,5 ms pro gesendete Zeile beim Uno aus dem Ausgangspost klingen realistisch. Ein Due dürfte etwa auf ein Zehntel davon kommen (auf native Port). Ein Teensy 3.2 etwa auf unter 40 Mikrosekunden. Etwas drücken kann man das eventuell mit Teensy 3.5 oder 3.6. Viel mehr geht nur mit dem Teensy 4.0. Der ist ein USB 2.0 Full Speed Device mit 480 MBit/s. Im dortigen Forum gibt es einen Testsketch, der 350000 Zeilen pro Sekunde raushaut, ich glaube mit 32 oder 40 Zeichen pro Zeile.

Hallo,

was willst du denn mit dem Signal machen?
Also was willst du vom Signal einlesen?
Musst du 10.000 Werte am Stück einlesen?
Oder kannst du auch immer nur 100 am Stück und dann die Nächsten?
Der Programmcode zum einlesen etc. drückt dir zusätzlich die Samplerate.
Die Serielle würde ich noch nicht einmal als Hauptproblem ansehen.

Erstmal vielen Dank für die hilfreichen Posts!

Ich meinte natürlich eine SD-Karte.
Ich werde mir dann nochmal genau die Teensys anschauen.

Ich verwende einen LVDT, der die lineare Bewegung eines Weicheisenkerns, in ein Signal umwandelt. Dieser hat eine Trägerfrequenz von 9 kHz. Laut dem Nyquist-Abtasttheorem, muss ich daher mit mind. 18 kHz die Daten auslesen. Ich benutzte zudem ein ADS1115 ADC Modul mit 16bit. Meine Signalgröße muss hierbei bis zu 14 Bits betragen.

Eventuell kann man auf einem Teensy auch die Datenerfassung teilweise per DMA im Hintergrund ablaufen lassen. Da gibt es auch fertige Libraries für I2C oder SPI, die das machen. Bei Analogsignalen schau Dir die ADC-Library an, die bei der Teensy Software dabei ist.

Der erwähnte Teensy 4.0 ist übrigens noch sehr neu, nicht alle Libs sind schon portiert. Aber schnell ist er :slight_smile:

Drag1011100:
Ich werde mir dann nochmal genau die Teensys anschauen.

Wenn Du schon dabei bist, den Blick zu weiten, wirf auch einen auf ESP8266 und ESP32. Da kannst Du die Daten auch durch die Luft schicken. Der ESP32 kann auch als Accesspoint fungieren, benötigt also kein fremdes WLAN. Ob Dir das wirklich hilft, vermag ich leider nicht abzuschätzen.