学习PID——PID参数整定

面包板社区 2023-04-19 20:02




在学习 PID 算法的参数整定的时候,每一个系统的 PID系数是不通用的,在不同的系统中运用同样的 PID 系数,其最终所体现的效果可能是相差可能甚远的,所以我们需要根据实际的系统进行 PID 的参数整定(调参)。




采样周期选择


采样周期指的是 PID 控制中实际值的采样时间间隔,其越短,效果越趋于连续,但对硬件资源的占用也越高。在实际的应用中,我们可以使用理论或者经验方法来确定采样周期:


① 理论方法:香农采样定理。


这个定理可以用来确定采样周期可选择的最大值,当采样周期超出了这个最大的允许范围,我们所得到的信号就会失真,也就无法较好地还原信号了。


香农采样定理的具体原理我们不展开介绍,感兴趣的朋友可以去查找相关的资料,我们这里重点关注经验方法。


② 经验方法:根据控制对象突变能力选择。


假设电机当前转速为 20RPM,我们需要提高它的转速到 30RPM,此电机的转速在 1s 之内最大可以突变 10RPM,如果我们每 1ms 采集一次电机转速,那么每一次采集到的速度变化量最大为 10RPM / 1000 =0.01RPM。


很明显,此时最大的变化量远远小于当前的速度,对我们的 PID 控制效果并没有明显的提升,但是却占用了很多的硬件资源,因此,我们需要根据控制对象的突变能力来选择采样周期。



PID 参数整定方法



理论计算整定法:依据系统的数学模型,经过理论计算确定 PID 参数。


这种方法是建立在理想化条件下的,其得到的参数不一定能够直接使用,还需要结合经验以及实际的系统进行调整。


工程整定法:依靠工程经验,直接在控制系统的试验中进行整定,此方法易于掌握,在实际调参中被广泛采用。工程整定法包括:试凑法、临界比例法和一般调节法。


注意:无论采用哪一种方法所得到的 PID 参数,都需要在实际运行中进行最后调整与完善,因此,在 PID 参数整定中,最重要的就是经验的积累。**


① 比例系数:调节作用快,系统一出现偏差,调节器立即将偏差放大输出


② 积分系数:积分系数的调节会改变输入偏差对于系统输出的影响程度。积分系数越大,消除静差的时间越短,但是过大的积分系数则会导致系统出现超调现象,这在具有惯性的系统中尤为明显。


③ 微分系数:微分系数的调节是偏差变化量对于系统输出的影响程度。微分系数越大,系统对于偏差量的变化越敏感,越能提前响应,进而抑制超调,但是过大的微分系数则会让整个系统出现振荡。


试凑法


内容:


结合系统的具体情况以及经验,先试凑几组合理的 PID 系数,同时需要观察系统的曲线变化,确定每一个系数对于整个系统曲线的大致影响,然后再根据具体的曲线进行调整。


调节思路


① 先是比例(P),再积分(I),最后是微分(D)


② 按纯比例系统整定比例系数,使其得到比较理想的调节过程曲线,然后再把比例系数缩小 1.2 倍左右,将积分系数从小到大改变,使其得到较好的调节过程曲线


③ 在这个积分系数下重新改变比例系数,再看调节过程曲线有无改善


④ 如果有改善,可将原整定的比例系数减少,改变积分系数,这样多次的反复,就可得到合适的比例系数和积分系数


⑤ 如果存在外界的干扰,系统的稳定性不好,可把比例、积分系数适当减小,使系统足够稳定


⑥ 如果系统存在小幅度超调,可以将整定好的比例系数和积分系数适当减小,增大微分系数,以得到超调量最小、调节作用时间最短的系统曲线


临界比例法


内容


在闭环的控制系统里,将调节器置于纯比例作用下,从小到大逐渐调节比例系数,直到系统曲线出现等幅振荡,再根据经验公式计算参数。


调节思路


① 将积分、微分系数置零,比例度取适当值,平衡操作一段时间,使控制系统按纯比例作用的方式投入运行


