はじめに
PICマイコンが実装するCLC(Configurable Logic Cell)は、TTLロジック回路を構成できるモジュールです。CLCはハードウェアなのでプログラムを必要とせず、モジュールを設定するだけで動作します。この実験では、CLCを使ってRCサーボモーター(以下RCサーボ)を動かします。なお、実験内容は後閑哲也氏の関連書籍/記事を踏襲したものです。
概要
CLCモジュールは、ロジック回路、ラッチ及びフリップフロップ(-F/F)の機能を有し、次の8種類のロジック・ブロックから選択できます。

内容
使用するマイコンはPIC16F18424(CLC x4内蔵)、RCサーボは手持ちのRB303c(MiniStudio)です。RCサーボは、周期パルスの幅で回転角を制御するモーターです。ここでは、制御パルス周期を20ms、パルス幅を0.9~2.0msとしています(右下)。

以下は、回路構成とタイムチャートです。2台のRCサーボを駆動します。MCCを使うと回路構成も簡単です。(構成手順は、当HPのカテゴリーから本記事を選択し、資料「MCC設定」を参照して下さい)
制御パルス周期は、タイマー2モジュールのTMR2とPR2の一致出力から20.48msに設定します。パルス幅はPWMモジュールで制御し、PWM信号周期はタイマー4モジュールのTMR4とPR4の一致出力から2.048msに設定します。

PR2とPR4でRS-FFがセットされ、次のPR4でリセットされるまでの2.048msの間、RS-FF出力(CLC1_OUT)はHi状態を保持します。RS-FFがリセットされると、D-FF出力(CLC3_OUT)はHiに反転します。CLC3_OUTの周期はCLC1_OUTと同じ20.48msですが、2.048ms(PR4_1周期)遅延します。これは、CLC3_OUTとPWM信号の論理積(AND)をとるためです。CLC3_OUTとPWM周期信号をAND回路に入力すると、PWM_1周期の信号だけが出力されます。これにより、20.48ms毎にPWM_1周期の信号がCLC2とCLC4から2つのRCサーボにそれぞれ出力されます。
PWMモジュールは、10ビットで動作させます。PWM周期は2.048msなので、RCサーボの出力としては0.9~2.048msまで使えます。これは、10ビット分解能のうち、450~1023に相当する(下図)ので、573ステップでRCサーボを制御できることになります。

PWM6/7のデューティは、PIC16F18424の12ビットADCモジュールからVddをリファレンスに、ジョイスティックによる電圧変化をAD変換して制御します。使用したジョイスティック(左下)は、X軸とY軸の2つのポテンショメータをスティック1本で動かす構造で、スティックを操作するとポテンショメータの抵抗値が変わり、放すとスティックは中立位置(ポテンショメータ中点)に戻ります。但し、正確な中立位置から多少バラつくので、その影響を回避するためにポテンショメータの中点前後を不感帯として、この領域の電圧変化はスティック操作無しとみなし、不感帯以上/以下の電圧変化はスティック操作ありとしてデューティをアップ/ダウンします(右下)。

結果
ブレッドボードに左下の回路を組んで実験しました。また、RCサーボは右下のように2台をブラケット(別売り)で連結して、Pan/Tilt(カメラの首振り機能)を構成しました。

以下はソースコードです。MCC自動生成関数を使用しています。CLCがRCサーボを動かすので、コードではポテンショメータX軸,Y軸のAD変換値を関数PWM6_LoadDutyValue,PWM7_LoadDutyValueにセットするだけです。

本実験の動画はこちら。2台のRCサーボが自在に動く様子が分かります。
まとめ
CLCにタイマーやPWMを組み合わせることで、PICの周辺モジュールだけでRCサーボを駆動できることが分かりました。これまでプログラムで実行していた処理を周辺モジュールに置き換えできれば、高速化が期待できる上にプログラムメモリーを節約できます。また、今回構成したPan/Tiltに、カメラを装着してリモート制御すれば監視カメラになります。ネットワーク機能を持つシングルボード・コンピューターなら、監視カメラの自作も可能と思われます。いつかトライしたいと思います。
– 以上 –