一部のマイクロコントローラは、標準のボーレートにスケーラブルではない水晶周波数を使用していますが、どのようにボーレートを実装していますか?


16

8051ファミリは標準のボーレートを生成するために11.0592 MHzとその倍数を使用していることに気付きました。ただし、15 MHzを使用するSoCがあります。彼らはどうやってこれをするのですか?


5
ほとんどの場合、2のべき乗以外の除数を使用して、標準のボーレートに許容できるほど近いレートを生成します。
ブライアンドラモンド

4
しかも、のUART信号をオーバーサンプリングすることができる(例えば、UARTビット当たり16個のサンプル)タイミング(及び雑音)問題を解決し、:electronicdesign.com/embedded/...
フロリアンカステラーヌ

1
興味のある方は、AVR USARTタイミングエラーテーブルがデータシートの一般的なクロックで利用できます(このページの168ページ以降)
セビ

回答:


22

UARTは、合理的に正確である限り気にしません。

1500000023040065

65230400=14976000

したがって、UARTは15000倍速すぎます1+1で問題になります15000149761.00220411ビットを横切る時間シフトは半分以上のビットです。1+12111.045


9
価値..両方が誤った方向に誤差があるようならば、送信機と受信機の両方にクロックを持っていることは注目されるかもしれない
Spehro Pefhany

7
さらに重要なことに、関連するシリアルプロトコル(RS-232など)は、スタートビットとストップビットを使用してクロックをさらに同期します。両側に完全な230400 Hzのクロックがあったとしても、2つのクロックは位相がずれている可能性があります。開始ビットにより、受信側はクロックを送信側に同期できます。これは各バイトの最初のビットで発生する可能性があるため、不完全なクロックは、より頻繁な位相調整を意味します。
MSalters

1
実際には、分周器システムが100%柔軟である可能性は低いため、この記事が示す以上にオフになる可能性があります。
ピーターグリーン

2
@PeterGreen:それは本当です。ほとんどの実際のUARTは、ボーレートの16倍の入力クロックを必要とし、プログラム可能な分周器はより高速のクロックを生成する必要があります。この例では、全体の分割線は64(= 16 x 4)でなければならず、エラーはまたは+ 1.7%で、これはまだ許容値です。15MHz/64230400baあなたはd=1.01725
デイブツイード

2
@DaveTweed:しかし、非同期シリアルに深刻なチップは、シリアルペリフェラルで13のスーパーサンプリングファクターを許可する傾向があり、3 MHzの倍数のクロックで開始して計算されたすてきな低エラーを取得します。また、一部のビットでは、個々のビットのタイミング誤差が2%を超えている場合でも、ビット時間が平均値で正しい値に達する分数分周器を使用します。
ベンフォークト

12

比較的ハイエンドのARM MCUの「ビッグプリント」機能の説明を次に示します。

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

整数比として必要なほぼすべての周波数を作成できるプリスケーラとポストスケーラを備えた多数のPLLとデバイダがあります。PLLの 乗算いくつかの整数の入力周波数、及び分周器は、ある数(によって分割することができない、それぞれの場合に2の累乗必ずしも)。

内部の比較的高い周波数(この場合は約0.5 GHz)は問題ではありません(チップから離れている場合のように)-消費される電力は比較的少ないです。

2の累乗のみによる除算の日はかなり前に終わりました。PLLが一般的に適用されるようになったので、正確な水晶周波数をほぼ同じくらい心配する必要はありません。一方、複数の内部バスクロック、USB、イーサネット、UARTなどの周辺機器には多くの異なるクロック周波数が必要になる場合があります。

これらの仕組みの詳細については、比較的単純な専用クロック合成チップの一部を検討できます(ただし、一部のメーカーはセットアップ定数を計算するためのソフトウェアを提供できるほど複雑です)。


2
(その=所有、それは「それ」または「それは」。例えば、その使用方法とそれを参照してください。)
ピーターモーテンセン

4
@PeterMortensenありがとう、修正。何らかの理由で、そのようなタイプミス(および誤った同音異義語の配置)は、レポート作成モードよりも会話型思考モードの方が簡単です。
スペロペファニー

10

これは、変調器を使用して実現できます。

たとえば、MSP430x1xxユーザーガイドを参照してください。260ページには、次のように記載されています。

USARTボーレートジェネレーターは、非標準のソース周波数から標準のボーレートを生成できます。ボーレートジェネレータは、図13-7に示すように、1つのプリスケーラ/ディバイダと変調器を使用します。この組み合わせは、ボーレート生成用の分数除数をサポートします。

ボーレートのタイミング

(灰色の領域に注意してください)

除算係数Nは、多くの場合、整数部分がプリスケーラ/ディバイダによって実現できる非整数値です。ボーレートジェネレータの2番目のステージである変調器は、小数部分を可能な限り厳密に満たすために使用されます。

[...]

