こんにちは、ぐぅです。
先日研修でマイコンのタイマ割り込みを使用した LED 点灯プログラムを作成しました。
その中で苦戦した「分周」について紹介したいと思います。
はじめに
分周とは周波数を割ることで、目的の周波数を得るという手法です。
分周の意味は分かっていたのですが、何の値を何にしたら上手く分周されるのかが分からず、先輩に質問に行きました。
課題
周波数 20 MHz のクロックを使用し 10 ms を生成せよ。
何分周すると目的の周波数が得られるか?
ぐぅ 「分周の方法が分かりません…」
先輩 「…。 10 ms が何 Hz かは分かる?」
ぐぅ 「 1 / 10 ms = 100 なので、 100 Hz です。」
先輩 「じゃ、 20 MHz を何分周すれば 100 Hz になる?」
ぐぅ 「 20 MHz / 100 Hz = 200000 分周です!」
先輩 「そう。 200000 分周するためには何を使えばいいか分かる?」
ぐぅ 「マイコンの中に“カウントソース”というものを発見しました。これを使うと分周できるみたいです!」
※カウントソースとは、メインクロックの周波数を分周したものです。
今回の場合、カウントソースは 1 分周(分周なし)、 2 分周、 8 分周、 32 分周から選ぶことができました。
先輩 「ためしに 8 分周のカウントソースを使って分周してみて」
ぐぅ 「はい!」
8 分周のカウントソースを使って分周に挑戦!
8 分周のカウントソースを使用して分周してみると…
20 MHz / 8 = 2500000 Hz
全然 100 Hz にならない!
ぐぅ 「先輩…、分周が全然足りません (; O ;) 」
先輩 「だよね(笑)他に分周に使えるもの何かなかった?」
データシートを開き「分周」で検索してみると…
ぐぅ 「ありました!分周比 1 / ( n + 1 ) ( m + 1 )っていうのを見つけました!」
※これはタイマのプリスケーラを使用して分周する方法です。
プリスケーラ:カウンタを利用して入力周波数を整数分の 1 に分周するもの
分周比の式も使って分周に挑戦!!
先輩 「そうそう、これを使って残りの分周をするんだよ。 m と n に適当な値を入れて計算してみて。」
計算中…
さっきカウントソースで 2500000 Hz まで分周したから、残りは 25000 分周。
n = 24999 , m = 0 ?
先輩 「あ、ちなみに n と m には設定できる範囲があるから気を付けて。」
ぐぅ 「?!」
データシートで確認すると以下のことが分かりました。
n , m の設定範囲: 00 h ~ FF h ( 10 進数では 0 ~ 255 )
つまり、 n = 24999 , m = 0 は設定できません、、、
計算し直して…
ぐぅ 「 250 × 100 = 25000 だから、これを分周比の式に当てはめると…
n = 249、 m = 99 です!」
先輩 「 OK !」
こんな感じで、以下の式で無事分周を行うことができました。
(目的周波数) =(元の周波数)× 1 /(カウントソース)× 1 / ( n + 1 ) ( m + 1 )
100 Hz = 20 MHz × 1 / 8 × 1 / ( 249 + 1 ) ( 99 + 1 )
注意すること
今回はカウントソースと分周比を上記の組み合わせで設定しましたが、これらの値は目的の周波数がいくつかで変わってきます。
例えば今回の場合でクロックソースを 2 分周に設定してしまうと、分周比を使って
100000 分周しなければなりません。
しかし n , m は 255 までしか設定できず、それぞれを 255 に設定したとしても
( 255 + 1 ) ( 255 + 1 ) = 65536 までしか分周できません。
このようなことが無いようにカウントソースは選ぶ必要があります。
皆さんも分周を行う際は以上のことに気を付けて正確に欲しい周波数を生成してみてください。
まとめ
元の周波数から目的の周波数を生成するために分周を行う。
今回の場合は以下の式で分周を行った。
(目的周波数) =(元の周波数)× 1 /(カウントソース)× 1 / ( n + 1 ) ( m + 1 )
n , m の設定範囲: 00 h ~ FF h ( 10 進数では 0 ~ 255 )
ぐぅのつぶやき
分周比の n と m の設定には少し注意が必要だなぁ。
うっかり範囲外の値を設定しないよう気を付けよう (>_<)