クラシックマウスを作ろう!(7)〜タイマ機能〜
初めましての方は初めまして
そうでない方はお疲れ様です
今回は前回の続きでタイマについて述べていきたいと思います。
前回のリンクはこちら:
クラシックマウスを作ろう!(6)~必要な回路の抽出とGPIO、シリアル通信~ - ぱわぷろ活動日誌
タイマは様々な機能が凝縮しているので嫌煙するかもしれませんが、マイコンをいじる上では逃げられない機能でもあります。
面倒臭くてボクも苦手でしたが頑張りましょう。
ちなみにマイコン関連で1番苦手なのはFLASH関係ですが、本シリーズでは割愛します(気が向いたらシリーズ終盤に言及するかも…)
以下が目次です.
タイマの分周と周期
さてさてみんな大好きタイマ割込の話に入りたいと思います。一般的にマイコンで用いられるタイマは
・タイマ割込
・PWM波形の生成
・エンコーダ等の方形波読込
の機能を併せ持っています。原理上を知れば確かに同じ理屈ですが、初めからこれらを同一の機能と見做すのは難しいでしょう。今回は細かいところは省略して「使う」前提で述べたいと思います。
まず、簡単な質問を。
マイコンはどうやって数を数えますか?
人間世界での1秒の基準はセシウム原子の放射周期?とかだったと思いますが、マイコンさんの時間の基準ってなんでしょうね?
これは水晶発振子、クリスタルと呼ばれる材料の振動周波数、又はこれらをマイコン内部のPLL回路により逓倍して得た「動作周波数」が基準になります。
周波数は時間の逆数ですので、ほぼ同等の物ですが、基本は周波数で表現されます.
例えば、動作周波数10MHzならばマイコンの数の最小単位は
ちなみに、マイコンの水晶発振子は10[MHz]がせいぜいで、マイコンに搭載されているPLL回路と呼ばれるもので周波数を10倍とかにして100[MHz]等の高速動作を可能としています.原理の詳細はこちら
マイコンはこうして供給された動作周波数を各ペリフェラルに配分しており、データシートからその設定や配分先を読み取る事ができます。
一例としてボクがお世話になっているSTM32F405では動作周波数からAPB1とAPB2を生成し、この2つから各ペリフェラルに配分していることがデータシートから分かります。
ここで重要なのは時間の精度の問題です。
水晶発振子の精度は、人間時間とマイコン時間の誤差に関わってきます。
このため、マイコンに元から内蔵されている内部クロックを使用するのではなく、外部に購入した水晶発振子を加える事が推奨されています。
Renesas社のRX631では書込みを行うのに外部水晶が必要で苦労した記憶があります…
型番やロールアウト時期によって異なると思うのでデータシートをよく読みましょう…苦しむのは未来の自分です。
さてさて、動作周波数を知った皆さんは
「マイコンの時間って細かすぎない???」
と思い始めているでしょう.(きっと、そうきっと)
例えば10MHzなら0.1usに1回とか数えますね、ってことは1秒数えるのに100万回を数えるんですよ。
しんどいですね。
じゃあどうするか?
小さい子どもが両手を使って百まで数える時の方法をイメージしてください。10まで数えて指を1つ折りますよね?
あのようにして、数える周期を減らす方法をマイコンでは分周(Prescale)と呼びます。この分周比を定めることでマイコンの負担を減らすことが可能になります。
小さい子どもの例で言えば、分周比は10になりますね。
これは各ペリフェラルごとに分周比を決められます.
例えば、TIM1は100[kHz]だけど、TIM2は3[kHz]とかも可能です.
タイマ割込
分周によって人間世界の時間感覚に近くなってきました。
では具体的にタイマ割込について考えます。
そもそもタイマ割込って何ぞや???って方はこちらへ
ざっくり言うと、振り子時計とかの時報みたいなもんです.
1分毎や1秒毎に呼び出される割込み関数があると、1秒ごとにLED点けたり消したりできるようになりますね.
そんな感じです.
さて、「数の感覚」を設定したので今回は「いくつまで数えますか?」って話です。鬼ごっこの鬼には「30まで数えてね」って数の限度を30に設定したりしますよね。
マイコンにも「何回数えたらタイマ割込してね」ってお願いをします。
限度にカウント数が到達したら、割込関数を呼び出して、カウントはリセットしてまた数え直します。これが無限ループします。
画像ソースはこちら.
縦軸がカウント数、横軸は時間です.GRA(例えば65535)に一致するとリセットされて、そこからまた数は増加していきます.
このGRAの呼び方はマイコンにより様々ですが、日本語ならコンペアマッチが妥当でしょうか?
ちなみにSTM32 HALならcounter periodと呼称されるパラメータになります。
したがって、分周とコンペアマッチの設定値こみでタイマ割込の周期が決まります。
一般的には1kHzのタイマ割り込みができれば制御的には十分と考えられています。実際の時間感覚だと逆数をとって、1/1000秒ですね。
1秒に1000回ぐらい割り込みが発生します。初めて聞くときは多いかと思うかもしれませんがこんなものです。
以上がタイマペリフェラルの基本的な機能になります。これを応用して他のPWMや方形波の読込を行っています。
では、実際に見てみましょう。
PWMの出力
具体的な例があった方が分かりやすいと思うのでSTM32+HALライブラリを例として考えます。
PWMを出力する機能 ー〉 TIM1(供給クロック APB1)
カウントソース ー〉 クロック
切替する閾値 ー〉 pulse
カウントリセット閾値 ー〉 counter period
というかぶっちゃけこの記事達を参照した方が良いかと。
カウントソースは前項で説明した通りなのでPWM全体の周波数は割込み周波数と同様に設定できます.
欲しいPWM周波数になるように各々の変数を設定します。DCモータ駆動用であればモータードライバーが機能する上限内でなるべく速ければいいと思います。
(本当は1番良い値があるのだろうけど横着してます)
自分は50k〜100kHzになれば良しとしているので次のような設定です。
これでPWM出力ができるはずです。
ちなみに動作周波数を可聴域にするとモータから音が聞こえると思います.
これはブザーの原理と同じなので次のリンクを参考に周波数を変えてみると上手く設定できてるか分かります.
モータ以外にもブザー等で動作確認すると良いかもですね。
ブザーは周波数で出力する音階が変わり、設定が違っていた場合は違う音が出るのでデバッグしやすいです。
エンコーダの読込
こっちの設定の方が本当に楽。
STM+HALの実装は以下の方を参照。
原理としてはカウントソースがインクリメンタル型エンコーダのパルスになっただけです。
これにより、タイマのカウントがインクリメント又はディクリメントします。
これは予めライブラリの方でグローバルな変数として格納してあるので、各々で探してください。
もちろん、正体はマイコン内部のレジスタなのでそこに見に行くようなコードにしても良いです。
サラッと書きましたが、カウントがディクリメント(減少)するって凄いですね。
これは回転方向によって増加か減少かを機能が判断してくれるためです。
インクリメンタル型エンコーダは方形波をA相、B相の2つ、又はZ相を加えた3つを出力します。これらの位相の違いで回転方向を検出する事ができます。
画像元はこちら
近年のマイコンの多くはこれを機能で読み取り、回転方向を判別してくれます。
さらに、方形波の立ち上がり、立ち下がりをそれぞれ検出することで分解能を4倍にすることもできます。
12bitのエンコーダは通常1周で4096までですがこの機能によって16384まで分解能を上げられます。
ここまで細かくすると趣味の領域では充分過ぎるかと思います。
さて、ここまでマイコンの各ペリフェラル機能についてざっくりと述べてきました。
本当にざっくりですが、これらの機能があるマイコンならばクラシックマウスやマイクロマウスを作るのには最低限大丈夫かと思います
(ホント???)
次回からは具体的な回路の話をしていきます。
奥は深いけど回路図自体は難しくない…はず。
では、またの機会に。