PID进阶——分段PI-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3576|回复: 2

PID进阶——分段PI

[复制链接]
发表于 2020-2-27 15:12 | 显示全部楼层 |阅读模式
本帖最后由 wzzzq 于 2020-2-27 15:12 编辑

之前我发了一个PID麦克纳姆轮的帖子,不过脑抽给放到机器人里去了 链接:基于麦克纳姆轮的PID实例学习--机甲大师PID控制https://www.arduino.cn/forum.php ... 4294&fromuid=176749
(出处: Arduino中文社区)
一 构思
然后我发现一个问题,就是当调节速度不大时,就会出现超调现象,也就是Kp大了,但在调节速度大的时候Kp又小了,这个时候把Kp弄大了也不行,Kp弄小了也不行,于是在看了网上的很多帖子后,我决定写一个分段pid。
曲线.PNG   
二 实现
我找到一个转速的分割点,也就是这个调节分割点以上就用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后,能实现小变化量不会超调太多,调节大速度速度不会太慢。



发表于 2020-2-28 10:38 | 显示全部楼层
好思路!!向你学习!

好帖,继续收藏!
 楼主| 发表于 2020-2-28 20:08 | 显示全部楼层
上海老王 发表于 2020-2-28 10:38
好思路!!向你学习!

好帖,继续收藏!

主要也是自己的经验总结,我也没系统学过,也是自己一点一点摸索的

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 11:46 , Processed in 0.133068 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表