Ich möchte das Signal messen ADC
und Messungen an den PC senden, um Diagramme zu erstellen.
Mein Code:
ADC_SoftwareStartConv(ADC3);
while(1)
{
ADC3ConvertedVoltage = ADC3ConvertedValue * 3300/0xFFF;
ADCresultsTab[i] = ADC3ConvertedVoltage;
sprintf(str,"%u",ADC3ConvertedVoltage);
USART2_SendText(str);
USART2_SendText(";");
}
Das Problem ist, dass ich das Signal so schnell wie möglich abtasten möchte. Hier verwende ich baud rate = 256000
(nur Windows). Was ist die Möglichkeit, Signale schneller abzutasten? Was ist ein optimalerer Code für die Proben- und Sendemessung?
Ich sehe, dass das Problem dort UART
die Übertragung ist.
Und meine zusätzlichen Fragen sind: Ist es Echtzeitmessung mit diesem Code? Wie sollte es gemacht werden, wenn ich eine Echtzeitmessung möchte?
Während ein ausgefeilterer Interrupt- oder DMA-basierter Code erforderlich wäre, um die beste Leistung zu erzielen, würden relativ geringfügige Verbesserungen an Ihrem Code die Situation bereits verbessern. Ich würde damit beginnen, Samples in Binärform statt in Text zu übertragen. Dies erfordert etwas mehr Arbeit auf der Empfängerseite, reduziert jedoch die erforderliche UART-Bandbreite um mindestens das 2-3-fache (2 Bytes pro Abtastung gegenüber bis zu 6 in Text mit Trennzeichen). Sie können die Baudrate auch problemlos auf zB 921,6 kbps erhöhen, was Standard ist und auf der Empfängerseite gut unterstützt werden sollte. Unter der Annahme einer Standard-STM32F2-Architektur könnten Sie bis zu 7,5 Mbit / s erreichen, aber Sie müssten die Unterstützung dafür auf der Empfängerseite überprüfen.
Bei 2 Bytes pro Sample und 921.6kbps ergäbe sich ein Durchsatz von ca. 46'000 Samples/s. Bei 7,5 Mbit/s erhalten Sie 370.000 Samples/s. Wenn Ihre Anwendung dies zulässt, können Sie die Auflösung auf 8 Bit reduzieren und somit ein einzelnes Byte pro Sample verwenden, wodurch sich der Durchsatz in Samples/s effektiv verdoppelt.
Während 370 kSamples/s nicht schlecht sind, sind sie immer noch ziemlich weit von den theoretischen 6 Msamples/s entfernt (unter der Annahme von STM32F2, 12-Bit-Konvertierung und Verwendung des 3 ADC im Triple-Interleaved-Modus). Dies entspricht 12 MB/s an Daten, die von der MCU auf den Computer übertragen werden müssen, was keine unbedeutende Menge ist. UART geht nicht. SPI mit maximal 30 Mbit / s (2-3 MB / s) reicht auch nicht aus. Das Schreiben auf eine microSD-Karte per SDIO käme dem nahe. USB 2.0 würde es tun, ist aber softwaremäßig viel komplizierter und erfordert externe Komponenten für den PHY. ETH würde auch gut funktionieren, würde aber zusätzliche Komponenten und einen Netzwerk-Stack erfordern, der auf der MCU implementiert werden müsste. Diese Komplexität erklärt, warum in den meisten Anwendungen die Samples im Speicher gepuffert und asynchron übertragen werden.
Es ist wahrscheinlich auch erwähnenswert, dass der sprintf
Aufruf wahrscheinlich ziemlich langsam ist und (wenn Sie ihn nur einmal verwenden) eine Menge Bibliothekscode einzieht. Selbst wenn Sie für Menschen lesbares ASCII beibehalten möchten, könnten Sie die Nummer wahrscheinlich viel schneller selbst serialisieren als sprintf. Wenn Sie schon dabei sind, könnten Sie das Semikolon in die Zeichenfolge einfügen und nur einen Aufruf an USART2_SendText
.
Jippie
krzych
Jippie
fm_andreas
Lior Bilia
Scott Seidmann