Beste und schnellste Möglichkeit zum Auslesen eines ADC

Hi,

ich lese einen ADC mittels SPI aus. Dieser kann bis zu 250kSPS.
Nun ist meine Frage wie ich die Daten am besten auf den PC bekomme. Ich habe den Arduino Nano mittels USB Kabel an den PC angeschlossen. Die ausgelesenen Daten möchte ich dann am PC weiterverarbeiten. Was ist da die beste und va schnellste Möglichkeit?

Hier ein kurzes Beispiel wie ich es gerade noch mache:

void Continuousconversation(long numbers){
  int Outputstate=1;
  digitalWrite(CS, LOW);

for (int i = 0; i <numbers; i++) {

Outputstate=1;
   while (Outputstate==1){
  Outputstate=digitalRead(DOUT);
 }
unsigned long Data_Register= readRegisterconversion(0b01000100, 3);

Serial.print(Data_Register);
Serial.print("\t"); 
Serial.println(Data_Register,BIN);
//delay(100);
}
digitalWrite(CS, HIGH);
}

Ich gebe jeden Wert noch sofort aus.
Allgemein habe ich die zwei Fragen:
Wenn ich jeden Wert sofort ausgeben möchte, gibt es eine Alternative zu Serial.print die schneller ist?
Und wenn ich die Werte erst danach ausgeben möchte was wäre da der beste ansatz? Soll ich alle Werte in ein Array schreiben und das anschließend ausgeben oder ist der Ansatz auch nicht optimal? Wie viele Werte könnte ich in so ein Array schreiben?

Danke euch

Ist das Problem allgemein, wie du die am PC weiterverarbeiten kannst? Da gibt es tausend Möglichkeiten, such dir deine Sprache raus.

Allgemein habe ich die zwei Fragen:
Wenn ich jeden Wert sofort ausgeben möchte, gibt es eine Alternative zu Serial.print die schneller ist?

Baudrate hochschrauben, oder I2C nutzen. I2C geht am PC jedoch wieder nicht direkt, am RaspBerry schon. Denke aber, dass du selber eine Baud von 9600 nicht ausreizen kannst für dein Projekt.

Ich habe die Baudrate schon auf 115200 und SPi auf SPI_CLOCK_DIV2.

Ich suche halt die schnellste Möglichkeit die Werte auf den PC zu bekommen. Die Daten verarbeite ich dann am PC mit Matlab weiter.
Wenn ich Serial.println mache, dauert das zu lange, dann kann ich nicht jeden Wert des ADC auslesen. Darum war meine Frage wie ich das am besten lösen könnte.

Der Ablauf ist ja bei mir gerade so:

SPI-Wert auslesen
Wert per Serial.println an PC senden
Nächsten Wert auslesen

Nur dass das Ganze etwas zu langsam ist

Was heißt genau, zu langsam. Wieviel Messwerte benötigst du pro Sekunde?

die schnellste Möglichkeit die Werte auf den PC zu bekommen

Wenn du am PC nicht mit Java liest, sondern z.B. in C#, kannst du bis 500.000 Bd fahren. *)
Wenn du die Daten auf 0 .. 255 trimmst und binär überträgst, brauchst du 1 byte/Messwert und sparst dir eine Menge Arbeit, bei ein wenig geringerer Auflösung.
Wie du das (schnell genug) nach Matlab kriegst, hab ich allerdings keine Ahnung.

*) Nachtrag:
Mit dem FT232RL chip auf dem Nano habe ich keine Erfahrungen, aber der 16MHz atmega328 UART und USB können das.

Ich kann den ADC von der Geschwindigkeit einstellen.
Aber das Maximum wären 250000 Werte in der Sekunde.

Mir würde es auch erstmal reichen die in ein Textfile auf den PC zu bekommen. Das ich anschließend auslese. Aber da weis ich eben nicht was am schnellsten funktionieren würde. Den Adc möchte ich eigentich auch kontinuierlich laufen lassen und darum wäre die Lösung am schönsten jeden Wert einzeln zu übertragen und anschließend den nächsten Wert auszulesen.