BITCLKは、非整数の除数が必要なタイミング要件を満たすために、変調器でビットごとに調整できます。変調器ビットmiが設定されている場合、各ビットのタイミングは1 BRCLKクロックサイクル分拡張されます。ビットが受信または送信されるたびに、変調制御レジスタの次のビットがそのビットのタイミングを決定します。設定された変調ビットは除算係数を1増加させますが、クリアされた変調ビットはUxBRによって与えられた除算係数を維持します

[...]


5

多くの人は、UARTが実際に固定クロックで実行されていると想定しています。つまり、 T秒。これは必ずしも真実ではありません。少なくとも、私が設計したすべてのUARTモジュールではそうではありません。

動作方法は、内部サンプルクロックを持っていることです。100nsごとにサンプリングできるとします。各ビットの中間がどこにあるか知っています。そのため、中央に最も近いサンプリングポイントを選択します。これにより、最大50nsのエラーが発生します。

何が起こるかは、スタートビットを受け取ることです。次に、ビットの中央がどこであるか、つまり参照ポイントであるかどうかを判断します。そうすれば、次のビットをサンプリングするのにどれだけの時間待つ必要があるかがわかります。したがって、カウンターをロードし、それがリセットされるとサンプルを取得します。これで、高速内部クロックの最大1クロックサイクルだけオフになりますが、ほとんどの場合はナノ秒です。また、あなたはあなたがどれだけ離れているかを知っています。次のビットでは、カウンターに異なる値をロードします。そのため、可能な限り中央に近づきます。

実際のシステムでは、他にも多くのことが起こります。たとえば、1つのサンプルを取得するのではなく、カップルを取得してそれらに対して何らかの処理を行うことができます。実際には、量子化ノイズなどの影響をすべて含む1ビットADCです。しかし、あなたは一般的なアイデアを得る必要があります。


3

最新のSoCは、いわゆるPLLを使用して、インターフェイスに必要な(ほぼ)クロックを生成します。簡単に言えば、PLL回路は高周波VCO(電圧制御発振器)を採用し、VCOと入力クロックの両方で二分周分周器を使用し、周波数比に基づいて電圧フィードバックを生成します。このフィードバックはVCOを制御し、ループ全体が目的の周波数にロックされるようにします。


2

単一のスタートビットが先行し、単一のストップビットが先行する8ビットバイトを想定し、レシーバーによる完全なサンプリングを前提とすると、9.5ビット周期後、クロックは半ビット周期未満オフでなければならないことを意味します。

これは、トランスミッタとレシーバ間の最大許容クロック差が約5%であることを意味します。ただし、リンクの両端でエラーが発生し、受信者の同期が完全ではない場合があります。したがって、実際には、実際のボーレートは公称ボーレートの1%以内に維持することをお勧めします。

私が最もよく知っているマイクロコントローラはPIC18デバイスです。これらの古いモデルは柔軟な8ビットカウンターを使用してボーレートをスケーリングしますが、新しいモデルは柔軟な16ビットカウンターを使用します。ボーレートを4倍に変更するオプションの「高速」モードと「低速」モードもあります。

入力クロックが20 MHzの場合、この生成スキームの8ビットバージョンは、1800〜19200のすべてのレートの公称ボーレートの0.25%以内に収まります。16ビットバージョンでは、さらに低速になります。

http://www.nicksoft.info/el/calc/?ac=spbrg&submitted=1&mcu=+Generic+16bit+BRG&Fosc=20&FoscMul=1000000&FoscAutoSelector=0&MaxBaudRateError=1 = 1カラムを無視し、USARTを実行するためのものです)同期モード)

UARTシリアルには、PLL、分数分周器などは実際には必要ありません。


0

シリアルデータを交換するには、コントローラーが「理想的な」時間の特定のウィンドウ内でデータを出力またはサンプリングする必要があります。プログラマブルファクターでクロックを分割し、さらにハードコードされたファクターでクロックを分割するコントローラーを使用するのが最も簡単ですが、ビットを等間隔で読み書きする必要はありません。接続の遠端がボーレートに一致する正確に均一な間隔でビットを出力する場合、適切なタイミングでサンプルをサンプリングすれば、レシーバはボーレートの2倍を超えるサンプリングレートで対応できます。たとえば、データが19,200で出力され、1つが正確に48,000Hz(2.5x)でサンプリングされているとします。

立ち下がりエッジを見ると、0〜1サンプリング時間前にストップビットが開始したことがわかります。開始ビットが時間0として観測された最初のサンプルにラベルを付けると、ビット0は時間1.5から2.5の間に開始されます。ビット1は時間4.0から5.0の間に開始し、ビット2は時間6.5から7.5の間に開始し、ビット3は時間9.0から10.0の間に開始します。したがって、時間3で採取されたサンプルは、ビット0(時間1.5と2.5の間で始まり、時間4.0と5.0の間で終わる)をキャプチャすることが保証されます。同様に、時間6に取得されたサンプルはビット1をキャプチャし、時間8、11、13、16、18、および20に取得されたサンプルはビット2〜7をキャプチャします。

より速いサンプルレートを使用すると、受信機はソースの不完全性をより許容しますが、サンプルレートがビットレートのちょうど2.5倍であっても、マージンはひどくありません[ビット時間の約1/5]。

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