PICでのモータードライブ制御にはCCP1必須2011年09月29日 19時45分06秒

PIC16F648Aを使って五藤光学MARK-X用モータードライブの制御を試みていますが、インターバルタイマーでパルスモータの駆動パルスを生成する手法には注意が必要です。
以下の方法が考えられます。

(1) TIMER1を使ったタイマ割り込みでタイマカウンタを再設定しつつパルス出力
(2) TIMER1とCCP1を使ってコンパレータで比較設定値がTIMER1のカウンタと一致した時のCCP1割り込みでパルス出力

最初は(1)の方法を使っていたのですが、実験してみるとどんどん回転がリファレンスよりも遅れていきました。リファレンスとは五藤光学製のP型モータードライブです。回転軸を同じ位相に設定した後まわしっ放しにして何時間たとうが同じ位相関係を維持していればリファレンスとのずれはないことになります。
この方法での実験で(1)の方法ではずれて行ったのです。

この方法ではタイマ割り込み処理内で次のタイマカウンタ値を設定するため、この処理のオーバーヘッドによりずれが発生していると考え、処理遅延を加味してタイマカウンタ値を設定するように試行錯誤しましたが余り改善されませんでした。

そこで(2)の方法を使います。実は最初は(2)の方法そのものを知りませんでした。この方法を教えてくださった、air variableさんに感謝いたします。
(2)の方法を使ったソースコードはこちらです。
※(2011/11/04追記:上記のソースコードにはバグがあります。CCP1の比較値はマイナス1する必要あり。)


この方法では割り込み処理でタイマカウンタをリセットする必要はありません。カウンタ一致時点で割り込み要求フラグを立てると同時にコントローラがTIMER1のカウンタもリセットしてくれます。これにより、リファレンスとのずれは発生しなくなりました。
但し、水晶発振子の精度には依存しますので、発振自体が狂うとずれることになります。

以下はリファレンスとして使っている五藤光学のP型モータードライブです。回転軸の位相を合わせて比較しています。

駆動モードはディップスイッチの1~3の3ビットで指定します。
以下は恒星時設定(モード0)での出力を周波数カウンタで計測した結果です。
5.26424Hzは水晶発振周波数に逆算すると3.99998012MHzとなって使っている4MHzの水晶発振子からの誤差は-4.9696ppm相当の計算になります。これでCCP1でのインターバルタイマ処理の精度は十分であるということが分かりました。計算カウンタ値はそのまま比較値として使用することができますので、何らかの値を減算するような必要もありません。
※(2011/11/04追記:上記の比較値に対する説明は間違い。CCP1の比較値は計算値からマイナス1する必要あり。)


以下はキングスレート設定(モード1)での出力を周波数カウンタで計測した結果です。

他にモード2:太陽時、モード3:月時、モード4:星景モードがありますが、この日は実測しませんでした。

以下、計算のためのEXCELシートの情報です。