本帖最后由 wzzzq 于 2020-2-27 15:12 编辑
之前我发了一个PID麦克纳姆轮的帖子,不过脑抽给放到机器人里去了 链接:基于麦克纳姆轮的PID实例学习--机甲大师PID控制https://www.arduino.cn/forum.php ... 4294&fromuid=176749
(出处: Arduino中文社区)
一 构思
然后我发现一个问题,就是当调节速度不大时,就会出现超调现象,也就是Kp大了,但在调节速度大的时候Kp又小了,这个时候把Kp弄大了也不行,Kp弄小了也不行,于是在看了网上的很多帖子后,我决定写一个分段pid。
二 实现
我找到一个转速的分割点,也就是这个调节分割点以上就用k大的Kp,小于就用小的Kp。然而我发现降速度是不会那么容易超调的,所以降的时候用中间的Kp。
注意是变化量,也就是吊塔(那个小三角)。不是速度的大小,网上也有很多说法是错的。比如我从1到15和30到45是一样的。而1-15和1-45是不一样的。
三 代码[mw_shl_code=arduino,true]int M1S,M2S,M3S,M4S,ref,in1,in2,in3,in4;
ref=max(map(b,sb,2007,0,50),25);
int x=ref-lr;//得到变化量
if((x>S1)&&(x<S2))
Kp=K2;
if((x<S1)&&(x>-5))
Kp=K1;
if(x>S2)
Kp=K3;
if(x<-5)//减速
Kp=K4;
//判断变化量,改变Kp S1:第一阶梯 S2:第二阶梯
/*in1=pulseIn(ma_in,HIGH,2000);
in2=pulseIn(mb_in,HIGH,2000);
in3=pulseIn(mc_in,HIGH,2000);
in4=pulseIn(md_in,HIGH,2000);
if(in1==0)
M1S=0;
else
M1S=map(in1,620,210,0,50);
if(in2==0)
M2S=0;
else
M2S=map(in2,620,210,0,50);
if(in3==0)
M3S=0;
else
M3S=map(in3,620,210,0,50);
if(in4==0)
M4S=0;
else
M4S=map(in4,620,210,0,50);
M1PWM(ref,M1S);
M2PWM(ref,M2S);
M3PWM(ref,M3S);
M4PWM(ref,M4S);
goright();
printf("右移,M1转速:%d ",M1S);
printf("右移,M2转速:%d ",M2S);
printf("右移,M3转速:%d ",M3S);
printf("右移,M4转速:%d\n",M4S);*///中间内容
lr=ref;//记录这次的参考转速[/mw_shl_code]
四 效果
调好各个Kp后,能实现小变化量不会超调太多,调节大速度速度不会太慢。
|