Auf dem PC 250kB/s in eine Datei zu schreiben ist keine Kunst.
Wenn du
** **Serial.begin(500000);** **
machst, kannst du jeden Messwert locker als 1 Byte senden und hast fast 50% Ruhe auf der Leitung. ( edit : Vertan, vertan, danke Udo. details siehe unten ) und kannst bis zu 50 Werte/ms senden.
Wie du aus deinem
** **unsigned long Data_Register** **
eine Zahl 0 .. 255, die deinem Messwert entspricht, kriegst, weiss ich nicht. Ansonsten:

** **byte data = getData(DataRegister); // ? Serial.write(data);** **

Ich bin leider noch ein Anfänger, darum jetzt eine für dich leichte Frage.
Was wäre denn ein geeingentes Programm mit dem ich den Arudino auslesen kann. Ich hatte vor Tera Term zu nehmen. Oder ist ein anderes Programm geeigneter? Es soll ja nur den Arduino auslesen und die Daten in ein Txt File schreiben

Was ist der maximal WErt für Serial.begin beim Arduino Nano?

Bei Terminal-Programmen ist die Frage, was die mit Binärdaten, insbesondere einer 0 , machen: keine Ahnung.

Wenn es ein Windows PC ist: Ich würde Visual Studio Express nehmen und .net programmieren lernen.
Geht alternativ wohl auch mit einem Powershell script, das ist aber eher schwerer zu lernen.

Selbstprogrammiert hast du die Wahl, ob du die Daten binär 1:1 speichern willst, oder auf dem PC in Text wandeln willst.
Die dreifache Menge sollte immer noch zeitlich gehen, zum Beispiel:

  0 -> "00 " 
  1 -> "01 "
...
255 -> "FF "

Oder ( 5fache Menge = 1,25MB/s ) jedes Byte als DezimalZahl in einer neuen Zeile

"  0\r\n"
...
"255\r\n"

Alternativ, auf dem Nano zwischenspeichern, geht übrigens wohl nur für ca. 1000 bis 1500 byte ( also ca. 5 ms high speed ADC ), wenn der Nano ein 328er ist. Da ist's natürlich schwer, den richtigen Start- oder Stop-Zeitpunkt zu finden. Dafür hat man dann hinterher nicht so viel Müll auszuwerten. Für einen bildschirmbreiten Trend sollte es reichen.

Google mal Arduino-Oszilloskope, die kämpfen auch mit deiner Grenze, wobei der Arduino ADC eher ein bisschen langsamer ist.
:wink:

maximal Wert für Serial.begin beim Arduino Nano

Hat mit dem Nano selbst nichts zu tun: der UART Takt wird vom Prozessor-Takt (16Mhz) abgeleitet.
Daher sind Teiler von 1.000.000 besser als die klassischen Vielfachen von 115.200

Mit einem CP2102 oder einem 16U2 wie beim Uno gehen 500.000. Den FTDI kenne ich nicht, wie gesagt, sollte aber kein Problem sein.
Theoretisch gilt:

Serial.begin( unsigned long );

Mit 500 000 Baud kann man (unkomprimiert) keine 100 kBytes pro Sekunde übertragen.

--> Was Du brauchst ist eine schnellere Schnittstelle z.B. etwas das nativ USB unterstützt (wie z.B. der Leonardo). Um 250 kByte / Sekunde zu übertragen muesste der Arduino pro Sekunde 2 000 000 Bits durchschieben, also alle 4 Takte ein Bit. Das stelle ich mir mehr als sportlich vor.

Oops, bin ich tatsächlich mal wieder in die Baud = bit/s != byte/sec Falle getappt...
Stimmt: 500.000 Bd sind max 50kB/s und man könnte bequem 25.000 Byte-Werte/s übertragen, aber nicht das zehnfache.
Merke: Serial ist ab 9600 zwar schneller als man mitlesen kann, aber immer langsam.

Ethernet wäre auch eine schnellere und weit verbreitete Möglichkeit.
Die Kommunikation zum Ethernet-Shield wäre schnell wie zum ADC SPI Modul.
Da es nur eine Schnittstelle ist, die abwechselnd mit der Ethernet card und dem ADC redet, halbiert sich die Übertragungsrate...
Immerhin besser als der Faktor 1/10 bei Serial