② 慢慢地增大比例系数,细心观察曲线的变化情况。如果控制过程的曲线波动是衰减的,则把比例系数继续增大;如果曲线波动是发散的,则应把比例系数减小,直至曲线波动呈等幅振荡,此时记下临界比例系数 δK 和临界振荡周期 Tk 的值


③ 根据记下的比例系数和周期,采用经验公式,计算调节器的参数




一般调节法


内容


这种方法针对一般的 PID 控制系统所以称之为一般调节法。


调节思路


① 首先将积分、微分系数置零,使系统为纯比例控制。控制对象的值设定为系统允许的最大值的 60%~70%,接着逐渐增大比例系数,直至系统出现振荡;


此时再逐渐减小比例系数,直至系统振荡消失,然后记录此时的比例系数,并设定系统的比例系数为当前值的 60%~70%


② 确定比例系数后,设定一个较小的积分系数,然后逐渐增大积分系数,直至系统出现振荡;此时在逐渐减小积分系数,直至系统振荡消失,然后记录此时的积分系数,并设定系统的积分系数为当前值的 55%~65%


③ 微分系数一般不用设定,为 0 即可。若系统出现小幅度振荡,并且通过 PI 环节无法优化,这可以采用与确定比例、积分系数相同的方法,微分系数取系统不振荡时的 30%左右。


④ 系统空载、带载联调,再对 PID 参数进行微调,直至满足要求


在使用PID时,如果只使用一个参数是没有意义,至少使用两个参数,并且P(比例项)是必须要有的


虽然PID有三个参数,但大多数情况下PID三个参数并不是都使用上的,一般会其中两个来组合使用,比如PI组合用于追求稳定的系统,PD组合用于追求快速响应的系统


当然PID用于即追求稳定又追求快速响应的系统,但是实际上PID参数越多越难调,而且许多情况下两个参数的效果已经足够了,所以我一般根据情况使用前两个。


实际调参


从实际的 PID 系统曲线来理解 PID 各个系数的调节效果。


① 先调整比例系数,积分、微分系数设置为 0,此时的系统只有比例环节参与控制,此时系统的曲线出现大幅振荡。




首先确定硬件上是否出现了故障,例如电压不稳定、电机堵转等,排除了这些之后,那就说明比例系数调节的过大了,这个时候我们可以把比例系数慢慢地减小,并同时观察曲线的变化。


② 当我们调小比例系数之后,曲线的大幅度振荡现象消失,但是曲线依旧存在小幅度的超调现象,并且此时通过调节比例系数已经无法优化曲线。



此时,我们可以慢慢地增大微分系数,并同时观察曲线的变化,从而找到最合适的参数。


增大微分系数之后,如果系统的曲线已经较为理想,则说明这个系统只需要比例和微分环节的控制。


③ 如果在纯比例环节的控制下,系统的实际值始终达不到目标值,存在静态误差。




此时,可以逐渐增大积分系数,并同时观察曲线的变化,如果消除静差的时间过长,则可以再适当增大积分系数,但是需要注意兼顾系统的超调量。


经过调整之后,如果系统的曲线已经较为理想,则说明这个系统只需要比例和积分环节的控制。


④ 如果系统在比例和积分环节的控制下出现小幅度的超调现象,可以慢慢地增大微分系数,并同时观察曲线的变化,从而找到最合适的参数。


以上就是在实际调参中经常遇到的一些问题以及解决方法。在实际应用中,控制系统是多样且复杂的,这一些方法只能作为参考,并不是通用的,因此在 PID 调参过程中,要注意经验的积累。


参考Code


PID初始化代码


定义一个新的PID参数时,就是建立一个新的结构体,运算和初始化时直接调用对应的成员变量就行,十分方便简洁,具体定义的结构体如下:


