Der Standard ist 9600 Baud. Das ist nur der Standard . Was ist die höchste praktische Baudrate, die ich mit einem Arduino Uno SMD R2 erreichen kann?
Bonuspunkte für Mutige: Wie würden Sie vorgehen, um einen Fehlerüberprüfungsmechanismus zu erstellen und dann die Baudrate lächerlich hoch zu erhöhen, um hohe Übertragungsraten zu erzielen?
arduino-uno-smd
Anonymer Pinguin
quelle
quelle
laqq`na`fca`fga`fga`bcngaah````iin`ha`a`a`bga`fga`bcqpahhqfq```fh`oopa`bca`fca
. Es verwendet einen CH340-Chip für USB-Kommunikation.Antworten:
Hier gibt es mehrere Faktoren:
Alle diese Faktoren sind für die Bestimmung der maximal erreichbaren Baudrate relevant. Der ATmega328P verwendet einen Hardware-Divisor aus seiner Taktrate, um den Basistakt für die serielle Schnittstelle zu generieren. Wenn zwischen dem Haupttakt und der Bit-Zeit der gewünschten Baudrate kein ganzzahliges Verhältnis besteht, kann die MCU die gewünschte Rate nicht exakt erzeugen. Dies kann zu potenziellen Problemen führen, da einige Geräte wesentlich empfindlicher auf Baudratenfehlanpassungen reagieren als andere.
FTDI-basierte Schnittstellen sind sehr tolerant gegenüber Baudratenfehlanpassungen, bis zu mehreren Prozent Fehler. Ich habe jedoch mit speziellen eingebetteten GPS-Modulen gearbeitet, die nicht einmal einen Fehler mit einer Baudrate von 0,5% bewältigen konnten.
Allgemeine serielle Schnittstellen tolerieren einen Baudratenfehler von ~ 5%. Da jedoch jedes Ende ausgeschaltet sein kann, beträgt eine häufigere Spezifikation + -2,5%. Auf diese Weise beträgt Ihr Gesamtfehler immer noch nur 5% , wenn ein Ende 2,5% schnell und das andere 2,5% langsam ist.
Sowieso. Das Uno verwendet einen ATmega328P als primäre MCU und einen ATmega16U2 als serielle USB-Schnittstelle. Wir haben auch das Glück, dass diese beiden MCUs ähnliche USARTs sowie 16-MHz-Uhren verwenden.
Da beide MCUs die gleiche Hardware und Taktrate haben, haben sie beide den gleichen Baudratenfehler in die gleiche Richtung, sodass wir das Problem des Baudfehlers funktional ignorieren können.
Die "richtige" Antwort auf diese Frage würde jedenfalls darin bestehen, die Quelle für den ATmega16U2 auszuloten und die möglichen Baudraten von dort aus zu ermitteln. Da ich jedoch faul bin, denke ich, dass einfache empirische Tests funktionieren werden.
Ein kurzer Blick auf das Datenblatt des ATmega328P ergibt die folgende Tabelle:
Angesichts der angegebenen maximalen Baudrate von 2 Mbit / s habe ich ein schnelles Testprogramm geschrieben:
Und dann mit einem seriellen Terminal auf die entsprechende serielle Schnittstelle schauen:
Die Hardware kann also problemlos mit 2.000.000 Baud betrieben werden.
Beachten Sie, dass diese Baudrate der MCU
64 nur80 Taktzyklen pro Byte ermöglicht, so dass es sehr schwierig wäre, die serielle Schnittstelle beschäftigt zu halten. Während die einzelnen Bytes sehr schnell übertragen werden können, wird es wahrscheinlich viel Zeit geben, wenn die Schnittstelle einfach inaktiv ist.Edit: Tatsächliches Testen!
Die 2 Mbit / s sind real:
Jede Bit-Zeit beträgt 500 ns, was genau dem entspricht, was erwartet wird.
Performance-Probleme! Gesamtpaketlänge:
500 kBaud:
1 MBaud:
2 MBaud: Hinweis: Das auffällige Überschwingen ist auf schlechte Erdungspraktiken der Oszilloskopsonde
zurückzuführen und wahrscheinlich nicht real. Ich verwende die Masseklemme, die Teil meiner Oszilloskop-Sonde ist, und die Leitungsinduktivität ist wahrscheinlich die Ursache für den Großteil des Überschwingens.
Wie Sie sehen, ist die Gesamtübertragungslänge für 0,5, 1 und 2 MBaud gleich. Dies liegt daran, dass der Code, der die Bytes in den seriellen Puffer legt, schlecht optimiert ist. Als solches werden Sie niemals etwas Besseres als effektive 500 Kbaud erreichen, es sei denn, Sie schreiben Ihre eigenen seriellen Bibliotheken. Die Arduino-Bibliotheken sind sehr schlecht optimiert, so dass es wahrscheinlich nicht allzu schwierig wäre, richtige 2 MBaud zu erhalten, zumindest für Burst-Übertragungen, wenn Sie ein wenig Zeit damit verbringen.
quelle
Das Arduino Serial Monitor-Fenster beschränkt Sie auf 115200, aber das ist nicht die höchste Baudrate, die möglich ist. Sie können die Datenblätter Atmel und FT232 (oder was auch immer Sie verwenden) lesen, um das Maximum herauszufinden, aber ich bin in der Lage, 230400 (doppelt so schnell wie das größte, das der serielle Arduino-Monitor unterstützt) ohne Probleme erfolgreich zu verwenden.
Wenn Sie die Ergebnisse auf Ihrem Computer anzeigen möchten, benötigen Sie einen anderen seriellen Monitor, der andere Optionen für die Baudrate unterstützt. Ich mag CoolTerm und Termite .
Beachten Sie, dass dies auch stark von Ihrer Taktrate abhängt.
Hier ist ein Taschenrechner , der Ihnen bei der Berechnung der Möglichkeiten hilft.
quelle
Dies ist wahrscheinlich einer der wenigen Aspekte, bei denen sich el-Cheapo-Boards von Original-Boards unterscheiden. Die maximale serielle Übertragungsrate ist nur durch die Qualität der Karte und deren Layout begrenzt. Sobald die seriellen Daten entweder auf dem AVR- oder dem USB-Schnittstellen-Chip eingehen, werden sie anders verarbeitet als das serielle UART-Protokoll.
Beachten Sie jedoch, dass der Mikrocontroller über einige grundlegende Hardware verfügt, um serielle Daten zu / von den E / A-Pins zu verschieben. Die absolute Maximalrate ist jedoch auf den 16-MHz-Takt begrenzt (für AVRs). Sobald ein Byte in den seriellen Puffer verschoben wurde, übernimmt die UART-Hardware die Aufgabe und schiebt die Bits selbstständig heraus bzw. zieht sie ein. Ein AVR erreicht bestenfalls 16 Millionen Befehle pro Sekunde und die zum Füllen des seriellen Puffers verwendeten Interrupts haben einen gewissen Overhead (mindestens 8 Takt-Ticks für die Interrupt-Behandlung + Befehle zum Speichern des aktuellen Zustands + mehrere Befehle zum tatsächlichen Füllen des Puffers). Bei einer bestimmten Bitrate wird das Protokoll mit satten n Bits pro Sekunde ausgeführt, aber Ihr Controller benötigt mehr Zeit zum Füllen des seriellen Puffers als zum tatsächlichen Ausgeben der Daten, was zu einem geringeren durchschnittlichen Durchsatz als erwartet und zum UART-Leerlauf führt für eine relativ lange Zeit.
Ein weiterer zu beachtender Effekt ist, dass der gesamte Overhead, der erforderlich ist, um Daten auf den UART zu übertragen (oder in den UART zu übertragen), nicht in Ihr tatsächliches Programm investiert werden kann, was wiederum den durchschnittlichen praktischen Durchsatz beeinflusst. Sie können jeden Befehlszyklus nur einmal verwenden, entweder zum Füllen des Puffers oder zum Berechnen der Hauptschleife.
Der maximale Durchsatz hängt daher von der von Ihnen verwendeten Anwendung ab (wie schnell werden Daten generiert / berechnet / sind bereit, in den / aus dem seriellen Puffer verschoben zu werden) und die tatsächliche "physikalische" Bitrate ist nur ein kleiner Teil der Entwurfsentscheidung.
quelle
U2Xn = 1
im USART-Bereich, neigen dazu, sich über Fehlanpassungen zu ärgern.Die Fehlerüberprüfung ist eigentlich sehr einfach und es gibt eine AVR-Bibliothek, die dies in einem einzigen Liner erledigt.
Lesen Sie weiter
util/crc16.h
und Sie sollten in kürzester Zeit einsatzbereit sein mit den beigefügten Beispielen.CRC ist für einfache Anwendungen recht robust und schnell.
quelle