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

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

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の割ってるところは実際に走らせて調整してください。
あと注意点としてはエンコーダーが一相の場合正転逆転の判別がつかないので暴走して逆走する可能性があります。特に低速時は注意。