2024年11月29日金曜日

出入り検知器をPCB化する(その18)サーボ・モータを動かす6

 タイマー0、タイマー1及びCLCを使うことでタイマー2の機能から来る制約から解放されたのでクロック(HFINTOSC)の周波数を4倍の16MHzに上げFoscを8MHz、Fosc/4を2MHzとした。これで処理に余裕も生まれる。

前回の回路を実装してみたが上手く動かない。問題点は2つあった。1つ目はデータシートの回路図上のT1GSPMの表記(1/0)が逆になっていて(本文は正しかった)、ゲートによってカウンタが制御できなかった。このバグを潰すのに数日を要した。もう1点はタイマー1のゲートが閉じているとカウンター1のオーバフローが1になったままリセットできない点であり、そのため2回目以降のタイマー割込みを発生できないうえにD-FFがリセットされたままなのでタイマーのゲートが開けない、いわゆるデッドロックの状態になっている事である。設定を色々試したがどうしてもタイマー1はリセットできなかった(強制的にゲートを開けて数クロック入れてやればリセットされるが美しくない)。この件をネットで検索すると「CCPと組み合わせて使え」とのアドバイスが見付かった。どうやらCCPからタイマーをリセットできるようである。

そこで次図のようにタイマー1をCCPと組み合わせて使うよう変更した。CCPはコンペア+パルス出力+タイマーリセットモードに設定し、タイマー1のオーバーフローではなくタイマー1のカウント値がCCPRの値とマッチするタイミングでパルスを出力するようにし、そのパルスでCLCのD-FFをリセットするとともに割り込みをかけるようにした。同じタイミングでタイマー1はリセットされるようである。

これで上手く行った。これでパルス幅をデッドバンド幅の1μs単位で設定できるので低速の動きもスムーズになった。

このサーボコントローラはシリアルインターフェイス経由で次のようなオンライン・コマンドを受け付ける。


  (続く)

 

0 件のコメント:

コメントを投稿