(エラーなしで)どのくらいのボーレートを使用できますか?


40

標準は9600ボーです。それは単なる標準です。Arduino Uno SMD R2を使用すると、達成できる最高の実用的なボーレートはどれくらいですか?

大胆不敵な点:エラーチェックメカニズムを作成し、ボーレートをばかげて高くして、高い転送レートを得るにはどうすればよいでしょうか?


2
FTDI USBシリアルICを使用するArduinoボードが非常に高速になることは注目に値します。一般的なFT232は、3メガボー(3,000,000ボー)で問題なく動作します。ATmega16U2の使用が制限要因です。
コナーウルフ14

1
eBayから入手した私のクローンArduino Nanoは1,099,999で限界に達しました。真剣に。やった 1,100,000に達すると、出力は文字化けしました。laqq`na`fca`fga`fga`bcngaah````iin`ha`a`a`bga`fga`bcqpahhqfq```fh`oopa`bca`fca。USB通信にCH340チップを使用します。
PNDA

回答:


59

ここにはいくつかの要因があります。

  • ATmega328P MCUはどのくらいのボーレートを達成できますか?
  • USB-シリアルインターフェースはどのくらいのボーレートを達成できますか?
  • ATmega328Pの発振器周波数は何ですか?
  • USBシリアルインターフェイスの発振器周波数(ある場合)。
  • ボーレートの不一致のUSBシリアルインターフェイスはどの程度耐性がありますか?

これらの要因はすべて、達成可能な最大ボーレートの決定に関連しています。ATmega328Pは、クロックレートのハードウェア除数を使用して、シリアルインターフェイスのベースクロックを生成します。メインクロックから目的のボーレートのビット時間までの整数比がない場合、MCUは目的のレートを正確に生成できません。一部のデバイスは他のデバイスよりもボーレートの不一致により敏感であるため、これは潜在的な問題につながる可能性があります。

FTDIベースのインターフェイスは、ボーレートの不一致に対して非常に寛容であり、最大数パーセントのエラーが発生します。ただし、0.5%のボーレートエラーさえ処理できない特殊な組み込みGPSモジュールを使用しました。

一般的なシリアルインターフェイスは、最大5%のボーレートエラーを許容します。ただし、両端がオフになる可能性があるため、より一般的な仕様は+ -2.5%です。このように、一方の端が2.5%速く、もう一方の端が2.5%遅い場合、全体的なエラーはまだ5%だけです。


いずれかの方法。Unoは、プライマリMCUとしてATmega328Pを使用し、USBシリアルインターフェイスとしてATmega16U2を使用します。また、これらのMCUの両方が同様のハーウェアUSARTと16 Mhzクロックを使用しているという点でも幸運です。

両方のMCUのハーウェアとクロックレートが同じであるため、同じ方向のボーレートエラーが同じになるため、ボーエラーの問題を機能的に無視できます。

とにかく、この質問に対する「適切な」答えは、ATmega16U2のソースを掘り起こし、そこから可能なボーレートを計算することを含みますが、私は怠け者なので、単純で経験的なテストがうまくいくと思います。

ATmega328Pデータシートを一目で見ると、次の表が生成されます。
ここに画像の説明を入力してください

ボーレートの最大値が2 Mbpsであるため、簡単なテストプログラムを作成しました。

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");
};

そして、シリアル端末で関連するシリアルポートを見る:

ここに画像の説明を入力してください

したがって、ハードウェアは問題なく2,000,000ボーで実行できるようです。

このボーレートは、バイトあたりMCU 64 80のクロックサイクルのみを提供するため、シリアルインターフェイスをビジー状態に保つことは非常に難しいことに注意してください。個々のバイトは非常に高速に転送される場合がありますが、インターフェイスが単にアイドル状態になっている場合は、多くの時間が発生する可能性があります。


編集:実際のテスト!

2 Mbpsは実際です。
ここに画像の説明を入力してください
各ビット時間は500 nsであり、これは予想されるものと正確に一致します。

パフォーマンスの問題!全体のパケット長:
500 Kbaud: ここに画像の説明を入力してください

1 Mbaud: ここに画像の説明を入力してください

2 Mbaud: ここに画像の説明を入力してください
注:顕著なオーバーシュートは、スコーププローブの接地方法が不十分なためであり、おそらく現実的ではありません。スコーププローブの一部であるグランドクリップリードを使用していますが、リードインダクタンスがオーバーシュートの大部分の原因である可能性があります。

ご覧のとおり、全体の伝送長は0.5、1、2 Mbaudで同じです。これは、シリアルバッファーにバイトを配置するコードが最適化されていないためです。そのため、独自のシリアルライブラリを作成しない限り、効果的な 500 Kbaudを超えることはありません。Arduinoライブラリは最適化が非常に不十分であるため、少々時間を費やせば、少なくともバースト送信のために適切な2 Mbaudを取得するのはおそらくそれほど難しくないでしょう。


4
スループットの制限のわかりやすい説明!
ジッピー14

1
@AnnonomusPerson-20 Mhzクロックに切り替えると、2.5 Mbpsを実行できます。
コナーウルフ

1
@AnnonomusPerson-両方を交換するか、20 Mhz ATmega328PオシレーターでFTDI usbシリアルインターフェイスを使用する必要があります。ATmega328Pは、20 MHzの水晶/共振器なしでは2.5 Mbpsを実行できません。ATmega16U2インターフェイスについても同様です。
コナーウルフ14

1
素晴らしい答えです!1つの小さな修正:2 Mb / sで、各バイト送信には64ではなく80 CPUサイクルがかかります。これは、時間的には各バイトが10ビット(1スタート、8データ、1ストップ)の価値があるためです。
エドガーボネット

1
@ linhartr22-ワイヤーは、12 "+のように長い場合にのみ実際に機能します。100フィートの長さのケーブルを使用しすぎる人が多すぎるとは考えにくいでしょう。さらに、質問はarduino / ATmegaボーレートは、アセンブリに行くことができますどのように高い任意のケーブルではなく、行くことができます。
コナーウルフ

7

Arduino Serial Monitorウィンドウでは115200に制限されていますが、これは最高のボーレートではありません。AtmelとFT232(または使用しているもの)のデータシートを読んで最大値を確認できますが、230400(Arduino Serial Monitorがサポートする最大の2倍)を問題なく使用できます。

コンピューターで結果を表示する場合は、他のボーレートオプションをサポートする別のシリアルモニターが必要になります。CoolTermTermiteが好きです

これはクロック速度にも大きく依存することに注意してください。

ここだ電卓可能です何の計算のお手伝いをするためには。


どんどん速くなっていくと、制限がシリアルライブラリになります。その実装はあまり効率的ではありません。
サイバーギボン14

リンクのウェブサイトは死んでいる
Codebeat

3

これはおそらく、El-Cheapoボードが元のボードと異なる数少ない側面の1つです。最大シリアル転送速度は、ボードの品質とそのレイアウトによってのみ制限されます。シリアルデータがAVRまたはUSBインターフェイスチップに入ると、データはシリアルUARTプロトコルとは異なる方法で処理されます。

ただし、マイクロコントローラーにはシリアルデータを入出力ピンから入出力する基本的なハードウェアがいくつかありますが、絶対最大レートは16MHzクロック(AVRの場合)に制限されます。バイトがシリアルバッファに移動されると、UARTハードウェアがそれ自体を引き継いでビットをプッシュ/プルインします。AVRはせいぜい16M命令/秒に達し、シリアルバッファーを満たすために使用される割り込みにはオーバーヘッドがあります(割り込み処理に少なくとも8クロックティック+現在の状態を保存するための命令+実際にバッファーを満たすためのいくつかの命令)。所定のビットレートでは、プロトコルは毎秒nビットの途方もない速度で実行されますが、コントローラーが実際にデータを出力するのに必要な時間よりもシリアルバッファーを埋めるのにより多くの時間を必要とするため、平均スループットが予想より低くなり、UARTがアイドル状態になります比較的長い間。

覚えておくべきもう1つの効果は、データをUARTにプッシュ(またはプル)するために必要なすべてのオーバーヘッドを実際のプログラムに費やすことができず、平均的な実際のスループットに影響することです。バッファの充填またはメインループの計算のために、すべての命令サイクルを1回しか使用できません。

したがって、最大スループットは、使用するアプリケーション(シリアルバッファーとの間でデータの生成/計算/移動の速度)に依存し、実際の「物理」ビットレートは設計上の決定のほんの一部です。


1
私は本当に、2 Mhzの信号が正常に動作しないのに十分なほど深刻なレイアウトの問題があるボードを疑っています。2 Mhzは厳密には高周波ではありません。
コナーウルフ14

@FakeNameデスクの少なくとも1つのボードは、シリアル速度を上げるとBERが増加します。私は通常9600を使用しますが、これはほとんどのアプリケーションにとって十分であり、堅牢です。
ジッピー14

冗談じゃない!ほら それを実現するためにレイアウトがどれほど悪いのだろうか?ただし、許容誤差の低い共振器/水晶ほどレイアウトが悪いのではないかと思います。
コナーウルフ

1
特にU2Xn = 1USARTの場合、高いボーレートは、ミスマッチについてかなり不機嫌になる傾向があります。
コナーウルフ

@FakeName私は恐竜です、あなたが考えることができるすべての間違ったレガシー理由のために「9600 8N1」が好きです; o)
ジッピー14

2

エラーチェックは実際には非常に簡単で、1つのライナーでこれを行うAVRライブラリがあります。

読み進めてutil/crc16.hください。付属のサンプルをすぐに使用 できます。

CRCは、単純なアプリケーションに対して非常に堅牢で高速です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.