typedef struct{    //PID运算模式    uint8_t mode;    //PID 三个基本参数    __IO float Kp;    __IO float Ki;    __IO float Kd;
   __IO float max_out;  //PID最大输出    __IO float max_iout; //PID最大积分输出
   __IO float2 set;      //PID目标值    __IO float2 fdb;      //PID当前值
   __IO float out;        //三项叠加输出    __IO float Pout;        //比例项输出    __IO float Iout;        //积分项输出    __IO float Dout;        //微分项输出    //微分项最近三个值 0最新 1上一次 2上上次    __IO float Dbuf[3];      //误差项最近三个值 0最新 1上一次 2上上次    __IO float error[3];  
} pid_type_def;


初始运行时调用一次,初始化各个参数


void Own_PID_init(pid_type_def *pid, uint8_t mode, const __IO float PID[3], __IO float max_out, __IO float max_iout){    if (pid == NULL || PID == NULL){        return;    }    pid->mode = mode;    pid->Kp = PID[0];    pid->Ki = PID[1];    pid->Kd = PID[2];    pid->max_out = max_out;    pid->max_iout = max_iout;    pid->Dbuf[0] = pid->Dbuf[1] = pid->Dbuf[2] = 0.0f;    pid->error[0] = pid->error[1] = pid->error[2] = pid->Pout = pid->Iout = pid->Dout = pid->out = 0.0f;}



PID运算代码


