製品紹介 カスタマイズ パーツ販売 共同開発 技術サポート 技術情報 お問合せ 会社案内

サーボ駆動

 ここでは、サーボ駆動について説明します。ラジコン用サーボは PWM(Pulse Width Modulation)信号で駆動します。これは、下図の ように一定間隔(20msec)で発生するパルス信号の幅に情報 (サーボの角度)をのせた信号です。



 ここでは、sample3で述べたAD変換の 結果を使って、サーボを駆動します。センサーは AP-SENS、CPUボードはAP-CORE-Aを 仕様します。センサーの値を使ってサーボを動かすことができれば、 移動体の運動制御に応用できます。加速度センサの値は傾きに応じて 変化しますので、AP-SENSを動かすと、サーボもAP-SENSの傾きに応じて 動作します。


ハードウェア接続

 サーボを駆動するためのPWM信号は、samle1で述べた タイマー機能を使用します。今回はチャンネル0(TPU0)を使用しますので、 J11にサーボを接続します。サーボ用の電源は別途供給し、グランド(GND)を CPUボードと共通にします。シリアル通信はsample1で述べた シリアル通信と同様にJ6、AD変換はsample3で述べた AD変換と同様にJ4を使います。


ソフトウェア

 サーボを駆動するPWM信号は、タイマーを使って生成します。sample2 で述べた周期割込みと同様に、タイマーの コンペアマッチ機能を使用します。下図のように、20msec毎にカウントアップを開始し、 これと同時に出力信号をHIとします。そして、タイマジェネラルレジスタ (TGR)と一致したら、出力信号をLOとします。TGRの値を変えることで、 パルス幅を変化させます。サーボの場合、パルス幅は1msecから2msec となるように、TGRの値を設定します。(わかりやすくするため、下図の パルス幅は2msec以上となっています。)





 ソフトウェアはここからダウンロード してください。開発環境はsample1,2,3と同様にHEWを使用しています。 他のコンパイラを使用されている方は、読み替えてご使用ください。 ここでは、プログラムの要点のみ説明します。

初期設定

 初期設定で最低限設定するレジスタは、タイマコントロールレジスタ (TCR)と、タイマIOコントロールレジスタ(TIOR)です。50Hzの割込み には、sample2の周期割込みと同様に、 チャンネル2(TPU2)を使用し、今回のPWM信号はチャンネル0(TPU0)を 新たに使用します。チャンネル0とチャンネル2は独立に動作するので、 互いに影響を与えません。

TCR

 タイマーコントロールレジスタ(TCR)では、カウントアップ速度(TPSC) を設定します。これはsample2の周期割込みと同じで、 内部クロック(φ=20MHz)の1/16とします。

TIOR

 タイマIOコントロールレジスタ(TIOR)は、sample2の周期割込み では設定しませんでした。これは、sample2では、割込みを入れるだけでよかったので、 デフォルト値の出力禁止が使えたからです。今回はカウンタアップと同時にHI(初期値) とし、コンペアマッチ、つまりカウンタがタイマジェネラルレジスタ(TGR)と一致した際に、 LOを出力させますが、初期値ではいずれもLO出力とします。

tpu.c


サーボ出力関数

 このservo関数は、50Hzの周期で読み込みます。ここでは、 タイマIOコントロールレジスタ(TIOR)、タイマジェネラルレジスタ(TGR)、 タイマステータスレジスタ(TSR)、タイマインタラプトイネーブルレジスタ(TIER)、 タイマカウントレジスタ(TCNT)、タイマスタートレジスタ(TSTR)を設定します。

TIOR

 初期化ではLO出力としましたが、ここでは、カウントアップと同時にHI(初期値)とし、 コンペアマッチ、つまりカウンタがタイマジェネラルレジスタ(TGR)と一致した際に、 LOを出力させます。

TGR

 HIとLOを切り替えるタイミングを設定します。この値を変化させることで、 パルス幅を変えることができます。

TSR

 割込みを入れる前に、タイマステータスレジスタをクリアします。

TIER

 割込みを許可します。これにより、カウンタがタイマジェネラルレジスタ(TGR) と一致すると、割込みが入ります。

TCNT

 カウンタの初期値を0とします。

TSTR

 カウントアップを開始します。

srv.c


割込み設定

 カウンタがタイマジェネラルレジスタ(TGR)と一致した時点で、 出力はLOとなります。その後はカウントアップの必要はないので、 カウントアップを停止します。20msec後、上で述べたservo関数 が起動され、再度、カウントアップを開始します。

intprg.c


50Hz周期関数

 ここでは、AD変換を開始して、横加速度(AY)の値を使って サーボ出力を計算します。PWM信号のパルス幅は、ラジコン用サーボ の仕様から、1msecから2msecです。それぞれのタイマジェネラルレジスタ (TGR)値は、

TGR(1msec) = 0.001 * 20000000 / 16 = 1250
TGR(2msec) = 0.002 * 20000000 / 16 = 2500

となります。AD変換結果は0〜1023なので、TGRの値が横加速度(AY) のAD変換結果を使用して、TGRが1250〜2500の間に入るように TGR値を計算しています。

sample4.c


メイン関数

 最後にメイン関数です。今回はシリアル通信を使わないので、 タイマーとAD変換の初期化だけです。今回も何も実行しない 無限ループに入ります。

sample4.c



実行例

 実行例を紹介します。sample3のAD変換で製作 した基板に、サーボを追加しました。サーボと接続するケーブルも、 スペーサーにタイラップで固定しています。





 次の写真はPWM信号をオシロスコープで見た例です。サーボが動かない 場合は、オシロスコープで信号を見てみることをお勧めします。


 次の動画は実際にサーボを動かした例です。基板を左右に動かすと、 この動きに連動してサーボも動いています。今回は簡単な例ですが、 移動体が傾いたら、これを修正するようにサーボを動かすなどの 使い方ができます。

     
製品紹介 カスタマイズ パーツ販売 共同開発 技術サポート 技術情報 お問合せ 会社案内
〒890-0061 鹿児島市天保山町14-3 TEL 099-213-0511  FAX 099-213-0585