ARMマイコン、タイマーのインプット・キャプチャ機能で
初めて使う「機能」、使ってみて「なるほどなぁ~」
「こうするんや」というパターンにしばしば出会います。
その原因、
「マニュアルに書いてあるやろ」
「ちゃんと、隅から隅まで読みや」っという
場合が多いようです。
先日はこんなことに遭遇しています。
チップはARMマイコンSTM32F407。
タイマーのインプット・キャプチャ機能で、パルス周期を
測定しようとしたところ、タイマーカウンタのプリスケーラが
いうことをきかないという現象に出会いました。
クロック源は84MHz。
これが、16ビットのプリスケーラを通って32ビットのカウンタ
(アップカウント)に入ります。
測定値が32ビットで出てくるので、プリスケーラを使わなくて
もかまわないんですが、できればクロックを1MHz(1μS)にして
おきたいので、プリスケーラを「1/84」に初期化しました。
ところが、これがダメ。
出てくるパルス間隔値は1MHzで計測したものじゃなく、元クロック
の84MHzで計った値になるのです。 (想定の84倍大きな値)
う~む・・・。
しかし、何かのひょうしに1MHzでの値になって、ちゃんと思惑通り
の数値が出だします。
一度ちゃんと動き出すと以後は大丈夫。
うまくいかないのは起動直後の最初だけ。
「なんやこれ~?」でっす。
このうまくいくタイミングを調べてみると、カウンタのオーバー
フローが絡んでいました。
32ビットカウンタが一周すると、プリスケーラが設定した値で働く
ようになるのです。
クロック周波数が高くても32ビットあるんで、オーバーフロー
するまでの経過時間はざっと50秒。
起動後50秒ほどすると、考え通りの値が出てくるという現象が
読み取れました。
こうなると、「どこかにかいてあるやろ」っと、マニュアルを
探索。
この現象に関係する解説、こんなのでした。
・プリスケーラの説明
新しいプリスケーラ比は、次の更新イベントで有効になります。
・TIMxEGRレジスタの説明
UGフラグ:更新生成フラグ
1にするとカウンタを再初期化。アップカウントではゼロクリア。
プリスケーラは設定値で再スタート。
つまり、カウンタがフリーラン(オーバーフロー前に比較してリセット
するような機能を使わない場合)している時、プリスケーラが正しく
働くのは最初の更新イベント。
放置状態では、オーバーフローがこのタイミングだったのです。
だもんで、タイマーの初期処理では、ソフトで「UGフラグをオン」
しとかなくちゃいけないよ、ということでした。
とりあえず、この問題はこの方法で解決しました。
※現在は、インプット・キャプチャのタイミングでカウンタを
ゼロクリアしたいんだが(ハード的に)の設定に悩んでます。
このハードウェア、インプット・キャプチャはタイマー2のch3を入力に
使ってます。
ch1だとキャプチャのタイミングでカウンタをクリアできるんですが、
ch3だとうまいこといきません。 (私の回路設計じゃな~い)
だもんで、クリアはせずに、キャプチャの前回タイミング読んだ
カウント値と今回値の差から周期を求めることにしました。
| 固定リンク
「電子回路工作」カテゴリの記事
- LTC6101を使った電流検出回路をケースに入れる(2023.11.24)
- 今日の失敗:パーツクリーナーで「ポリスチレン」にダメージ(2023.11.10)
- 2つあるワンショットマルチの時定数比を一定にしたい(2023.10.21)
- LEDドライバー、どうしよう(2023.09.04)
- 人感センサー用オフディレータイマー回路(2023.08.26)
コメント