PID--抗积分饱和法--004

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/***********************************************************************
    所谓的积分饱和现象是指如果系统存在一个方向的偏差, 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.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;
}

int main()
{
    PID_init();
    int count=0;
    while(count<1000)
    {
        float speed=PID_realize(200.0);
        printf("%f\n",speed);
        count++;
    }
    return 0;
}
时间: 2024-10-29 10:45:53

PID--抗积分饱和法--004的相关文章

PID控制器开发笔记之三:抗积分饱和PID控制器的实现

积分作用的引入是为了消除系统的静差,提高控制精度.但是如果一个系统总是存在统一个方向的偏差,就可能无限累加而进而饱和,极大影响系统性能.抗积分饱和就是用以解决这一问题的方法之一.这一节我们就来实现抗积分饱和的PID算法. 1.抗积分饱和的基本思想 所谓积分饱和就是指系统存在一个方向的偏差,PID控制器的输出由于积分作用的不断累加而扩大,从而导致控制器输出不断增大超出正常范围进入饱和区.当系统出现反响的偏差时,需要首先从饱和区退出,而不能对反向的偏差进行快速的响应. 为了解决积分饱和的问题,人们引

积分判别法的副产品——跟求和有关的不等式

(图片来自 Wikipedia) 观察这张图: 第一个矩形的面积是 1, 第二个是 1/2, 第三个是 1/3, ……第 k 个是 1/k; 这 k 个矩形的面积之和,显然大于它们下面的积分 \(\int_{1}^{k+1} \frac{1}{x}\mathrm{d}x\) 如果拿掉第一个矩形,把剩下的矩形都翻到左边来,这 k - 1 个矩形的面积之和,显然小于它们上面的积分 \(\int_{1}^{k} \frac{1}{x}\mathrm{d}x\) 由此可得: \(ln(k+1) < 1+

PID控制器开发笔记之二:积分分离PID控制器的实现

前面的文章中,我们已经讲述了PID控制器的实现,包括位置型PID控制器和增量型PID控制器.但这个实现只是最基本的实现,并没有考虑任何的干扰情况.在本节及后续的一些章节,我们就来讨论一下经典PID控制器的优化与改进.这一节我们首先来讨论针对积分项的积分分离优化算法. 1.基本思想 我们已经讲述了PID控制引入积分主要是为了消除静差,提高控制精度.但在过程的启动.结束或大幅度增减设定值时,短时间内系统输出有很大偏差,会造成PID运算的积分累积,引起超调或者振荡.为了解决这一干扰,人们引入了积分分离

《饱和英语学习法》-笔记

饱和英语学习法 基础 入门准备 学习周期: 半年 学习强度: 每天至少3小时 适应人群: 有基本的语法概念 有基本的语法基础→良好的应用→在不断应用中不断完善语法→至臻完美的语法,这是一个循环,理论上永无止境. 其他要求: 要求做笔记 电脑上装有 Microsoft outlook, word,和 excel 软件 每天至少保持 3 小时的学习时间 每周写至少两篇英文习作 准备好工具书 (格灵思词霸) 美国传统字典 韦氏大学词典 柯林斯词典 朗文词典 牛津双解(4th) 目标与原理: "饱和法&

四轴PID讲解

鉴于某些原因,笔者无法修改原先已经发表的部分博客文章,在这里笔者将先前设计的微型四轴工程代码开源,下载地址:github.com/yzhajlydy 正文开始:这篇文章分为三个部分: PID原理普及 常用四轴的两种PID算法讲解(单环PID.串级PID) 如何做到垂直起飞.四轴飞行时为何会飘.如何做到脱控? PID原理普及 1.  对自动控制系统的基本要求: 稳.准.快:         稳定性(P和I降低系统稳定性,D提高系统稳定性):在平衡状态下,系统受到某个干扰后,经过一段时间其被控量可以

SIMATIC PID温度控制

SIMATIC PID温度控制 // VAR_INPUT ------------------------------------------------------------------- #ifndef TRUE #define TRUE 0x01 #endif #ifndef FALSE #define FALSE 0x00 #endif // 过程变量输入, 可以在“过程变量输入”输入端设置初始值, // 或者也可以连接到浮点数格式的外部过程变量上. float PV_IN = 0.0

模糊控制——(3)模糊自适应整定PID控制

1.原理 这种控制必须精确地确定对象模型,首先将操作人员(专家)长期实践积累的经验知识用控制规则模型化,然后运用推理便可对PID参数实现最佳调整. 自适应模糊PID控制器以误差e和误差变化ec作为输入,可以满足不同时刻的e和ec对PID参数自整定的要求.利用模糊控制规则在线对PID参数进行修改,便构成了自适应模糊PID控制器,其结构如图4-17所示. 离散PID控制算法为: 式中, k为采样序号,T 为采样时间. PID参数模糊自整定是找出PID三个参数 Kp, Ki, Kd 与e和ec之间的模

PID算法实现及参数整定图解(附代码)

一. PID含义 PID是英文单词比例(Proportion),积分(Integral),微分(Differential coefficient)的缩写.PID调节实际上是由比例.积分.微分三种调节方式组成,它们各自的作用如下: 比例调节作用:是按比例反应系统的偏差,系统一旦出现了偏差,比例调节立即产生调节作用用以减少偏差.比例作用大,可以加快调节,减少误差,但是过大的比例,使系统的稳定性下降,甚至造成系统的不稳定. 积分调节作用:是使系统消除稳态误差,提高无差度.因为有误差,积分调节就进行,直

sql经典语句大全

SQL Server提供了大量的函数, 但是在一些常见的如, 字符串拆分, 字符提取,过滤等没有对应的处理, 本帖主要收集一些常见的函数, 整理如下: ------------------------------ http://topic.csdn.net/u/20080306/23/d3c100f2-cda1-4efa-927d-f1f7968884ce.html /* 功能:拆分字符串. 作者:..... */ http://topic.csdn.net/u/20080724/11/dacb