0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PID参数整定实际调参

麦辣鸡腿堡 来源:古月居 作者:行走的皮卡丘 2023-11-14 17:40 次阅读

实际调参

从实际的 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;
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制系统
    +关注

    关注

    41

    文章

    6542

    浏览量

    110464
  • 硬件
    +关注

    关注

    11

    文章

    3251

    浏览量

    66105
  • PID
    PID
    +关注

    关注

    35

    文章

    1471

    浏览量

    85281
收藏 人收藏

    评论

    相关推荐

    关于温度控制的PID参数问题

    这种情况是怎么回事;求教下相关PID参数方法,涉及到温度控制方面的。另外通过Autotunning PID
    发表于 05-05 16:20

    干货|最经典的PID参数教程

    调节器YR-GFD和人工智能调节器YR-GND具有先进的PID控制算法和自功能,使用者启动仪表自功能后,不需要人工干预就可以自动算出
    发表于 12-26 21:40

    PID参数的方法

    时Dout会有非常尖的尖峰,这时就要对delError进行限幅。在PID调节中,不允许出现很大的尖峰。  调好D后,NowVal会很好的跟随TargetVal的变化而变化。  三、看图参数
    发表于 06-23 14:54

    STM32电机的PID参数

    如何去实现STM32电机的PID参数?如何去编写STM32电机的PID参数
    发表于 09-23 08:07

    PID的相关资料分享

    说明:本文章适用于STM32初学者,想完成一个好玩且有深度的项目但不知道从何下手的同学。PID是平衡车的精髓所在,参数
    发表于 01-14 09:14

    PID参数方法的研究

    PID参数方法的研究-2009,下来看看。
    发表于 03-31 17:01 20次下载

    基于MATLAB_SimuIink的PID参数

    基于MATLABSimuIink的PID参数-2009
    发表于 03-31 17:46 12次下载

    PID参数方法及其应用研究

    PID教程之PID参数方法及其应用研究
    发表于 09-01 15:01 0次下载

    PID控制最通俗的解释与PID参数方法

    PID控制最通俗的解释与PID参数方法
    发表于 01-04 14:47 42次下载

    增量式pid分析及参数

    PID算法是工程控制领域常用的一种算法,其有着技术成熟,不需要建立数学模型,参数灵活,适用性强,鲁棒性强,控制效果好等优点,得到了广泛的应用,其
    发表于 11-24 16:27 1.6w次阅读
    增量式<b class='flag-5'>pid</b>分析及<b class='flag-5'>参数</b><b class='flag-5'>整</b><b class='flag-5'>定</b>

    基于MATLAB的PID\PID参数方法概述

    PID控制是最早发展起来的控制策略之一,因为它所涉及的设计算法和控制结构都很简单,因此,被广泛应用于过程控制和运动控制中。但在实际系统设计过程中,设计师经常受到参数
    发表于 11-24 16:42 3.8w次阅读
    基于MATLAB的<b class='flag-5'>PID</b>\<b class='flag-5'>PID</b><b class='flag-5'>参数</b>自<b class='flag-5'>整</b><b class='flag-5'>定</b>方法概述

    PID控制参数的原理和的的计算方法PID参数的方法和概述

    PID是比例、积分、微分的简称,PID控制的难点不是编程,而是控制器的参数参数
    发表于 05-31 08:40 45次下载
    <b class='flag-5'>PID</b>控制<b class='flag-5'>参数</b>的原理和<b class='flag-5'>整</b><b class='flag-5'>定</b>的的计算方法<b class='flag-5'>整</b><b class='flag-5'>定</b><b class='flag-5'>PID</b><b class='flag-5'>参数</b>的方法和概述

    数字PID及其参数方法

    数字PID及其参数方法介绍。
    发表于 05-31 16:34 27次下载

    PID参数简介

    PID参数资料免费下载。
    发表于 06-01 10:36 33次下载

    PID参数试凑法介绍

    。 工程定法:依靠工程经验,直接在控制系统的试验中进行,此方法易于掌握,在实际中被广泛
    的头像 发表于 11-14 17:21 1678次阅读
    <b class='flag-5'>PID</b><b class='flag-5'>参数</b><b class='flag-5'>整</b><b class='flag-5'>定</b>试凑法介绍