页次: 1
int Incremental_PI_B (int Encoder,int Target)
{
static int Bias,Pwm,Last_bias;
Bias=Encoder-Target; //计算偏差
Pwm+=Velocity_KP*(Bias-Last_bias)+Velocity_KI*Bias; //增量式PI控制器
if(Pwm>7200) Pwm=7200;
if(Pwm<-7200) Pwm=-7200;
Last_bias=Bias; //保存上一次偏差
return Pwm; //增量输出
}
看过很多代码 如上pi的增量式调节电机速度时候,会有些问题。
小车如果在一个有坡度的地方停车后。或者什么外力碰撞小车后,导致encoder 从编码读出来的脉冲计数。
假设 encoder =20 ,target =0;p=10 ,i =0.1;
通过代入计算可得到
Bias = 20;
pwm = 10*20 +0.1*20 = 202
当电机驱动器响应pwm值后。假设电机转的更快,那么这时车是停不了的。
所以车要有制动刹车功能,电机不转不管任何外力都不能迫使其转动。
也可以如下改动
int Incremental_PI_B (int Encoder,int Target)
{
static int Bias,Pwm,Last_bias;
if(Target ==0)
{
Bias= 0;Pwm=0;
Last_bias =0;
pwm =0;
return pwm;
}
Bias=Encoder-Target; //计算偏差
Pwm+=Velocity_KP*(Bias-Last_bias)+Velocity_KI*Bias; //增量式PI控制器
if(Pwm>7200) Pwm=7200;
if(Pwm<-7200) Pwm=-7200;
Last_bias=Bias; //保存上一次偏差
return Pwm; //增量输出
}
离线
页次: 1