查看: 1836|回复: 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后,能实现小变化量不会超调太多,调节大速度速度不会太慢。



签到天数: 6 天

[LV.2]偶尔看看I

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

好帖,继续收藏!

该用户从未签到

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

好帖,继续收藏!

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

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

本版积分规则

热门推荐

.h .cpp源代码转.ino草图
.h .cpp源代码转.ino草图
在Github上下载了源码,是.h 和.cpp文件,请问一下,如何才可以转成可以在arduinoIDE
【Arduino】168种传感器模块系列实验(159)---MAX9814咪头传感器
【Arduino】168种传感器模
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
blinker 控制42步进电机
blinker 控制42步进电机
刚开始学习esp8266,偶尔发现了blinker,感觉就一神器,满足了我能“看”的要求。想控
【Arduino】168种传感器系列实验(183)---VL53L0X激光测距模块
【Arduino】168种传感器系
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
ps2遥控小车——uno实现
ps2遥控小车——uno实现
前几天在阁楼发现了好久以前3d打印,激光切割的底盘,于是决定做这个东西 正好手上又
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表