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

控制系统基本环节

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

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语言实现
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

littletomatodonkey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值