標準は9600ボーです。それは単なる標準です。Arduino Uno SMD R2を使用すると、達成できる最高の実用的なボーレートはどれくらいですか?
大胆不敵な点:エラーチェックメカニズムを作成し、ボーレートをばかげて高くして、高い転送レートを得るにはどうすればよいでしょうか?
laqq`na`fca`fga`fga`bcngaah````iin`ha`a`a`bga`fga`bcqpahhqfq```fh`oopa`bca`fca
。USB通信にCH340チップを使用します。
標準は9600ボーです。それは単なる標準です。Arduino Uno SMD R2を使用すると、達成できる最高の実用的なボーレートはどれくらいですか?
大胆不敵な点:エラーチェックメカニズムを作成し、ボーレートをばかげて高くして、高い転送レートを得るにはどうすればよいでしょうか?
laqq`na`fca`fga`fga`bcngaah````iin`ha`a`a`bga`fga`bcqpahhqfq```fh`oopa`bca`fca
。USB通信にCH340チップを使用します。
回答:
ここにはいくつかの要因があります。
これらの要因はすべて、達成可能な最大ボーレートの決定に関連しています。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を取得するのはおそらくそれほど難しくないでしょう。
Arduino Serial Monitorウィンドウでは115200に制限されていますが、これは最高のボーレートではありません。AtmelとFT232(または使用しているもの)のデータシートを読んで最大値を確認できますが、230400(Arduino Serial Monitorがサポートする最大の2倍)を問題なく使用できます。
コンピューターで結果を表示する場合は、他のボーレートオプションをサポートする別のシリアルモニターが必要になります。CoolTermとTermiteが好きです。
これはクロック速度にも大きく依存することに注意してください。
ここだ電卓可能です何の計算のお手伝いをするためには。
これはおそらく、El-Cheapoボードが元のボードと異なる数少ない側面の1つです。最大シリアル転送速度は、ボードの品質とそのレイアウトによってのみ制限されます。シリアルデータがAVRまたはUSBインターフェイスチップに入ると、データはシリアルUARTプロトコルとは異なる方法で処理されます。
ただし、マイクロコントローラーにはシリアルデータを入出力ピンから入出力する基本的なハードウェアがいくつかありますが、絶対最大レートは16MHzクロック(AVRの場合)に制限されます。バイトがシリアルバッファに移動されると、UARTハードウェアがそれ自体を引き継いでビットをプッシュ/プルインします。AVRはせいぜい16M命令/秒に達し、シリアルバッファーを満たすために使用される割り込みにはオーバーヘッドがあります(割り込み処理に少なくとも8クロックティック+現在の状態を保存するための命令+実際にバッファーを満たすためのいくつかの命令)。所定のビットレートでは、プロトコルは毎秒nビットの途方もない速度で実行されますが、コントローラーが実際にデータを出力するのに必要な時間よりもシリアルバッファーを埋めるのにより多くの時間を必要とするため、平均スループットが予想より低くなり、UARTがアイドル状態になります比較的長い間。
覚えておくべきもう1つの効果は、データをUARTにプッシュ(またはプル)するために必要なすべてのオーバーヘッドを実際のプログラムに費やすことができず、平均的な実際のスループットに影響することです。バッファの充填またはメインループの計算のために、すべての命令サイクルを1回しか使用できません。
したがって、最大スループットは、使用するアプリケーション(シリアルバッファーとの間でデータの生成/計算/移動の速度)に依存し、実際の「物理」ビットレートは設計上の決定のほんの一部です。
U2Xn = 1
USARTの場合、高いボーレートは、ミスマッチについてかなり不機嫌になる傾向があります。
エラーチェックは実際には非常に簡単で、1つのライナーでこれを行うAVRライブラリがあります。
読み進めてutil/crc16.h
ください。付属のサンプルをすぐに使用 できます。
CRCは、単純なアプリケーションに対して非常に堅牢で高速です。