学习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万注册用户,加入面包板社区,从菜鸟变大神,打造您的电子人脉社交圈!
评论
  • 随着全球向绿色能源转型的加速,对高效、可靠和环保元件的需求从未如此强烈。在这种背景下,国产固态继电器(SSR)在实现太阳能逆变器、风力涡轮机和储能系统等关键技术方面发挥着关键作用。本文探讨了绿色能源系统背景下中国固态继电器行业的前景,并强调了2025年的前景。 1.对绿色能源解决方案日益增长的需求绿色能源系统依靠先进的电源管理技术来最大限度地提高效率并最大限度地减少损失。固态继电器以其耐用性、快速开关速度和抗机械磨损而闻名,正日益成为传统机电继电器的首选。可再生能源(尤其是太阳能和风能
    克里雅半导体科技 2025-01-10 16:18 325浏览
  •   在信号处理过程中,由于信号的时域截断会导致频谱扩展泄露现象。那么导致频谱泄露发生的根本原因是什么?又该采取什么样的改善方法。本文以ADC性能指标的测试场景为例,探讨了对ADC的输出结果进行非周期截断所带来的影响及问题总结。 两个点   为了更好的分析或处理信号,实际应用时需要从频域而非时域的角度观察原信号。但物理意义上只能直接获取信号的时域信息,为了得到信号的频域信息需要利用傅里叶变换这个工具计算出原信号的频谱函数。但对于计算机来说实现这种计算需要面对两个问题: 1.
    TIAN301 2025-01-14 14:15 108浏览
  • 食物浪费已成为全球亟待解决的严峻挑战,并对环境和经济造成了重大影响。最新统计数据显示,全球高达三分之一的粮食在生产过程中损失或被无谓浪费,这不仅导致了资源消耗,还加剧了温室气体排放,并带来了巨大经济损失。全球领先的光学解决方案供应商艾迈斯欧司朗(SIX:AMS)近日宣布,艾迈斯欧司朗基于AS7341多光谱传感器开发的创新应用来解决食物浪费这一全球性难题。其多光谱传感解决方案为农业与食品行业带来深远变革,该技术通过精确判定最佳收获时机,提升质量控制水平,并在整个供应链中有效减少浪费。 在2024
    艾迈斯欧司朗 2025-01-14 18:45 57浏览
  • PNT、GNSS、GPS均是卫星定位和导航相关领域中的常见缩写词,他们经常会被用到,且在很多情况下会被等同使用或替换使用。我们会把定位导航功能测试叫做PNT性能测试,也会叫做GNSS性能测试。我们会把定位导航终端叫做GNSS模块,也会叫做GPS模块。但是实际上他们之间是有一些重要的区别。伴随着技术发展与越发深入,我们有必要对这三个词汇做以清晰的区分。一、什么是GPS?GPS是Global Positioning System(全球定位系统)的缩写,它是美国建立的全球卫星定位导航系统,是GNSS概
    德思特测试测量 2025-01-13 15:42 489浏览
  • 01. 什么是过程能力分析?过程能力研究利用生产过程中初始一批产品的数据,预测制造过程是否能够稳定地生产符合规格的产品。可以把它想象成一种预测。通过历史数据的分析,推断未来是否可以依赖该工艺持续生产高质量产品。客户可能会要求将过程能力研究作为生产件批准程序 (PPAP) 的一部分。这是为了确保制造过程能够持续稳定地生产合格的产品。02. 基本概念在定义制造过程时,目标是确保生产的零件符合上下规格限 (USL 和 LSL)。过程能力衡量制造过程能多大程度上稳定地生产符合规格的产品。核心概念很简单:
    优思学院 2025-01-12 15:43 520浏览
  • 根据Global Info Research(环洋市场咨询)项目团队最新调研,预计2030年全球无人机电池和电源产值达到2834百万美元,2024-2030年期间年复合增长率CAGR为10.1%。 无人机电池是为无人机提供动力并使其飞行的关键。无人机使用的电池类型因无人机的大小和型号而异。一些常见的无人机电池类型包括锂聚合物(LiPo)电池、锂离子电池和镍氢(NiMH)电池。锂聚合物电池是最常用的无人机电池类型,因为其能量密度高、设计轻巧。这些电池以输出功率大、飞行时间长而著称。不过,它们需要
    GIRtina 2025-01-13 10:49 180浏览
  • 随着数字化的不断推进,LED显示屏行业对4K、8K等超高清画质的需求日益提升。与此同时,Mini及Micro LED技术的日益成熟,推动了间距小于1.2 Pitch的Mini、Micro LED显示屏的快速发展。这类显示屏不仅画质卓越,而且尺寸适中,通常在110至1000英寸之间,非常适合应用于电影院、监控中心、大型会议、以及电影拍摄等多种室内场景。鉴于室内LED显示屏与用户距离较近,因此对于噪音控制、体积小型化、冗余备份能力及电气安全性的要求尤为严格。为满足这一市场需求,开关电源技术推出了专为
    晶台光耦 2025-01-13 10:42 495浏览
  • ARMv8-A是ARM公司为满足新需求而重新设计的一个架构,是近20年来ARM架构变动最大的一次。以下是对ARMv8-A的详细介绍: 1. 背景介绍    ARM公司最初并未涉足PC市场,其产品主要针对功耗敏感的移动设备。     随着技术的发展和市场需求的变化,ARM开始扩展到企业设备、服务器等领域,这要求其架构能够支持更大的内存和更复杂的计算任务。 2. 架构特点    ARMv8-A引入了Execution State(执行状
    丙丁先生 2025-01-12 10:30 465浏览
  • 数字隔离芯片是现代电气工程师在进行电路设计时所必须考虑的一种电子元件,主要用于保护低压控制电路中敏感电子设备的稳定运行与操作人员的人身安全。其不仅能隔离两个或多个高低压回路之间的电气联系,还能防止漏电流、共模噪声与浪涌等干扰信号的传播,有效增强电路间信号传输的抗干扰能力,同时提升电子系统的电磁兼容性与通信稳定性。容耦隔离芯片的典型应用原理图值得一提的是,在电子电路中引入隔离措施会带来传输延迟、功耗增加、成本增加与尺寸增加等问题,而数字隔离芯片的目标就是尽可能消除这些不利影响,同时满足安全法规的要
    华普微HOPERF 2025-01-15 09:48 75浏览
  • 随着通信技术的迅速发展,现代通信设备需要更高效、可靠且紧凑的解决方案来应对日益复杂的系统。中国自主研发和制造的国产接口芯片,正逐渐成为通信设备(从5G基站到工业通信模块)中的重要基石。这些芯片凭借卓越性能、成本效益及灵活性,满足了现代通信基础设施的多样化需求。 1. 接口芯片在通信设备中的关键作用接口芯片作为数据交互的桥梁,是通信设备中不可或缺的核心组件。它们在设备内的各种子系统之间实现无缝数据传输,支持高速数据交换、协议转换和信号调节等功能。无论是5G基站中的数据处理,还是物联网网关
    克里雅半导体科技 2025-01-10 16:20 444浏览
  • 新年伊始,又到了对去年做总结,对今年做展望的时刻 不知道你在2024年初立的Flag都实现了吗? 2025年对自己又有什么新的期待呢? 2024年注定是不平凡的一年, 一年里我测评了50余块开发板, 写出了很多科普文章, 从一个小小的工作室成长为科工公司。 展望2025年, 中国香河英茂科工, 会继续深耕于,具身机器人、飞行器、物联网等方面的研发, 我觉得,要向未来学习未来, 未来是什么? 是掌握在孩子们生活中的发现,和精历, 把最好的技术带给孩子,
    丙丁先生 2025-01-11 11:35 457浏览
  • 流量传感器是实现对燃气、废气、生活用水、污水、冷却液、石油等各种流体流量精准计量的关键手段。但随着工业自动化、数字化、智能化与低碳化进程的不断加速,采用传统机械式检测方式的流量传感器已不能满足当代流体计量行业对于测量精度、测量范围、使用寿命与维护成本等方面的精细需求。流量传感器的应用场景(部分)超声波流量传感器,是一种利用超声波技术测量流体流量的新型传感器,其主要通过发射超声波信号并接收反射回来的信号,根据超声波在流体中传播的时间、幅度或相位变化等参数,间接计算流体的流量,具有非侵入式测量、高精
    华普微HOPERF 2025-01-13 14:18 477浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