UARTの周波数はどれほど重要ですか?


17

8 MHzクリスタルを使用して、16 MIPSでマイクロコントローラーを実行します(PLL 4x、2サイクル命令)。ただし、8 MHzはUART周波数に分割されません。115,200ボーを使用する予定です。

UARTは±1%以内で実行できますか?これが機能しない場合、どの周波数を使用すればよいですか?(処理速度を最大にするために、できる限り16 MIPSに近づけたいと思います。)問題があれば、PIC24FJ64GA004を使用しています。

回答:


13

1%以内であれば、大丈夫です。

UARTで16倍のオーバーサンプリングクロックを使用しているとします。たとえば、1,843,200 Hzから16倍のオーバーサンプリング115,200 bpsに設定できます。(このようなオーバーサンプリングはかなり一般的です)これにより、UARTは開始ビットの立ち下がりエッジから8オーバークロックをカウントオフできるため、ビットセルの中心をオーバークロックの+/-期間内に配置できます。データをサンプリングするタイミングを決定するために、オーバークロックの16周期をカウントオフします。

開始ビットの中心にヒットできると仮定した場合、8データビットにわたって正しいビットセルでシリアルデータをサンプリングし続けるために、クロック周波数は(8-0.5)/ 8と(8 + 0.5の間でなければなりません)/ 8、または意図したビットレートの+/- 6.25%。オーバークロックを高くすると、スタートビットの中心にヒットする理想的な状態に近づきますが、通常は8xまたは16xで十分であり、5%のミスマッチが機能すると想定できます。

ただし、反対側が完全に周波数に依存しているとは考えられません。4%速いデバイスを4%遅いデバイスに接続すると、問題が発生します。少なくとも1つのケースに遭遇しました。PCが少し遅く、デバイスが少し速く、2つはわずかにしか通信できませんでしたが、同じデバイスは他のPCでも問題ありませんでした。デバイス。(約112kbpsと119kbpsでこれらをOスコープにしました)そのため、公称周波数にできるだけ近づけるようにしてください。名目上の2%以内に問題があるものを見たことはありません。

通常行うことは、意図したUARTオーバーサンプリングレートにボーレートを掛けた整数倍を提供するマスタークロックレートを使用することです。たとえば、CPUを約8MHzで実行したい場合は、7.3728MHzの発振器を使用します。これを4で割って1.8432MHzを得ることができます。これはたまたま115200の16倍です。


8 MHzを69で除算して115,942を得ることができ、これは±1%以内です。PICがボーレートジェネレータでこのタイプの除算をサポートしているかどうか疑問に思っています。私はそう望んでいますが、そうなるとは思いません。
トーマスO

PICにはボーレートジェネレータがあります。それはうまく機能しますが、9600のような低いボーに対してのみ、115,200のような高いボーに対しては機能せず、不正確になりすぎます。
トーマスO

7.3728 MHzの水晶を使用できると思いますか?(精度が必要なため、内部7.37 MHz発振器は使用しません。)64で除算して、115,200のUART周波数を取得できます。それは私が高い許容範囲で行くことができる最速です。
トーマスO

1
UARTがサポートしている場合、スタートビットをオーバーサンプリングしてビットセルの中心を見つけることができるようにオーバークロック(16xなど)を与えることが望ましいですが、ボーマルチクリスタルを使用します。
ジャストジェフ

4

@JustJeffが言及する1%は必須ではありません。ほとんどのUARTは、最後のビットで半分のビットエラーを許容します。ほとんどの場合、フレームは1スタートビット、8データビット、1ストップビットで構成され、合計10ビットです。10ビットの半分のビットは5%です(JustJeffの6.25%は開始ビットと停止ビットを考慮しません)。


1
私を間違って引用しないでください。再「1%」、私の声明は、これを達成するのは難しいかもしれないということでした。「6.25%」は、開始ビットの中心にたまたまヒットしたことを想定しており、そのような条件下でのレシーバーとトランスミッターのクロックレートの最大許容になります。
JustJeff

1

JustJeffはスタートビットを忘れていましたが、Stevenhはストップビットを追加しました。8データビット、1スタートビット、パリティビットなしの共通プロトコル(ストップビットの数は関係ありません)を想定すると、スタートビットのリーディングエッジから中心まで8 1/2ビット時間があります。最後のデータビット。一般的に、受信者はこの最後のビットを1/4ビット時間内にサンプリングする必要があります。1/2ビットが故障しきい値の保証であることに注意してください。電気ノイズとジッターが常に存在するため、そこに近いものはすべて実現不可能になります。

1/4を8 1/2で割った値= 2.94%。

JustJeffが述べたように、ほとんどのUART実装は実際に非同期16xクロックで着信データをサンプリングします。これは、開始ビットのリーディングエッジを測定できる誤差であるため、さらに1/16ビット時間の不確実性を追加します。8 1/2ビットのうち1/16ビットの時間はさらに0.74%です。これは、以前に計算されたエラーバジェットから生じます。最終的には、中心の1/4ビット時間内に最後のビットをサンプリングするために、レシーバがクロックの不一致を許容する2.2%になります。

他の人が言ったように、正確なボーレートが必要な場合、7.3728MHzの水晶を使用するのが一般的です。通常、クリスタルエラー内でUARTボーレートをヒットしながら、CPUを最大レート近くで実行するように調整できます。


ストップビットが重要でないことに同意しません。この質問ストップビットが誤ってローレベルに設定されたため、通信が失敗しました。
-stevenvh

全体的な通信が機能するためにはストップビットが必要ですが、ほとんどのUARTのエラーバジェット計算には入りません。UARTでは、最後のデータビットから次の開始ビットの次のリーディングエッジまでの間に最小時間が必要です。それがストップビットタイムの目的です。この時間が満たされない場合、「フレーミングエラー」が発生します。おそらくそれはデータビットのようにサンプリングされますが、異なる方法で処理された場合は知っています。古いテレタイプでは、機械機構が次のキャラクターをつかむ準備をするために2ストップビットが必要でした。
オリンラスロップ

スタートビットを3回参照しましたね。
ジャストジェフ

@OlinLathrop:ストップビットは、そのMSBがゼロバイトを送信するときに存在することを保証するために必要とされることが次のスタートビットの立ち下がりエッジ。想定される前にデータラインがローになる場合、デバイスによって動作が異なりますが、ストップビットがなかった場合、ゼロバイトの送信シーケンスには有用なタイミング情報が含まれません。このような要件は、25%未満の固定フレーミングオーバーヘッドを備えた他の手段で満たすことができますが、私は誰もそうしていません。
supercat

1

まだ言及されていない点の1つは、一部のデバイスは、受信したデータのバイトごとにデータのバイトを送信することを期待しているということです。そのようなデバイスに連続的にデータが供給される場合、そのボーレートは送信デバイスのボーレートよりもさらに0.1%遅く、わずかに短縮されたストップビットを送信する機能はありません。その出力は、1000回連続して毎バイト遅れますデバイスが16バイトのバッファリングに制限されている場合、デバイスは約16,000を通過した後にデータのバイトをドロップし、その後1000あたり約1バイトをドロップします。いわゆる「1200ボー」モデムが実際に1200ビット/秒よりわずかに高い速度で動作することに注意する価値があります(私はそれが約1202であると思います)。である、

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