沼津高専 電子制御工学科
MIRSATLM PWM・ロータリーエンコーダ・RT-タスクモジュール取扱説明書
MIRSATLM-SOFT-1002
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2000.10.12 大島 牛丸 初版
B01 2001.3.19 大島 牛丸 最終的な仕様に変更

目次


始めに

 本ドキュメントは、ATLMMIRSの行動制御プログラム中で使用するPWM・ロータリーエンコーダ制御用関数の機能と、 行動制御プログラム・RT-タスク間のインターフェイスについて記したものである。
システム内の位置

 MIRSシステム内において、PWM・ロータリーエンコーダRT-タスクモジュールは下図の様に位置付けられている。
図1.システム構成図

インストール手順

本モジュールをRT-カーネルに組み込む方法を下に示す。

  1. ファイル(enc_mod.tar.gz)をダウンロードする。
  2. ファイルを解凍する。
    >tar xzvf enc_mod.tar.gz
  3. コンパイルする。
    >make
  4. モジュールを組み込む。
    >insmod enc_module.o
  5. モジュールが組み込まれたことを確認する。
    >lsmod

モジュールの削除は下記のコマンドを使用して行う。
>rmmod enc_module

コンパイルを行って作成したファイルの削除は下記のコマンドを使用して行う。
>make clean

Makefileについて

必要があれば下記のようにMakefileを書き換える。
例えば、both.cで定義されている関数を中に含むプログラム・test.cをコンパイルして、testという名前の実行ファイルを作成したい場合は、
	enc_stop.o: enc_stop.c
		$(CC) ${INCLUDE} ${CFLAGS} -c enc_stop.c
	
の次に下のような文を書き加える。
	both.o: both.c
		$(CC) -O2 -Wall -c both.c

	test: test.c both.o 
		$(CC) ${INCLUDE} -O2 -Wall both.o test.c -o test
	
また、一番上のallのところにもコンパイルしてできるファイル名を書き加えておく。(上の例の場合はboth.oとtestを書き加える。)
これを忘れるとエラーメーッセージが出てコンパイルされないので注意する。

アプリケーションインターフェイス

 本モジュールと行動制御プログラムとのインターフェースには、下記の3つのFIFOを使用する。
FIFO3(ロータリーエンコーダのカウント値用)
左右のロータリーエンコーダのカウント値が書き込まれる。
データの送受の向きは、RT-タスク ---> 行動制御プログラム

FIFO4(速度データ用)
左右のPWM速度データが書き込まれる。
データの送受の向きは、行動制御プログラム ---> RT-タスク

FIFO5(RT-タスク制御用)
START、STOP、RESTARTの指令とRT-タスクの実行周期が書き込まれる。
データの送受の向きは、行動制御プログラム ---> RT-タスク

行動制御プログラム中で使用する制御関数
  1. RT-タスク制御用(both.cの中で定義されている関数)
    void pwm_enco_start(int period)
    ロータリーエンコーダ・PWM制御用のRT-タスクをスタートさせるための関数。実行周期period(単位:μsec) を引数として与える。戻り値は無し。

    void pwm_enco_stop(void)
    ロータリーエンコーダ・PWM制御用のRT-タスクを停止させるための関数。 戻り値は無し。

    void pwm_enco_restart(void)
    pwm_enco_stopで停止させたRT-タスクを再スタートさせるための関数。 戻り値は無し。

  2. ロータリーエンコーダ制御用(encoder.cの中で定義されている関数)
    void encoder_data(int *l_distance, int *r_distance, int *l_speed, int *r_speed, int *br)
    FIFO3から左右のロータリーエンコーダのカウント値とフラグの状態を読み込んで、左右のタイヤの移動距離 ・速度とフラグの状態を戻り値として返す関数。この関数を用いて左右のタイヤの移動距離と速度を持ってくるためには、int型の変数を4つ用意して、

    int a, b, c, d, br;



    encoder_data(&a, &b, &c, &d, &br);

    というように記述する。こうすることによって変数a, b, c, d, brにそれぞれ左移動距離、右移動距離、左速度、右速度 フラグの状態が代入される。
    なお、距離や速度を求める際に必要なRT-タスクの実行周期やタイヤの直径は、task_control.hの中で定義 されているので(周期はperi、直径はdiameterという名前で)、必要があればそれを変更するようにする。

    フラグについて
    フラグは関数・pwm_circle_dataまたはpwm_cm_dataを使用した際にMIRSが動作を完了したことを確認するための もので、変数brが1になっていれば動作が完了したことを示す。(動作中、またはduty比モードを使った場合は0が入る)

  3. PWM制御用(pwm.cの中で定義されている関数)
    void pwm_both_data(int l_duty, int r_duty)
    速度データをPWMへ送るのに使用する関数。左右のモータのduty比・l_dutyr_dutyを引数として与える。
    duty比は -100〜100 の範囲の整数で、符号は正転が+(プラス)で逆転が-(マイナス)

    void pwm_left_data(int l_duty)
    左のタイヤの速度のみを変更する必要があるときに使用する関数。左モータのduty比・l_duty を引数として与える。

    void pwm_right_data(int r_duty)
    右のタイヤの速度のみを変更する必要があるときに使用する関数。右モータのduty比・r_duty を引数として与える。

    void pwm_circle_data(int angle)
    その場回転をする際に使用する関数。回転角・angleを引数として与える。
    符号は時計回りが+(プラス)で反時計回りが-(マイナス)

    void pwm_cm_data(int l_distance, int r_distance)
    MIRSを指定した距離だけ走らせて停止させるための関数。直進させる距離(単位:cm)・l_distancer_distanceを引数として与える。
    符号は前進が+(プラス)で後進が-(マイナス)

移動距離・速度の算出方法

タイヤ1回転あたりのカウント数C
タイヤの円周Ecm
モーターのギア比16:1

 仮にMIRSの足回りに関するデータが上記の通りであるとすると、タイヤの移動距離と速度は次のようにして 算出される。読み込んできたカウント数がx1、x2・・・xnであった場合(xnが最新のカウント値で、タスクの実行周期はyとする。)、

移動距離d: d [cm] = (x1+x2+・・・+xn)÷(C×16)×E[cm]

速度v: v [cm/sec] = xn÷(C×16)×E[cm]÷y[sec]


関連文書