|
||
![]() |
サーボ駆動 |
ここでは、サーボ駆動について説明します。ラジコン用サーボは
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を出力させます。TGRHIと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変換で製作
した基板に、サーボを追加しました。サーボと接続するケーブルも、
スペーサーにタイラップで固定しています。![]() ![]() ![]() |
![]() |
|