シリアル通信ボーレートとクロック周波数
デジタルテスター「FLUKE 87IV」の赤外線通信ユニット完成では
4.9152MHzの水晶を使って9600BPSのボーレートを得ました。
シリアル通信のボーレート、昔々は5単位テレテイプの45.5BPS。
マイコンになって110BPS、そして300BPS。
今は最低が1200BPSでしょうか。
9600BPSまでは2倍飛びで2400、4800BPS。
そして19.2kの中間に、9600を1.5倍した14.4kBPSが入っています。
ここから、両方で2倍飛びの値が使われます。
Arduino-UNOの場合、元クロックが16MHzです。
ボーレートのクロック分周比は、BPS値を16倍した値で16MHzを割る。
あるいは16MHz÷16÷BPS値で求められます
1200BPS~115.2kBPSまでその分周比を見てみると・・・
・・・割り切れません。
誤差(%)とともに表にしました。
| 16.000MHz
------|-------------
1200 | 833 0.04
2400 | 417 -0.08
4800 | 208 0.16
9600 | 104 0.16
14.4k | 69 0.64
19.2k | 52 0.16
28.8k | 35 -0.79
38.4k | 26 0.16
57.6k | 17 2.12
76.8k | 13 0.16
115.2k| 9 -3.55
↑ ↑
1/n 誤差(%)
ATmega328のBRR(ボーレートレジスタ)へは
「n-1」を設定する。
見ての通り、どのボーレートも誤差を含んでいて、
115.2kBPSはけっこう大きな値です。
10bit分で3割り越えですから、ちょっと気になります。
水晶発振子じゃなくセラミック発振子だと、素子が持つ
誤差も加わります。
※注:追記
Arduino-UNOのボーレート設定、通常のX16クロックでは
なく「X8」の倍速設定(UCSRAのU2Xをオン)が使われています。
ですので、上の表のn値は2倍の値を設定できるということで
割り切れなくても、微調できます。
そして、誤差はおよそ1/2になります。
115.2kなら16MHz/8/115.2k=17となり、
結果、誤差は2.12%となります。(それでも大きいぞ)
5V電源での最高速20MHzでも割り切れずに誤差が発生します。
| 20.000MHz
------|--------------
1200 | 1042 -0.03
2400 | 521 -0.03
4800 | 260 0.16
9600 | 130 0.16
14.4k | 87 -0.22
19.2k | 65 0.16
28.8k | 43 0.94
38.4k | 33 -1.36
57.6k | 22 -1.36
76.8k | 16 1.73
115.2k| 11 -1.36
誤差を生じないボーレートのクロックを作るには
ちょっと中途半端な周波数が必要です。
これらの周波数だと、1200BPSから115.2kBPSまで誤差ゼロ
が実現できます。
| 7.3728 11.0592 14.7456 18.432
------|------------------------------
1200 | 384 576 768 960
2400 | 192 288 384 480
4800 | 96 144 192 240
9600 | 48 72 96 120
14.4k | 32 48 64 80
19.2k | 24 36 48 60
28.8k | 16 24 32 40
38.4k | 12 18 24 30
57.6k | 8 12 16 20
76.8k | 6 9 12 15
115.2k| 4 6 8 10
FLUKE 87IV - IrDAで使った4.9152MHzだと、
14.4kなどの1.5倍系のボーレートで誤差を生じます。
| 4.608 4.9152 6.144 9.216 9.8304 19.6608
------|----------------------------------------
1200 | 240 256 320 480 512 1024
2400 | 120 128 160 240 256 512
4800 | 60 64 80 120 128 256
9600 | 30 32 40 60 64 128
14.4k | 20 - - 40 - -
19.2k | 15 16 20 30 32 64
28.8k | 10 - - 20 - -
38.4k | - 8 10 15 16 32
57.6k | 5 - - 10 - -
76.8k | - 4 5 - 8 16
115.2k| - - - 5 - -
※「-」は割り切れないことを示す。
※9.216MHzは18.432MHzの1/2
高ボーレート(通信速度が速く)になると、送受の割り込み処理時間
が問題になってきます。
115.2kだと1文字が86.8us。
誤差のないメインクロックを選んだとしても、クロックを低く
してまうと、他の割込処理との輻輳を見ておかなければなりません。
送信は待ってくれますが、受信が間に合わないと文字抜けが生じ
ます。
マイコンの能力に見合ったボーレートを選ぶということで。
もうひとつ。
制御系で欲しいのがきっちりの「1ms」タイマー。
割り切れるボーレート設定値と内部のタイマー設定値。
18.432MHzが魔法の数字のように思えてきます。
ボーレートはOK。
1msは18.432MHz ÷ 256 ÷ 72で1kHz。
あるいは18.432MHz ÷ 1024 ÷ 18で1kHz。
この周波数、TK-80のクロックでした。
・2018年6月6日:マイコンのリセット回路
8224:クロックジェネレータICにつながってる
水晶がそれです。
これを9分周した2.048MHzが8080マイコンの動作周波数でした。
※追記
今までのAVRマイコンでは「分周比=16MHz÷16÷BPS値」
という計算で、分周比を求めていましたが、新しいAVRマイコン
では分周比に小数(例えば6bit分)が使えるようになっています。
結果的に分周比の計算は「16MHz×4÷BPS値」となり、
細かな設定ができるように考えられています。
| 固定リンク
「Arduino」カテゴリの記事
- 「御詠歌プレーヤー」の製作 (MP3-TF-16Pモジュールの使用例)(2023.08.10)
- Arduino UNO R3のソケット・・思えば違和感がぁ(2023.07.07)
- 初めて買ったArduino UNO・・・今は(2023.05.25)
- 液晶表示コントローラ HD44780で迎撃(2023.05.16)
- Arduino UNOで3相モーターを回す(2023.05.01)
「技術史」カテゴリの記事
- 40年前のトラ技:回路図用テンプレート(2023.07.19)
- タイタニック号の遭難者を救助したカルパチア号の記録(2023.07.04)
- アンテナの話は続く「電子立国 日本を育てた男-八木秀次と独創者たち」(2023.03.14)
- 館内閲覧用だった? 「アンテナのある風景」「電子管の歴史」(2023.03.07)
- トラ技編集部行きのフロッピーディスク(2023.03.03)
「IrDA」カテゴリの記事
- FLUKE 87IV デジタルテスターのデータをIrDAで吸い上げる(2022.11.15)
- 周波数つながりで、赤外線受光モジュールのBPF周波数(2022.07.23)
- 手持ちの赤外線リモコン受光モジュールを発掘してみたら・・・(2022.07.08)
- シリアル通信ボーレートとクロック周波数(2022.07.07)
- 「糸ようじ」のプラケースを使うシリーズ:赤外線リモコンチェッカー(2022.07.07)
「AVRマイコン」カテゴリの記事
- ATmega4809のシリアルポート(2023.01.18)
- PWMでD/A変換:アナログマルチプレクサの応用で(2023.01.02)
- ガレージのLED表示デジタル時計がダウン(2022.12.20)
- FLUKE 87IV デジタルテスターのデータをIrDAで吸い上げる(2022.11.15)
- 数値をBCD出力(表示)するルーチン(2022.10.08)
コメント