ここではサーボコントローラー4〜7まで共通な、制御ソフトのアルゴリズム等について 説明します。
概要
信号を作るコードの合間に以下のような機能を実現するコードが挟まれています。
各モーター用信号間のタイミング
時間的に並列とはいうものの、ソフトで信号を作る場合は、各セット用の分岐命令(if文) が連なることになるので、分岐命令とそれに連なる処理の実行サイクルにより、信号の 分解能が制約されます。よって、接続できるサーボの総数が、 マイコン内蔵のPWMパルスを作る専用のタイマに 拘束されないというメリットはあるものの、セット数を増やすほどに分解能が下がってきます。
この様な理由で、2L1v5用に製作したサーボコントローラー7では、 2L1v2〜v4用のサーボコントローラー5で使用していなかった 3セットめの信号を止め、分解能を上げました。
モーター1個に注目した時間の分け方
この時間は変わりませんので、この間にPCとの通信などを行っています。
サンプルプログラム
2L2等のプログラムはこの基本構造に対して、信号を出すポートを複数並列にしたり、 センサーからの入力を処理する部分をはさんだり等と膨らませていったプログラム になっています。
#include <3048F.H>
void main(void)
{
/*ハードの初期化******************************/
P1.DDR = 0xff;
/*クロックを8分週*/
ITU0.TCR.BIT.TPSC = 3;
/*TW Startフリーランニングモード*/
ITU.TSTR.BIT.STR0 = 1;
/*ループ**************************************/
while(1)
{
/*タイマリセット*/
ITU0.TCNT = 0;
/*制御信号ハイに*/
P1.DR.BIT.B0 = 1;
/*時間が来るまで待つ(1.5msec)*/
while(ITU0.TCNT < 3000);
/*制御信号ローに*/
P1.DR.BIT.B0 = 0;
/**************************************/
/*ここにセンサーの入出力や通信など書く*/
/**************************************/
/*時間が来るまで待つ(20msec)*/
while(ITU0.TCNT < 40000);
}
}
この例で言いますと
/*時間が来るまで待つ(1.5msec)*/
while(ITU0.TCNT < 3000);
の3000を変えるとパルスのハイレベルの時間が変わり、RCサーボが中立から動く という仕組みです。このループは1秒間に50回まわりますので、1回ごとに少しずつ 値を変えていくと、RCサーボが少しづつ滑らかに動きます。
早く動かす時は入れ替える数字の変化を大きく、ゆっくり動かす時は数字の 変化を小さくします。
間に挟む処理は、ループが回るサイクルが規定の時間をオーバーしないように気をつけます。 例えば、「ここにセンサーの・・・」の部分に3秒かかる処理を挟むと、パルスの サイクルが3秒離れてしまいますので、例外的に時間がかかる処理をする場合は、ロボットが 転倒等しないように処理に入る条件を良く考えないといけません。