控制算法、基本定义及其实现

来源:互联网 发布:ubuntu还是deepin 编辑:程序博客网 时间:2024/04/27 22:24

控制系统基本环节

  • 比例
  • 积分
  • 微分
  • 惯性
  • 二阶系统
  • 延时

PID调节

基本公式

  • 可以直接在网上搜

分类

位置式PID

  • PID输出直接给输出

增量式PID

  • PID得到的输出叠加在上一次PID的输出中作为系统输出

积分分离PID

  • 当控制量与给定值相差较大时,取消积分作用, 避免积分累加和过大造成的系统不稳定因素增加
  • 相关代码

    float SeqIntPID(float Kp, float Ki, float Kd, float GiveValue, float ActualValue){     float result;     float Err,KpWork, KiWork, KdWork;     Err = GiveValue - ActualValue;     KpWork = Kp*Err;     KiWork = Ki*SeqIntPIDErrADD;     KdWork = Kd*(Err-SeqIntErrBack);     if(fabs(Err) > 100)     {        result = KpWork+KdWork;     }     else{        result = KpWork+KiWork+KdWork;     }     SeqIntPIDErrADD = SeqIntPIDErrADD + Err;     SeqIntErrBack = Err;     return result;}

抗积分饱和PID

  • 2种方法
    • 限制积分累加和
    • 限制每次的控制量输出(可以防止长期停止在饱和区)
  • 相关代码(限制每次控制量输出代码)

    float OverIntPID(float Kp, float Ki, float Kd, float GiveValue, float ActualValue){     float result;     float Err,KpWork, KiWork, KdWork;     Err = GiveValue - ActualValue;     if(OverIntResultBack > 120)     {        if(Err < 0)        {            OverIntPIDErrADD = OverIntPIDErrADD + Err;        }     }     else if(OverIntResultBack < 120)     {         if(Err > 0)         {            OverIntPIDErrADD = OverIntPIDErrADD + Err;         }     }     else     {        OverIntPIDErrADD = OverIntPIDErrADD + Err;     }     KpWork = Kp*Err;     KiWork = Ki*OverIntPIDErrADD;     KdWork = Kd*(Err-OverIntErrBack);     result = KpWork+KiWork+KdWork;     OverIntErrBack = Err;     OverIntResultBack = result;     return result;}

变积分PID实现

  • 说明
    • 偏差越大,积分越慢;偏差越小,积分越快。
    • 给定累加的偏差一个权值,当系统偏差大于某一个值时,累积不完全的偏差值,甚至不进行偏差值的累加。
  • 相关代码

    float ChangeIntPID(float Kp, float Ki, float Kd, float GiveValue, float ActualValue){     float result;     float Err,KpWork, KiWork, KdWork,ErrCont;     Err = GiveValue - ActualValue;     KpWork = Kp*Err;     KiWork = Ki*ChangeIntPIDErrADD;     KdWork = Kd*(Err-ChangeIntErrBack);     result = KpWork+KiWork+KdWork;     if(fabs(Err)<= GiveValue*0.1)     {        ErrCont = Err;     }     else if((fabs(Err)<= GiveValue*0.9)&&(fabs(Err)> GiveValue*0.1))     {        ErrCont = ((0.9*GiveValue)-fabs(Err))*Err/(0.8*GiveValue);     }     else     {        ErrCont = 0;     }     ChangeIntPIDErrADD = ChangeIntPIDErrADD + ErrCont;     ChangeIntErrBack = Err;     return result;}

不完全微分 PID控制

  • 说明
    • 微分信号的可以改善系统的动态特性,但也容易引入高频干扰,在误差信号存在扰动时, 更是能够显示微分的不足之处。克服上述问题的方法之一就是在采用不完全微分 PID 控制,所谓不完全微分法就是在 PID 控制算法的微分项中加入一个一阶惯性环节。如此可是系统性能得到改善。
    • 这样会在高频时起到滤波的作用。
  • 参考代码

    float NoComDPID(float Kp, float Ki, float Kd, float Aifa, float GiveValue, float ActualValue){    float result;    float Err,KpWork, KiWork, KdWork;    Err = GiveValue - ActualValue;    KpWork = Kp*Err;    KiWork = Ki*NoComIntPIDErrADD;    if(Aifa > 1)    {        Aifa = 1;    }    if(Aifa < 0)    {        Aifa = 0;    }    KdWork = Kd*(1-Aifa)*(Err-ErrBbk)+ Aifa*KdWorkBbk;    result = KpWork+KiWork+KdWork;    NoComIntPIDErrADD = NoComIntPIDErrADD + Err;    KdWorkBbk = KdWork;    ErrBbk = Err;    return result;}

工业控制及其C语言算法实现

专家系统及其C语言实现

  • if else即可实现
    • 针对不同的条件组合给出不同的决策
  • 模糊逻辑及其C语言实现
  • 神经网络及其C语言实现
  • 遗传算法及其C语言实现
0 1
原创粉丝点击