H7のような比較的高機能なマイコンであれば、280MHzでカウントできる32ビットカウンターのインプットキャプチャ機能をもっていますが、一般的なマイコンではどうでしょう? 例えば、最大動作周波数72MHzのマイコン「STM32F103」(STマイクロエレクトロニクス製/以下、F103*2)では、カウントクロック周波数が36MHzでカウンターは16ビットです。16ビットでは6万5535までしかカウントできないため、ppmレベルの誤差率での測定はできません。
*2)参考リンク:「STM32F103」の概要(STマイクロエレクトロニクスサイト)
しかし、16ビットカウンターがオーバーフローしてもカウントを続け、入力信号の立ち上がりまたは立ち下がりが来た時のオーバーフロー回数が分かれば、100万以上の数もカウントできます。
ただし、カウントクロック周波数が36MHzなので、入力信号の周波数は次の式で制限されます。
入力信号の周波数=([カウントクロックの周波数]×[最大誤差率])/(2×100)
=(36MHz×0.0001)/(2×100)
=3600/200=18Hz …式5
しかし、これでは商用電源の周波数50Hzを測定できません。そこで、もう一工夫が必要になります。
入力信号を分周してはどうでしょうか? 例えば、50Hzを8分周した場合は6.25Hzになるため、F103でも測定できます。この測定結果を8倍すれば、入力信号の周波数を得られます。
F103を使って、具体的に検討してみましょう。図4は、「STM32F101,102,103(中容量デバイス)テクニカルトレーニング資料」(閲覧には会員登録が必要です)より抜粋した図です。この図によると、タイマー1(16ビットカウンター)とタイマー2(16ビットカウンター)をカスケードにつなぎあわせて32ビットのカウンタを構成することができます。または、タイマー1のオーバーフローをソフトウェアでカウントしてもよいでしょう。
いずれにしろ、インプットキャプチャ機能はタイマー1で動作させて、入力信号の立ち上がりまたは立ち下がりが発生した時は、タイマー1のカウンターの値とオーバーフローの回数を考慮して総カウント数を計算します。
総カウント数=
(タイマー1のカウンターの数字)+(65535×[オーバーフローした回数])
一方、F103ではインプットキャプチャ用の入力信号を2分周、4分周、8分周することができます(図5)。8分周を使うと測定可能な周波数範囲が8倍になります。
これらの機能を組み合わせると、F103では式5で求めた18Hzの8倍の144Hzまで、1ppmの誤差率で測定できます。
ここまで説明した方法を逆に使うと、マイコンの内部発振回路の周波数の誤差を測定することができます。マイコンの内部発振回路には、抵抗とコンデンサーの時定数を利用したRC発振回路が使われることが多いですが、RC発振回路は周波数誤差が大きいうえ、使用中でも変動します。
そこで、外部入力信号に周波数精度の高いクロックを入れ、インプットキャプチャのカウンターのカウントクロックに内部発振回路のクロックを使います。
例えば、H7の場合、内部発振回路をPLLで逓倍してインプットキャプチャのカウンター用に280MHzのクロックを生成させます。そこに外部から精度の高い140Hzの入力信号を入れて、周波数を測定します。280MHz/140Hz=200万なので、カウンターの値が200万であれば、誤差率は1ppmですが、例えば202万だった場合は、140Hz×202万=282.8MHzになり、ほぼ1%(1ppmも含む)の誤差率だと分かります。
もし、マイコンの内部発振回路に補正機能がついていれば、−2.8MHzの補正をして、正確な280MHzを得ることができます。
(次の記事を読む)
Copyright © ITmedia, Inc. All Rights Reserved.