PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Blockweise Übertragung über USB - Datenlogger



Ruppi
09.09.2006, 08:09
Hallo,
ich möchte gerne einen schnellen AD-Wandler für einen Datenlogger nutzen. Die Wandler schafft bei 10bit 75kS. Wie überträgt man nun diese Datenflut an den PC? Ich nutze den FT232BM, allerdings überrtage ich nicht blockweise, sondern einzeln und komme da auf etwa 6000 Messwerte pro Sekunde. Ich habe ebenfalls schon versucht, die Werte im Mikrocontroller in ein Array (400 Messwerte) zu schreiben und dann blockweise zu übertragen, um mir am Ende ein Handshake zu ersparen. Ist aber trotzdem nicht unbedingt schneller. Sollte ich einen Speicher verwenden? Wenn ja, wie überrtage ich dann die Daten?

Hoffe, das Problem ist verständlich, vielen Dank...

RedBaron
09.09.2006, 12:25
HI,

10 Bit pro Datum heißt: 2 Byte pro Messwert (=> 20 Bit, 16 Daten-, 2 Start- und 2 Stoppbits)?
75kS heißt: 75.000 Messwerte pro Sec?
Wenn ich das richtig sehe, möchstest du dann ca. 1.500.000 Bit/Sec übertragen, schafftst aber nur ca. 60.000 (bzw. 120.000 bei 2 Byte)?

Der FT232BM sollte bis 2 Mbps schaffen.
Ein Standard-Com-Port kann 921600 Bit/Sec. Hast du einen entsprechenden Treiber, der mehr kann?
Hast du USB 2.0?
Richtige Baudrate eingestellt? (Welche?)
Handshake? (Welches?)

Wie wird der A/D-Wandler abgefragt? Deinem Text entnehme ich µC, aber seriell oder parallel? Welcher µC? Takt?

Ist definitv das Senden das Problem? Kannst du messen, ob du die Daten schnell genug aus dem Wandler abrufen kannst? (Zeitmessung per Timer bzw. µC-Takte)


Gruß Red Baron

Ruppi
10.09.2006, 13:34
Hallo,
20bit pro Messwert ist richtig. Ich muss dazu sagen, dass ich die direct-Treiber von FTDI nutze, nicht den virtuellen COM-Port.
Ich übertrage mit einem ATMega8 (Takt=18,432MHz) die Messwerte bei 1.152MBaud. Bei dieser Übertragungsrate liegt der Fehler der seriellen bei 0%. Das habe ich allerdings erst gestern nach dem Beitrag so eingestellt. Ich komme so auf 14000 Messwerte/s auf der Rechnerseite. Der Wandler ist ein ADS7822 (habe mich übrigens vertan, es ist ein 12bit-Wandler bei 75kS, aber macht ja keinen Unterschied). Der Messwert wird seriell ausgelesen und lässt sich bis 2,5MHz takten (wenn ich mich nicht verlesen habe).
Die Übertragung funktioniert in der Weise, dass ich n-Messwerte anfordere und der Controller mit dieser Anzahl antwortet. Intern packe ich die Messwerte in ein Array und übertrage dann blockweise. Durch das Handshake verliert man natürlich Zeit, daher sind größere Datenpakete schneller einzelne Messwerte.
Es geht mir nicht darum, alle Messwerte lückenlos zu übertragen, diese Datenflut wäre ja kaum zu bewältigen. Die Frage ist nur, ob ich einen externen Speicher verwenden sollte, um viele Messwerte lückenlos in einer Reihe zu übertragen.

RedBaron
15.09.2006, 23:55
Hallo Ruppi,

hatte einen Totalausfall des PC's. Jetzt kann ich wieder.

Ich würde wie folgt vorgehen:
Zunächst nur die Übertragung testen, d.h. keine Meßwerte auslesen, sondern einfach nur fortlaufende Zahlen schicken. Kommen alle an oder gibt es Aussetzer? Wie hoch ist die Übertragungsrate?

Dann Timerwerte senden. Kommen die gleichmäßig an oder gibt es Lücken?

Du sprichts von "Handshake". Meinst du eine eigenes z.B. Blocksicherung, CRC o.ä. oder ein Hardware-Handshake (CTS/RTS etc)? Kann dich dabei der Empänger "ausbremsen", d.h. der kommt nicht genügend schnell mit der Verarbeitung klar und gibt die Verbindung nicht frei? Ich hatte bei einem Übertragungsprogramm festgestellt, dass der Thread, der die Daten abnimmt, nur etwa alle 13 mSec zu Zuge kommt. Bei der hohen Datenübertragung kann es sein, dass die internen Puffer überlaufen.

Ist dein Code zu lang? Du hast pro Byte nur ca. 180 Takte (18 Mhz Takt / 1 Mbps * 10 Bit).

Hast du eine ähnlich einfache Sende-Routine wie die folgende?


void SerialWrite(unsigned char *data, unsigned char length)
{
unsigned char i = 0;

while (length > 0) {
if (UCSRA & 0x20) { // wait for empty transmit buffer
UDR = data[i++];
length --;
}
}
}
Diese benötigt ca. 40 Takte. Achte auf die Routine zum Auslesen des AD-Wandlers. Da muss es eine Schleife geben, die für jedes Bit einmal durchlaufen wird, also 12 mal.

Gruß Redbaron.