精华内容
下载资源
问答
  • 本代码可用于嵌入式编程,文件夹中包含头文件和C文件,除了基本的PID 算法本代码还包括积分分离PID,抗积分饱和PID、可变积分PID
  • 包含1.位置型PID控制算法2.增量型PID控制算法3.积分分离PID控制算法4.抗积分饱和PID控制算法5.梯形积分PID控制算法6..变积分PID控制算法的C语言实现
  • 采用抗积分饱和PID控制算法进行离散系统阶跃响应。可以避免控制量长时间停留在饱和区,防止系统产生超调。
  • 地暖系统对室温控制的低效性与滞后性是当前存在的主要问题,PID控制算法的引入对这一现象起到了一定的改善作用,然而传统的...试验结果表明,引入抗积分饱和PID算法比传统PID算法在控制精度与稳定性方面均有所提高。
  • 抗积分饱和PID控制算法C++语言实现 所谓的积分饱和现象是指如果系统存在一个方向的偏差,PID控制器的输出由于积分作用的不断累加而加大,从而导致执行机构达到极限位置,若控制器输出U(k)继续增大,执行器开度...

    PID控制算法的C++语言实现

    六 抗积分饱和的PID控制算法C++语言实现

    所谓的积分饱和现象是指如果系统存在一个方向的偏差,PID控制器的输出由于积分作用的不断累加而加大,从而导致执行机构达到极限位置,若控制器输出U(k)继续增大,执行器开度不可能再增大,此时计算机输出控制量超出了正常运行范围而进入饱和区。一旦系统出现反向偏差,u(k)逐渐从饱和区退出。进入饱和区越深则退出饱和区时间越长。在这段时间里,执行机构仍然停留在极限位置而不随偏差反向而立即做出相应的改变,这时系统就像失控一样,造成控制性能恶化,这种现象称为积分饱和现象或积分失控现象

    防止积分饱和的方法之一就是抗积分饱和法,该方法的思路是在计算u(k)时,首先判断上一时刻的控制量u(k-1)是否已经超出了极限范围: 如果u(k-1)>umax,则只累加负偏差; 如果u(k-1)<umin,则只累加正偏差。从而避免控制量长时间停留在饱和区。直接贴出代码,不懂的看看前面几节的介绍.

    pid.h:
    #ifndef _PID_H_
    #define _PID_H_
     
    typedef struct _pid{
    float SetSpeed;
    float ActualSpeed;
    float err;
    float err_last;
    float Kp, Ki, Kd;
    float voltage;
    float integral;
    float umax;
    float umin;
    }Pid;
     
     
    class Pid_control
    {
    public:
     
    void PID_init();
    float PID_realize(float speed);
     
    private:
    int index;
    Pid pid;
    };
    #endif
    pid.cpp:
    #include <iostream>
    #include "pid.h"
     
    using namespace std;
     
    void  Pid_control::PID_init()
    {
    pid.SetSpeed = 0.0;
    pid.ActualSpeed = 0.0;
    pid.err = 0.0;
    pid.err_last = 0.0;
    pid.voltage = 0.0;
    pid.integral = 0.0;
    pid.Kp = 0.2;
    pid.Ki = 0.1;
    pid.Kd = 0.2;
    pid.umax = 400;
    pid.umin = -200;
    }
     
    float Pid_control::PID_realize(float speed){
    int index;
    pid.SetSpeed = speed;
    pid.err = pid.SetSpeed - pid.ActualSpeed;
     
    if (pid.ActualSpeed>pid.umax)
    {
     
    if (abs(pid.err)>200)
    {
    index = 0;
    }
    else{
    index = 1;
    if (pid.err<0)
    {
    pid.integral += pid.err;
    }
    }
    }
    else if (pid.ActualSpeed<pid.umin){
    if (abs(pid.err)>200)
    {
    index = 0;
    }
    else{
    index = 1;
    if (pid.err>0)
    {
    pid.integral += pid.err;
    }
    }
    }
    else{
    if (abs(pid.err)>200)
    {
    index = 0;
    }
    else{
    index = 1;
    pid.integral += pid.err;
    }
    }
     
    pid.voltage = pid.Kp*pid.err + index*pid.Ki*pid.integral + pid.Kd*(pid.err - pid.err_last);
     
    pid.err_last = pid.err;
    pid.ActualSpeed = pid.voltage*1.0;
    return pid.ActualSpeed;
    }
    main.cpp
    #include "pid.h"
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
    Pid_control Pid;
     
    Pid.PID_init();
     
    int count = 0;
     
    while (count<1000)
    {
    float speed = Pid.PID_realize(200.0);
     
    cout << speed << ";" << " ";
     
    count++;
    }
    cout << endl;
     
    system("pause");
     
    return 0;
    }
    最终的测试程序运算结果如下,可以明显的看出系统的稳定时间相对前几次来讲缩短了不少。


     

     

    展开全文
  • 抗积分饱和PID控制算法PDF文档+MATLAB源程序,全部通过测试
  • 抗积分饱和PID控制算法的常用实现,不错,可以作为参考的
  • 积分饱和通俗讲就是系统在一个偏差方向上的饱和,比如一个系统设定了输出不会超过100,但因为出现一个方向上的偏差积分使得输出超过了100,此时达到了饱和状态,如果继续在这个方向上积分会导致PID控制超过100系统却...
    积分饱和通俗讲就是系统在一个偏差方向上的饱和,比如一个系统设定了输出不会超过100,但因为出现一个方向上的偏差积分使得输出超过了100,此时达到了饱和状态,如果继续在这个方向上积分会导致PID控制超过100系统却运行在100,相当于积分调节对系统输出没有作用,就出现失控的状态,这是系统不能接受的,而且饱和积分越深,退出饱和就越久。上面是在正向的饱和,负向的饱和类似!
    

    为了解决这个问题,我们采用抗积分饱和算法,其思路就是:如果上一次的输出控制量超过了饱和值,饱和值为正,则这一次只积分负的偏差,饱和值为负,则这一次只积分正的偏差,从而避免系统长期留在饱和区!


    下面我以 位置型+抗积分饱和+积分分离的PID控制算法C语言来观察调节结果:(相对应的代码可以参考以往的文章)


    //位置型+抗积分饱和+积分分离 PID控制算法


    struct _pid{
    float SetSpeed;   
    float ActualSpeed; 
    float Err;         
    float Err_Last; 
    float Kp,Ki,Kd;    
    float Voltage;    
    float Integral;
    float Umax;          //最大正饱和上限值
    float Umin;          //最大负饱和下限值

    }pid;
    void PID_Init(void)
    {
    printf("PID_Init begin! \n");


    pid.SetSpeed      = 0;
    pid.ActualSpeed   = 0;
    pid.Err           = 0;
    pid.Err_Last      = 0;
    pid.Kp            = 0.2;
    pid.Ki            = 0.1;    //增大了积分环节的值
    pid.Kd            = 0.2;
    pid.Voltage       = 0;
    pid.Integral      = 0;


    pid.Umax = 400;        //正饱和值为400
    pid.Umin = -200;       //负饱和值为-200




    printf("PID_Init end! \n");
    }


    float PID_Cal(float Speed)
    {
    unsigned char index;
    pid.SetSpeed      = Speed;                                                      
    pid.Err           = pid.SetSpeed - pid.ActualSpeed; 



    if(pid.ActualSpeed>pid.Umax)    //如果上一次输出变量出现正向的饱和
    {
    if(abs(pid.Err)>200)
    {
    index = 0;
    }
    else
    {
    index = 1;
    if(pid.Err<0)
    {
    pid.Integral += pid.Err;  //正饱和只积分负偏差
    }

    }
    }
        else if(pid.ActualSpeed<pid.Umin)  //如果上一次输出变量出现负向的饱和
    {
    if(abs(pid.Err)>200)
    {
    index = 0;
    }
    else
    {
    index = 1;
    if(pid.Err>0)
    {
    pid.Integral += pid.Err;  //负饱和只积分正偏差
    }

    }
    }
    else
    {
    if(abs(pid.Err)>200)     //积分分离的PID优化,可参考以往的文章
    {
    index = 0;
    }
    else
    {
    index = 1;
    pid.Integral += pid.Err;
    }
    }

                       
    pid.Voltage       = pid.Kp*pid.Err +index*pid.Ki*pid.Integral + pid.Kd*(pid.Err - pid.Err_Last); 
    pid.Err_Last      = pid.Err;                 
    pid.ActualSpeed   = pid.Voltage*1.0;              


    return pid.ActualSpeed;        
    }


    int main(void)
    {
    int count = 0 ;
    printf("SYSTEM BEGIN! \n");
    PID_Init();


    while(count<1000) 
    {
    float speed = PID_Cal(200.0);
    printf("-%d-%f-",count,speed);
    count++;
    }
       return 0;

    }


    最后运行结果:


    我们发现,相对以往的算法,还算法大大提高了调节的速度和稳定!

    展开全文
  • pid抗饱和积分

    千次阅读 2019-03-25 09:27:02
    上文介绍了PID在理想情况下的工作原理,接下来是对实际中使用积分器的展开 积分器的饱和情况 (actuator:机器的一部分) 我们知道常量的误差值在经过积分器的作用会成为一个递增的函数,也就是说,给设备的指令...

    上文介绍了PID在理想情况下的工作原理,接下来是对实际中使用积分器的展开

    积分器的饱和情况

    (actuator:机器的一部分)

    我们知道常量的误差值在经过积分器的作用会成为一个递增的函数,也就是说,给设备的指令(command)的转速会不断增加。

    但是我们知道,现实中的电机转速是有限的,在设备指令增加到一定的转速时,电机的转速就不会上升了,这种情况叫做饱和

    还是以无人机为例

    还是像之前一样,有一个无人机,目标是悬停在50m处的空中

    但是我们在一开始的时候先固定住无人机

    由于被固定住,高度误差不会减小,从而电机指令会不断增加,从而电机转速不断上升,但增加到1000rpm时,达到电机转速的极限,电机转速不再增加

    但是电机指令由于没有收到高度误差减小的反馈,依然会不断增加

    直到放开无人机时,电机指令开始减小,减小到1000rpm时,电机转速开始减小,但是高度误差早已经为负,意思就是无人机已经超过50m的高度,飞向自由了

    如何抗饱和积分

    有三种方法抗饱和积分

    • clamping(钳位):根据条件关闭积分器
    • back-calculation(反算)
    • observer opproach(跟踪模式)

    一般比较常用的是钳位的方法,也称条件积分,因为简单、方便,下面介绍的也是钳位的配置

    我们现在不让设备指令直接给设备了,而是在设备前加一个限定,也就是钳位饱和限定,通过判定限定前和限定后的值,判断控制器是否饱和

    对于钳位的情况可以描述如下:

    1. 积分器的值会被限定在一个指定的值
    2. 积分器的值会在系统误差过大的时候停止,即|e|>e,e为指定的值
    3. 当控制器饱和的时候,积分器的值会停止增大,即,当u≠us时
    4. 当控制器饱和并且系统误差和操作变量符号相同,即,当u≠us且e*u>0时

    参考资料

    公众号内回复 下载|PID资料 获得

    • Visioli, A., "Modified Anti-Windup Scheme for PID Controllers," IEE Proceedings - Control Theory and Applications, Vol. 150, Number 1, January 2003

    个人博客

    公众号:greedyhao

    展开全文
  • 抗积分饱和 PID

    2021-02-16 09:54:23
    抗积分饱和 PID 所谓的积分饱和现象是指如果系统存在一个方向的偏差,PID 控制器的输出由于积分作用的不断累加而加大,从而导致执行机构达到极限位置,若控制器输出 U(k)继续增大,执行器开度不可能再增大,此时...

    抗积分饱和 PID

    所谓的积分饱和现象是指如果系统存在一个方向的偏差,PID 控制器的输出由于积分作用的不断累加而加大,从而导致执行机构达到极限位置,若控制器输出 U(k)继续增大,执行器开度不可能再增大,此时计算机输出控制量超出了正常运行范围而进入饱和区。一旦系统出现反向偏差,u(k)逐渐从饱和区退出。进入饱和区越深则退出饱和区时间越长。在这段时间里,执行机构仍然停留在极限位置而不随偏差反向而立即做出相应的改变,这时系统就像失控一样,造成控制性能恶化,这种现象称为积分饱和现象或积分失控现象。

    防止积分饱和的方法之一就是抗积分饱和法,该方法的思路是在计算 u(k)时,首先判断上一时刻的控制量u(k-1)是否已经超出了极限范围: 如果 u(k-1)>umax,则只累加负偏差; 如果 u(k-1)<umin,则只累加正偏差。从而避免控制量长时间停留在饱和区。

    struct _pid{
    float SetSpeed; //定义设定值
    float ActualSpeed; //定义实际值
    float err; //定义偏差值
    float err_last; //定义上一个偏差值
    float Kp,Ki,Kd; //定义比例、积分、微分系数
    float voltage; //定义电压值(控制执行器的变量)
    float integral; //定义积分值
    float umax;
    float umin;
    }pid;
    
    void PID_init(){
    printf("PID_init begin \n");
    pid.SetSpeed=0.0;
    pid.ActualSpeed=0.0;
    pid.err=0.0;
    pid.err_last=0.0;
    pid.voltage=0.0;
    pid.integral=0.0;
    pid.Kp=0.2;
    pid.Ki=0.1; //注意,和上几次相比,这里加大了积分环节的值
    pid.Kd=0.2;
    pid.umax=400;
    pid.umin=-200;
    printf("PID_init end \n");
    }
    
    float PID_realize(float speed){
    int index;
    pid.SetSpeed=speed;
    pid.err=pid.SetSpeed-pid.ActualSpeed;
    
    if(pid.ActualSpeed>pid.umax) //灰色底色表示抗积分饱和的实现
    {
    if(abs(pid.err)>200) //蓝色标注为积分分离过程
    {
    index=0;
    }else{
    index=1;
    if(pid.err<0)
    {
    pid.integral+=pid.err;
    }
    }
    }else if(pid.ActualSpeed<pid.umax){
    if(abs(pid.err)>200) //积分分离过程
    {
    index=0;
    }else{
    index=1;
    if(pid.err>0)
    {
    pid.integral+=pid.err;
    }
    }
    }else{
    if(abs(pid.err)>200) //积分分离过程
    {
    index=0;
    }else{
    index=1;
    pid.integral+=pid.err;
    }
    }
    pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);
    pid.err_last=pid.err;
    pid.ActualSpeed=pid.voltage*1.0;
    return pid.ActualSpeed;
    }
    
    展开全文
  • PID算法优化之积分抗饱和处理

    千次阅读 多人点赞 2020-09-06 14:19:44
    积分饱和(Integral windup或integrator windup)是指PID控制器或是其他有积分器的控制器中可能会发生的一种现象。
  • 所谓的积分饱和现象是指如果系统存在一个方向的偏差,PID控制器的输出由于积分作用的不断累加而加大,从而导致执行机构达到极限位置,若控制器输出U(k)继续增大,执行器开度不可能再增大,此时计算机输出控制量超出...
  • 能算法,如果能够熟练掌握PID算法的设计与实现过程,对于- -般的研发人员来 讲,应该是足够应对一-般研发问题了,而难能可贵的是,在我所接触的控制算法 当中,PID 控制算法又是最简单,最能体现反馈思想的控制算法...
  • PID积分抗饱和

    千次阅读 多人点赞 2020-10-23 17:19:06
    5 PID算法抗饱和) 1 什么是积分饱和 积分饱和(Integral windup或integrator windup)是指PID控制器或是其他有积分器的控制器中可能会发生的一种现象。 这种现象往往发生在误差有大幅变化(例如大幅增加),...
  • 所谓的积分饱和现象是指如果系统存在一个方向的偏差,PID控制器的输出由于积分作用的不断累加而加大,从而导致执行机构达到极限位置,若控制器输出U(k)继续增大,执行器开度不可能再增大,此时计算机输出控制量超出...
  • 这一节我们就来实现抗积分饱和PID算法。 1、抗积分饱和的基本思想 所谓积分饱和就是指系统存在一个方向的偏差,PID控制器的输出由于积分作用的不断累加而扩大,从而导致控制器输出不断增大超出正常范围进入饱和...
  • 与智能车相关的代码,包括增量式和位置式的算法,还有积分分离,抗积分饱和等等
  • 针对输入受限影响下的空间机械臂的输出反馈全局渐进稳定控制问题,采用一类正切双曲线作为饱和函数,提出了一种新的输出反馈抗饱和非线性比例-积分-微分(PID)控制算法,该算法能够实现饱和非线性影响下的空间机械臂闭环...
  • 积分抗饱和

    2018-04-16 15:05:19
    一种积分抗饱和的方法,在计算k时加一个判断,这样就能避免累计误差
  • 抗积分饱和PID控制器

    千次阅读 2021-04-30 14:31:06
    这一节我们就来实现抗积分饱和PID算法。 1、抗积分饱和的基本思想 所谓积分饱和就是指系统存在一个方向的偏差,PID控制器的输出由于积分作用的不断累加而扩大,从而导致控制器输出不断增大超出正常范围进入饱和区...
  • Matlab--抗饱和积分

    千次阅读 2019-03-30 20:22:17
    抗饱和积分现象   所谓积分饱和现象是指若系统存在一个方向的偏差,PID控制器的输出由于积分作用的不断累加而加大,从而导致执行机构达到极限位置Xmms(例如阀门开度达到最大),如图1所示,若控制器输出u(k)...
  • PID--抗积分饱和法.c

    2019-06-06 13:48:26
    所谓的积分饱和现象是指如果系统存在一个方向的偏差, PID 控制器的输 出由于积分作用的不断累加而加大, 从而导致执行机构达到极限位置, 若控制器 输出 U(k)继续增大, 执行器开度不可能再增大, 此时计算机输出...
  • 详细讲述了数字PID积分饱和和微分饱和的处理办法!
  • PID控制器是工程上应用最广泛的控制方法,汽车上的应用也非常多,比如:定速巡航、蠕行控制、车速限制、电机转速控制...今天,我们通过Simulink仿真来聊聊在汽车控制系统开发过程中PI控制器抗饱和积分的使用心得。 ...
  • 【控制理论】PID抗积分饱和控制

    千次阅读 2020-05-08 15:28:15
    1、积分饱和问题 ...积分饱和问题来自包含积分的控制器,如PID控制器、PI控制器,而且系统中包含**输出限幅(Saturation)。**简单来讲就是控制器的输出超过了系统的限制,但是积分器还没有停止工作,只有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,987
精华内容 794
关键字:

抗饱和积分pid算法