Wie hoch kann die Baudrate sein (ohne Fehler)?

40

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?

Anonymer Pinguin
quelle
1
Es ist erwähnenswert, dass Arduino-Boards, die FTDI-USB-Seriell-ICs verwenden, WIRKLICH schnell arbeiten können. Das übliche FT232 kann problemlos mit 3 Megabaud (das sind 3.000.000 Baud) betrieben werden. Der Einsatz eines ATmega16U2 ist der limitierende Faktor.
Connor Wolf
Mein Klon Arduino Nano, den ich von eBay erhalten habe, hat ein Maximum von 1.099.999 erreicht. Ernsthaft. Es tat Sobald es 1.100.000 erreichte, wurde die Ausgabe verstümmelt. 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.
PNDA

Antworten:

59

Hier gibt es mehrere Faktoren:

  • Wie hoch ist die Baudrate der ATmega328P-MCU?
  • Wie hoch ist die Baudrate der USB-Serial-Schnittstelle?
  • Was ist die Oszillatorfrequenz beim ATmega328P?
  • Was ist die Oszillatorfrequenz an der USB-seriellen Schnittstelle (falls vorhanden)?
  • Wie tolerant ist die USB-serielle Schnittstelle bei Baudratenfehlanpassungen?

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:
Bildbeschreibung hier eingeben

Angesichts der angegebenen maximalen Baudrate von 2 Mbit / s habe ich ein schnelles Testprogramm geschrieben:

void setup(){};

void loop()
{

  delay(1000);
  Serial.begin(57600);
  Serial.println("\r\rBaud-rate = 57600");
  delay(1000);
  Serial.begin(76800);
  Serial.println("\r\rBaud-rate = 76800");
  delay(1000);
  Serial.begin(115200);
  Serial.println("\r\rBaud-rate = 115200");
  delay(1000);
  Serial.begin(230400);
  Serial.println("\r\rBaud-rate = 230400");
  delay(1000);
  Serial.begin(250000);
  Serial.println("\r\rBaud-rate = 250000");
  delay(1000);
  Serial.begin(500000);
  Serial.println("\r\rBaud-rate = 500000");
  delay(1000);
  Serial.begin(1000000);
  Serial.println("\r\rBaud-rate = 1000000");
  delay(1000);
  Serial.begin(2000000);
  Serial.println("\r\rBaud-rate = 2000000");
};

Und dann mit einem seriellen Terminal auf die entsprechende serielle Schnittstelle schauen:

Bildbeschreibung hier eingeben

Die Hardware kann also problemlos mit 2.000.000 Baud betrieben werden.

Beachten Sie, dass diese Baudrate der MCU 64 nur 80 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:
Bildbeschreibung hier eingeben
Jede Bit-Zeit beträgt 500 ns, was genau dem entspricht, was erwartet wird.

Performance-Probleme! Gesamtpaketlänge:
500 kBaud: Bildbeschreibung hier eingeben

1 MBaud: Bildbeschreibung hier eingeben

2 MBaud: Hinweis: Das auffällige Überschwingen ist auf schlechte Erdungspraktiken der Oszilloskopsonde Bildbeschreibung hier eingeben
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.

Connor Wolf
quelle
4
Schöne Illustration der Durchsatzbegrenzung!
jippie
1
@AnnonomusPerson - Wenn Sie auf eine 20-MHz-Uhr umschalten, können Sie 2,5 Mbit / s erreichen.
Connor Wolf
1
@AnnonomusPerson - Sie müssten beide austauschen oder eine FTDI-USB-serielle Schnittstelle mit einem 20-MHz-ATmega328P-Oszillator verwenden. Der ATmega328P kann ohne einen 20-MHz-Quarz / Resonator keine 2,5 Mbit / s erreichen. Gleiches gilt für alle ATmega16U2-Schnittstellen.
Connor Wolf
1
Gute Antwort! Nur eine kleine Korrektur: Bei 2 Mbit / s dauert jede Byte-Übertragung 80 CPU-Zyklen, nicht 64. Dies liegt daran, dass jedes Byte zeitlich 10 Bits wert ist (1 Start, 8 Daten, 1 Stopp).
Edgar Bonet
1
@ linhartr22 - Drähte kommen nur dann wirklich ins Spiel, wenn sie lang sind , wie in 12 "+. Ich denke, es ist wahrscheinlich unwahrscheinlich, dass zu viele Leute 100 Fuß lange Kabel zu viel verwenden. Außerdem war die Frage, wie hoch der Arduino / ATmega ist Baudrate kann gehen, nicht wie hoch eine beliebige Kabelkonfektion gehen kann
Connor Wolf
7

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.

Sachleen
quelle
Wenn Sie schneller und schneller arbeiten, wird die Beschränkung zur seriellen Bibliothek - ihre Implementierung ist nicht sehr effizient.
Cybergibbons
Website des Links ist tot
Codebeat
3

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.

jippie
quelle
1
Ich bezweifle wirklich WIRKLICH, dass einige der Boards Layoutprobleme haben, die schwerwiegend genug sind, um zu verhindern, dass ein 2-MHz-Signal einwandfrei funktioniert. 2 Mhz sind nicht gerade hochfrequent.
Connor Wolf
@FakeName Mindestens ein Board auf meinem Schreibtisch hat die BER erhöht, wenn ich die serielle Geschwindigkeit drücke. Ich verwende normalerweise 9600, das ist mehr als genug für die meisten Anwendungen und ist robust.
jippie
Im Ernst! Huh. Ich frage mich, wie schlecht das Layout sein muss, damit das passiert. Ich würde vermuten, dass es nicht so viel Layout ist wie Resonatoren / Kristalle mit schlechter Toleranz.
Connor Wolf
1
Hohe Baudraten, insbesondere U2Xn = 1im USART-Bereich, neigen dazu, sich über Fehlanpassungen zu ärgern.
Connor Wolf
@FakeName Ich bin ein Dinosaurier, ich mag ein bisschen "9600 8N1" aus all den falschen Gründen, die Sie sich
vorstellen
2

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.hund Sie sollten in kürzester Zeit einsatzbereit sein mit den beigefügten Beispielen.

CRC ist für einfache Anwendungen recht robust und schnell.

80HD
quelle