湘南工科大学ロボット研究部

湘南工科大学ロボット研究部です。

駆動配分について

どうもワズドルです。

私のマイコンカーはmain関数で4段階目標速度を指定して角度によって目標速度を変動させてあとはdiff関数と前回書いたプログラムを使って走行させています。本当は目標速度を旋回半径などから無段階で自動で求めるようにしたいのでそのうちやろうと思っています。

今回は駆動配分について書いていきます。
速度制御は前回書いたとおりです。
基本的には前回書いたプログラムのiSpeedPwmにdiff関数を用いて駆動配分を制御しています。
diff関数についてはマイコンカーのマニュアルに載っていたと思うのでそちらを参照してください。
通常トレースの場合は駆動配分はdiff関数で自動的に制御しています。

通常トレースの場合はこれでいいのですがどうしても駆動配分を固定したい場合などが有ります。
そういう場合には以下のプログラムを使っています。

void running_distribution( int speed, int fl, int fr, int rl, int rr){

int fl_ret;
int fr_ret;
int rl_ret;
int rr_ret;
int Calculate_speed;

 Xspeed = speed;
 Calculate_speed = speed - iEncoder3;

 fl_ret = fl * iSpeedPwm / 100;
 fr_ret = fr * iSpeedPwm / 100;
 rl_ret = rl * iSpeedPwm / 100;
 rr_ret = rr * iSpeedPwm / 100;

 if(fl_ret >= 100) fl_ret = 100;
 if(fl_ret <= -100) fl_ret = -100;

 if(fr_ret >= 100) fr_ret = 100;
 if(fr_ret <= -100) fr_ret = -100;

 if(rl_ret >= 100) rl_ret = 100;
 if(rl_ret <= -100) rl_ret = -100;

 if(rr_ret >= 100) rr_ret = 100;
 if(rr_ret <= -100) rr_ret = -100;

 if(Calculate_speed >= 0){
  motor_f( fl_ret, fr_ret );
  motor_r( rl_ret, rr_ret );
 }
 else{
  motor_f( fr_ret, fl_ret );
  motor_r( rr_ret, rl_ret );
 }

}
speed:目標速度
fl:左前駆動配分(上限100%)
fr:右前駆動配分(上限100%)
rl:左後駆動配分(上限100%)
rr:右後駆動配分(上限100%)
という感じで指定しています。
中身としてはiSpeedPwmに指定の値/100を掛けて配分を決めて減速時は左右逆にするというものになってます。
もしかしたら左右逆にするのはあまりよろしくないかも。

PID速度制御について

どうもワズドルです。

また放置していたので気まぐれで書いていきます。

マイコンカーで今実装してる速度制御について書いていきます。
とりあえずプログラムを載せていきます。
最初に載せるのは速度制御のプログラムです。
これは、MCRのプログラムのマニュアルとかに載ってておなじみのライントレースの関数のservoControl()に似せて作った速度のPID制御のプログラムです。

void speedControl( void )
{
int i, x, iRet, iP, iD;

//Xspeedはグローバル変数で目標速度の値
x = Xspeed;
//iEncoder3 はエンコーダーの値(10msの積算値で1msごとに更新)
i = x - iEncoder3 ;

/* 速度制御用PWM値計算 */
iP = 100 * i; /* 比例 100 */
iD = 100 * (iSpeedBefore - i ); /* 微分 150 */
iRet = iP - iD;
iRet /= 16;//16 18

//減速フリー設定(直線時にonにしてる)
if(speedControl_Free_mode == 1){
 if( iRet < 1 ) iRet = 1;
}
//減速ショートブレーキ設定(今のところ使っていない)
if(speedControl_Breake_mode == 1){
 if( iRet < -1 ) iRet = -1;
}
if( iRet > 100 ) iRet = 100; //95
if( iRet < -100 ) iRet = -100;

iSpeedPwm = iRet ;
iSpeedBefore = i ;

}

使い方は基本的にライントレースのPID制御と一緒なので分からなかったらマイコンカーのマニュアルを参照し比較してください。
iP,iD,iRetの割ってるところは実際に走らせて調整してください。
あと注意点としてはエンコーダーが一相の場合正転逆転の判別がつかないので暴走して逆走する可能性があります。特に低速時は注意。