__IO float PID_calc(pid_type_def *pid, __IO float ref, __IO float set){    //判断传入的PID指针不为空    if (pid == NULL){        return 0.0f;    }    //存放过去两次计算的误差值    pid->error[2] = pid->error[1];    pid->error[1] = pid->error[0];    //设定目标值和当前值到结构体成员    pid->set = set;    pid->fdb = ref;    //计算最新的误差值    pid->error[0] = set - ref;    //判断PID设置的模式    if (pid->mode == PID_POSITION)    {        //位置式PID        //比例项计算输出        pid->Pout = pid->Kp * pid->error[0];        //积分项计算输出        pid->Iout += pid->Ki * pid->error[0];        //存放过去两次计算的微分误差值        pid->Dbuf[2] = pid->Dbuf[1];        pid->Dbuf[1] = pid->Dbuf[0];        //当前误差的微分用本次误差减去上一次误差来计算        pid->Dbuf[0] = (pid->error[0] - pid->error[1]);        //微分项输出        pid->Dout = pid->Kd * pid->Dbuf[0];        //对积分项进行限幅        LimitMax(pid->Iout, pid->max_iout);        //叠加三个输出到总输出        pid->out = pid->Pout + pid->Iout + pid->Dout;        //对总输出进行限幅        LimitMax(pid->out, pid->max_out);    }    else if (pid->mode == PID_DELTA)    {        //增量式PID        //以本次误差与上次误差的差值作为比例项的输入带入计算        pid->Pout = pid->Kp * (pid->error[0] - pid->error[1]);        //以本次误差作为积分项带入计算        pid->Iout = pid->Ki * pid->error[0];        //迭代微分项的数组        pid->Dbuf[2] = pid->Dbuf[1];        pid->Dbuf[1] = pid->Dbuf[0];        //以本次误差与上次误差的差值减去上次误差与上上次误差的差值作为微分项的输入带入计算        pid->Dbuf[0] = (pid->error[0] - 2.0f * pid->error[1] + pid->error[2]);        pid->Dout = pid->Kd * pid->Dbuf[0];        //叠加三个项的输出作为总输出        pid->out += pid->Pout + pid->Iout + pid->Dout;        //对总输出做一个先限幅        LimitMax(pid->out, pid->max_out);    }    return pid->out;}


#define LimitMax(input, max)   \{                          \    if (input > max)       \    {                      \        input = max;       \    }                      \    else if (input < -max) \    {                      \        input = -max;      \    }                      \}


PID数据清空代码


有时候需要清除中间变量,例如目标值和中间变量清零。


void PID_clear(pid_type_def *pid){    if (pid == NULL)    {        return;    }    //当前误差清零    pid->error[0] = pid->error[1] = pid->error[2] = 0.0f;    //微分项清零    pid->Dbuf[0] = pid->Dbuf[1] = pid->Dbuf[2] = 0.0f;    //输出清零    pid->out = pid->Pout = pid->Iout = pid->Dout = 0.0f;    //目标值和当前值清零    pid->fdb = pid->set = 0.0f;}


处理PID算法还有很多算法,例如lqr算法等,项目这个开源项目就是lqr实现的。后面会详细介绍制作过程和算法。




END

六周年狂欢第二波!
进群即领50E币!
签到+10E币,天天可领!
连续签到5天再+50E币!
扫码进群,马上领50E币
👇扫码进群领取这波福利👇

👇👇点这里抢先兑换好礼!

面包板社区 面包板社区——中国第一电子人社交平台 面包板社区是Aspencore旗下媒体,整合了电子工程专辑、电子技术设计、国际电子商情丰富资源。社区包括论坛、博客、问答,拥有超过250万注册用户,加入面包板社区,从菜鸟变大神,打造您的电子人脉社交圈!
评论 (0)
  • ‌一、高斯计的正确选择‌1、‌明确测量需求‌‌磁场类型‌:区分直流或交流磁场,选择对应仪器(如交流高斯计需支持交变磁场测量)。‌量程范围‌:根据被测磁场强度选择覆盖范围,例如地球磁场(0.3–0.5 G)或工业磁体(数百至数千高斯)。‌精度与分辨率‌:高精度场景(如科研)需选择误差低于1%的仪器,分辨率需匹配微小磁场变化检测需求。2、‌仪器类型选择‌‌手持式‌:便携性强,适合现场快速检测;‌台式‌:精度更高,适用于实验室或工业环境。‌探头类型‌:‌横向/轴向探头‌:根据磁场方向选择,轴向探头适合
    锦正茂科技 2025-05-06 11:36 360浏览
  • 某国产固态电解的2次和3次谐波失真相当好,值得一试。(仅供参考)现在国产固态电解的性能跟上来了,值得一试。当然不是随便搞低端的那种。电容器对音质的影响_电子基础-面包板社区  https://mbb.eet-china.com/forum/topic/150182_1_1.html (右键复制链接打开)电容器对音质的影响相当大。电容器在音频系统中的角色不可忽视,它们能够调整系统增益、提供合适的偏置、抑制电源噪声并隔离直流成分。然而,在便携式设备中,由于空间、成本的限
    bruce小肥羊 2025-05-04 18:14 208浏览
  • 二位半 5线数码管的驱动方法这个2位半的7段数码管只用5个管脚驱动。如果用常规的7段+共阳/阴则需要用10个管脚。如果把每个段看成独立的灯。5个管脚来点亮,任选其中一个作为COM端时,另外4条线可以单独各控制一个灯。所以实际上最多能驱动5*4 = 20个段。但是这里会有一个小问题。如果想点亮B1,可以让第3条线(P3)置高,P4 置低,其它阳极连P3的灯对应阴极P2 P1都应置高,此时会发现C1也会点亮。实际操作时,可以把COM端线P3设置为PP输出,其它线为OD输出。就可以单独控制了。实际的驱
    southcreek 2025-05-07 15:06 163浏览
  • 文/郭楚妤编辑/cc孙聪颖‍相较于一众措辞谨慎、毫无掌舵者个人风格的上市公司财报,利亚德的财报显得尤为另类。利亚德光电集团成立于1995年,是一家以LED显示、液晶显示产品设计、生产、销售及服务为主业的高新技术企业。自2016年年报起,无论业绩优劣,董事长李军每年都会在财报末尾附上一首七言打油诗,抒发其对公司当年业绩的感悟。从“三年翻番顺大势”“智能显示我第一”“披荆斩棘幸从容”等词句中,不难窥见李军的雄心壮志。2012年,利亚德(300296.SZ)在深交所创业板上市。成立以来,该公司在细分领
    华尔街科技眼 2025-05-07 19:25 75浏览
  • 多功能电锅长什么样子,主视图如下图所示。侧视图如下图所示。型号JZ-18A,额定功率600W,额定电压220V,产自潮州市潮安区彩塘镇精致电子配件厂,铭牌如下图所示。有两颗螺丝固定底盖,找到合适的工具,拆开底盖如下图所示。可见和大部分市场的加热锅一样的工作原理,手绘原理图,根据原理图进一步理解和分析。F1为保险,250V/10A,185℃,CPGXLD 250V10A TF185℃ RY 是一款温度保险丝,额定电压是250V,额定电流是10A,动作温度是185℃。CPGXLD是温度保险丝电器元件
    liweicheng 2025-05-05 18:36 231浏览
  • 2024年初,OpenAI公布的Sora AI视频生成模型,震撼了国产大模型行业。随后国产厂商集体发力视频大模型,快手发布视频生成大模型可灵,字节跳动发布豆包视频生成模型,正式打响了国内AI视频生成领域第一枪。众多企业匆忙入局,只为在这片新兴市场中抢占先机,却往往忽视了技术成熟度与应用规范的打磨。以社交平台上泛滥的 AI 伪造视频为例,全红婵家人被恶意仿冒博流量卖货,明星们也纷纷中招,刘晓庆、张馨予等均曾反馈有人在视频号上通过AI生成视频假冒她。这些伪造视频不仅严重侵犯他人权
    用户1742991715177 2025-05-05 23:08 54浏览
  • 5小时自学修好BIOS卡住问题  更换硬盘故障现象:f2、f12均失效,只有ESC和开关机键可用。错误页面:经过AI的故障截图询问,确定是机体内灰尘太多,和硬盘损坏造成,开机卡在BIOS。经过亲手拆螺丝和壳体、排线,跟换了新的2.5寸硬盘,故障排除。理论依据:以下是针对“5小时自学修好BIOS卡住问题+更换硬盘”的综合性解决方案,结合硬件操作和BIOS设置调整,分步骤说明:一、判断BIOS卡住的原因1. 初步排查     拔掉多余硬件:断开所有外接设备(如
    丙丁先生 2025-05-04 09:14 111浏览
  • 随着智能驾驶时代到来,汽车正转变为移动计算平台。车载AI技术对存储器提出新挑战:既要高性能,又需低功耗和车规级可靠性。贞光科技代理的紫光国芯车规级LPDDR4存储器,以其卓越性能成为国产芯片产业链中的关键一环,为智能汽车提供坚实的"记忆力"支持。作为官方授权代理商,贞光科技通过专业技术团队和完善供应链,让这款国产存储器更好地服务国内汽车厂商。本文将探讨车载AI算力需求现状及贞光科技如何通过紫光国芯LPDDR4产品满足市场需求。 车载AI算力需求激增的背景与挑战智能驾驶推动算力需求爆发式
    贞光科技 2025-05-07 16:54 114浏览
  • 想不到短短几年时间,华为就从“技术封锁”的持久战中突围,成功将“被卡脖子”困境扭转为科技主权的主动争夺战。众所周知,前几年技术霸权国家突然对华为发难,导致芯片供应链被强行掐断,海外市场阵地接连失守,恶意舆论如汹涌潮水,让其瞬间陷入了前所未有的困境。而最近财报显示,华为已经渡过危险期,甚至开始反击。2024年财报数据显示,华为实现全球销售收入8621亿元人民币,净利润626亿元人民币;经营活动现金流为884.17亿元,同比增长26.7%。对比来看,2024年营收同比增长22.42%,2023年为7
    用户1742991715177 2025-05-02 18:40 206浏览
  • UNISOC Miracle Gaming奇迹手游引擎亮点:• 高帧稳帧:支持《王者荣耀》等主流手游90帧高画质模式,连续丢帧率最高降低85%;• 丝滑操控:游戏冷启动速度提升50%,《和平精英》开镜开枪操作延迟降低80%;• 极速网络:专属游戏网络引擎,使《王者荣耀》平均延迟降低80%;• 智感语音:与腾讯GVoice联合,弱网环境仍能保持清晰通话;• 超高画质:游戏画质增强、超级HDR画质、游戏超分技术,优化游戏视效。全球手游市场规模日益壮大,游戏玩家对极致体验的追求愈发苛刻。紫光展锐全新U
    紫光展锐 2025-05-07 17:07 153浏览
我要评论
0
1
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