これまで使ったTMR2+PWM5,6では大き目のデューティ比のパルスを細かくコントロールする事は苦手である。そこで改めてサーボモータを細かくコントロールする事を考える。サーボモータのデッドバンド幅が1μsだとするとパルス幅を1μs単位でコントロールしたい。1μsを最小単位とし、サーボモータに与える最大パルス幅を2.5msとすると2500倍であり、これを制御するには12ビット以上のカウンタが必要である。これに該当するのは16ビットカウンタを持つタイマー1である(タイマー1は次の回路構成)。またこれに与えるクロックは1MHz以上とする必要がある。
今回の目的にタイマー1を使うときの問題点は、タイマー1はワンショットで、タイマー2の様なフリーランではない事であり、カウントが終了する度に再度カウンターに初期値を設定する必要がある。幸いその時間的余裕は17.5ms以上あるので割り込み処理で間に合うだろう。またタイマー1自体には任意のパルス幅のパルスを生成する機能は無いため、他の機能(例えばCLC)と組み合わせて使うことになる。このアイデアをPIC16F18346を使って組み立てて次図のように構成した。
この図でTMR0の分周比を620とせず310としたのはCLC1とCLC3のCK端子の論理を逆にし、HとVのサーボに与えるパルスを半周期(10ms)ずらし突入電流を減らす事を狙っている為である。TMR0の出力はデユーティ比が50%ではないためCLC2で2分周し周期20ms、デユーティ比50%の方形波を作る。
この回路の動作は、D-FFのD端子が1になると次のCK端子の変化点でQが1となりパルスがスタートする。それと共にタイマーのゲートGが開きカウントがスタート。カウントが進みカウンタが0xffffから0x0へ変わる時オーバーフローが発生してOVFが1になり、その時点でD-FFがリセットされパルスが終わる。この時割込みを発生させ、ソフトで次のカウンタの初期値を設定する。もしD-FFのD端子が0の場合は次のパルスは発生しない。この方法なら制御の最初や最後で中途半端な幅のパルスを生成することは無い。
タイマー1(TMR1,TMR3)のクロック入力には2MHzを使いプリスケーラで2分周して1MHzのクロックとしてカウントする。SG90の性能は0.12sec/60度であるからパルス間隔20msでは10度回転し、これに相当するパルス幅の変化量は概ね110μsであるから、これ(110)が20ms毎のタイマーのカウント値の最大変化量とする。即ちこれ以上カウント値の変化量を大きくしてもサーボモータが追従できない。この値を基準に制御プログラムを作成する。
〔参考〕ここでPICのタイマーの表記が紛らわしいので改めて説明する。PICには3種類のタイマーがあり、それぞれタイマー0、タイマー1、タイマー2と呼ぶ。PICの種類毎にそれぞれのタイマーが何個ずつ実装されているかが異なり、PIC16F183x6ではタイマー0はTMR0、タイマー1はTMR1、TMR3、TMR5、タイマー2はTMR2、TMR4、TMR6が実装されている。
(続く)
0 件のコメント:
コメントを投稿