目录

一、位置式PID

1.1遇限消弱积分法

1.2反馈抑制抗饱和PID

1.3实现

1.3.1头文件

1.3.2 源文件

二、增量式PID

2.1实现

2.1.1头文件

2.1.2源文件

三、调用范例


一、位置式PID

在控制信号幅值受限、且给定目标出现大跳变的情况下,积分控制容易产生积分器饱和(integrator windup)的现象,使系统出现大超调和低频震荡,甚至导致不稳定。

课上所学两种抗积分饱和方法:遇限消弱积分法,反馈抑制抗饱和PID

1.1遇限消弱积分法

遇限消弱积分法是其中比较有效的一种抗饱和方法,其基本思想是:当执行器处于饱和、且误差信号与控制信号同方向(同号)时,积分器停止更新(其值保持不变),除此之外,积分器正常工作。即,在饱和情况下,只进行有助于削弱饱和程度的积分运算。在离散控制(采样周期为T)模式下,相应的控制律如下:

1.2反馈抑制抗饱和PID

如图1所示,反馈抑制抗饱和PID是把计算的控制量超出其限幅范围的偏差值通过反馈进入积分器,从而迫使控制量返回到限幅值之内。在离散时间(采样周期T)域中,其控制律可以表
示为

1.3实现

1.3.1头文件

/** AW_PID.h**  Created on: 2021年9月29日*      Author: longchentian*/#ifndef INCLUDE_AW_PID_H_
#define INCLUDE_AW_PID_H_typedef  struct {float32  Ref;           // 输入:参考输入  Input: Reference inputfloat32  Fdb;           // 输入:反馈输入  Input: Feedback inputfloat32  Err;           // 变量:误差信号e(k)float32  Err_1;          // 变量:误差信号e(k-1)   Variable: Errorfloat32  umax;          // 参数:控制量的饱和限幅值float32  Ts;            // 控制周期float32  kw;            // 参数:抗饱和方案:0 (无);1(条件积分);2(反馈抑制)float32  Kp;            // 参数:比例增益  Parameter: Proportional gainfloat32  Ki;            // 参数:积分增益 Parameter: Integral gainfloat32  Kc;            // 参数:积分修正增益 Parameter: Integral correction gainfloat32  Kd;            // 参数:微分增益Parameter: Derivative gainfloat32  Up;            // 变量:比例输出  Variable: Proportional outputfloat32  Ui;            // 变量:积分输出  Variable: Integral outputfloat32  Ud;            // 变量:微分输出  Variable: Derivative outputfloat32  Ud1;           // 变量:微分输出(k-1)  Variable: Derivative outputfloat32  N;             // 变量:低通滤波参数float32  OutPreSat;     // 变量:饱和输出  Variable: Pre-saturated outputfloat32  OutMax;        // 参数:最大输出  Parameter: Maximum outputfloat32  OutMin;        // 参数:最小输出  Parameter: Minimum outputfloat32  Out;           // 输出:AW_PID输出  Output: AW_PID outputfloat32  SatErr;        // 变量:饱和差值 Variable: Saturated differencevoid  (*calc)();        // 计算函数指针  Pointer to calculation function} AW_PID;
typedef   AW_PID*  AW_PID_handle;
/*-----------------------------------------------------------------------------默认初始化   Default initalizer for the AW_PID object.
-----------------------------------------------------------------------------*/
#define  AW_PID_DEFAULTS { 0, 0, 0, 0, 0, 0, \0, 0, 0, 0, 0, \0, 0, 0, 0, 10, \0, 0, 0, 0, 0, \(void (*)(Uint32)) aw_pid_calc }
/*------------------------------------------------------------------------------函数原型   Prototypes for the functions in  <AW_PID.c>
------------------------------------------------------------------------------*/
void aw_pid_calc(AW_PID_handle);#endif /* INCLUDE_AW_PID_H_ */

1.3.2 源文件

/*============================================================<<aw_pid.c  >>     Anti-windup PID controller
------------------------------------------------------------------------------------------------------*/
#include "dmctype.h"
#include "aw_pid.h"// include the header for PID data structure definitionvoid aw_pid_calc(AW_PID * v)
{float32 uk;v->Err = v->Ref - v->Fdb;v->Up = v->Kp*v->Err;    // Compute the proportional output// Compute the integral outputif (v->kw==0)v->Ui = v->Ui + v->Ki*v->Err;else if (v->kw==1){if ((v->SatErr==0) || ( v->Err*v->SatErr>0))v->Ui = v->Ui + v->Ki*v->Err;}elsev->Ui = v->Ui + v->Ki*v->Err + v->Kc*v->SatErr;// Compute the derivative output// v->Ud = v->Ud1/(v->N+1)+v->Kd*(v->Err - v->Err_1)*v->N/(v->N+1);v->Ud=v->Kd*(v->Err - v->Err_1);// Compute the pre-saturated outputuk = v->Up + v->Ui + v->Ud;v->OutPreSat = uk;// Saturate the outputif (v->OutPreSat > v->OutMax)v->Out =  v->OutMax;else if (v->OutPreSat < v->OutMin)v->Out =  v->OutMin;elsev->Out = v->OutPreSat;// Compute the saturate differencev->SatErr = v->Out - v->OutPreSat;// Update the relevant variablesv->Err_1 = v->Err;v->Ud1 =  v->Ud;
}

二、增量式PID

增量式PID

• 增量式算法不需要对积分项累加,控制量增量只与近几次的误差有关,计算误差对控制量计算的影响较小。而位置式算法要对近几次的偏差的进行积分累加,容易产生较大的累加误差;

• 增量式算法得出的是控制量的增量,例如在阀门控制中,只输出阀门开度的变化部分,误动作影响小,必要时还可通过逻辑判断限制或禁止本次输出,不会严重影响系统的工作;而位置式的输出直接对应对象的输出,因此对系统影响较大;

• 增量式算法控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式算法适用于执行机构不带积分部件的对象,如电液伺服阀;

积分饱和现象是位置式PID 算法应用常见的一种现象,因此对于位置式PID 算法除了需要对输出进行限幅外还需要对积分输出进行限幅,而增量式算法很好地避免了积分饱和现象,因此在增量式PID 控制算法中只需要对输出限幅,而无需积分限幅。

2.1实现

2.1.1头文件

/** eh_pid.h**  Created on: 2021年10月10日*      Author: longchentian*/#ifndef EH_PID_H_
#define EH_PID_H_typedef  struct {float32  Ref;           // 输入:参考输入  Input: Reference inputfloat32  Fdb;           // 输入:反馈输入  Input: Feedback input、float32  Err;            //变量:误差信号e(k)float32  Err_1;          // 变量:误差信号e(k-1)   Variable: Errorfloat32  Err_2;          // 变量:误差信号e(k-2)   Variable: Errorfloat32  umax;          // 参数:控制量的饱和限幅值float32  Ts;            // 控制周期float32  Kp;            // 参数:比例增益  Parameter: Proportional gainfloat32  Ki;            // 参数:积分增益 Parameter: Integral gainfloat32  Kd;            // 参数:微分增益Parameter: Derivative gainfloat32  OutPreSat;     // 变量:饱和输出  Variable: Pre-saturated outputfloat32  OutMax;        // 参数:最大输出  Parameter: Maximum outputfloat32  OutMin;        // 参数:最小输出  Parameter: Minimum outputfloat32  Out;           // 输出:SP_PID输出  Output: SP_PID outputvoid  (*calc)();        // 计算函数指针  Pointer to calculation function} EH_PID;
typedef   EH_PID*  EH_PID_handle;/*-----------------------------------------------------------------------------默认初始化   Default initalizer for the AW_PID object.
-----------------------------------------------------------------------------*/
#define  EH_PID_DEFAULTS { 0, 0, 0, 0, 0, 0, 0,\0, 0, 0, \0, 0, 0, 0, \(void (*)(Uint32)) eh_pid_calc }void eh_pid_calc(EH_PID_handle);#endif /* EH_PID_H_ */

2.1.2源文件

#include "dmctype.h"
#include "eh_pid.h"// include the header for PID data structure definitionvoid eh_pid_calc(EH_PID * v)
{float32 Delta_Err;                  //e(k)-e(k-1)float32 Last_Delta_Err;             //e(k-1)-e(k-2)float32 uk;                         //本次调节输出值v->Err = v->Ref - v->Fdb;Delta_Err=v->Err-v->Err_1;Last_Delta_Err=v->Err_1-v->Err_2;uk=v->Out+v->Kp*Delta_Err+v->Ki* v->Err +v->Kd*(Delta_Err-Last_Delta_Err);v->OutPreSat = uk;// Saturate the outputif (v->OutPreSat > v->OutMax)v->Out =  v->OutMax;else if (v->OutPreSat < v->OutMin)v->Out =  v->OutMin;elsev->Out = v->OutPreSat;v->Err_2=v->Err_1;v->Err_1= v->Err ;}

三、调用范例

//初始化
EH_PID pid3=EH_PID_DEFAULTS;
pid3.Kp = 0.459750444;
pid3.Ki = 0.0539999164;
pid3.Kd = 0.595000153;
pid3.Ts = Ts;
pid3.OutMax = 12;
pid3.OutMin =  0;
pid3.Ref = SpeedRef;//闭环反馈
pid3.Fdb = speed;
pid3.calc(&pid3);
control_uk =   pid3.Out;

位置式与增量式PID代码(C语言实现)相关推荐

  1. 搭建机器人电控系统——PID算法——位置式、增量式、模糊式PID

    PID算法 PID算法介绍,不同系数仿真,优缺点 位置式.增量式.模糊式PID 大林算法.史密斯算法和PID算法的区别 文章目录 PID算法 位置式PID和增量式PID 位置式PID: 增量式PID: ...

  2. PID:智能小车入门(位置式和增量式)

    PID:智能小车入门(位置式和增量式) 今年大二,以一个新人的角度来说一下PID及其用法,新人第一次写,有不对的请各位指正.手动狗头 大佬们走过路过可否评论一手 PS:开环:无反馈控制 闭环:有反馈控 ...

  3. 编码器—绝对式与增量式的区别(图解)

    1.如何输出脉冲信号: 1.绝对式编码器 绝对编码器是直接输出数字量的传感器,在它的圆形码盘上沿 径向 有若干同心码道(码道是指一圈一圈的同心环),每条道上由透光和不透光的扇形区相间组成,相邻码道的扇 ...

  4. 位置式与增量式PID

    1PID控制算法-----什么是PID PID 控制器以各种形式使用超过了 1 世纪,广泛应用在机械设备.气动设备 和电子设备.在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算 ...

  5. 我的PID学习历程---PID位置式和增量式

    文章目录 起因 一.什么是开环系统? 二.什么是PID? KP,KI,KD三个参数的作用 三.PID算法的离散化 1.什么是位置式PID? 2.位置式PID实现 3.什么是增量式PID? 4.增量式P ...

  6. 位置式和增量式PID控制

    PID控制是一个二阶线性控制器 定义:通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能. 优点 a. 技术成熟 b. 易被人们熟悉和掌握 c. 不需要建立数学模型 d. ...

  7. 位置式与增量式PID控制器的说明

    理想状态下的PID控制器表达式为: 对上式左右进行拉普拉斯变换,可以得到: 为了在控制器或者计算机系统中实现PID计算,必须将上式的连续系统表达式离散化为离散系统.一般进行连续系统离散化,常用的有后向 ...

  8. 『软件工程3』你应该知道的三种原型实现模型:抛弃式、演化式、增量式

    三种原型实现模型 一.抛弃式原型开发 二.演化式原型开发 三.增量式原型开发 一.抛弃式原型开发 1.定义:验证和澄清系统的需求描述,重新构造系统. 2.流程图 3.典型例子 开发者与客户进行沟通交流 ...

  9. PID控制及位置式与增量式区别

    参考文献:<深入浅出过程控制-小锅带你学过控>

  10. 总结PID算法,位置式增量式理解以及C代码实现

    前言 近日刚接触PID,于是查找了所有资料(PID是经典算法,有很多文章),理解一大堆资料后,整理总结才写下在这篇博客. 自己也用STM32F103写些代码实现验证,先是单纯比例控制,后来PI控制,到 ...

最新文章

  1. 吴恩达Drive.ai因经营困难“卖身”苹果
  2. 《UG NX8.0中文版完全自学手册》一第1章 UG NX 8.0简介
  3. 利用python安装opencv_Linux下安装OpenCV+Python支持
  4. 2016年DDoS攻击趋势分析报告
  5. 用python重复下载文件_python 爬虫 重复下载 二次请求
  6. 如何证明在素数p和2p之间存在另一个素数呢?简单却不完备的证明
  7. 分布式离线计算—MapReduce—为什么被淘汰了?
  8. 步步为营:Asp.Net序列化Json格式的两种方法
  9. 普通人学python有意义吗_学python难吗
  10. python采用的编码是什么意思_深入浅出地,彻彻底底地理解Python中的编码
  11. 计网学习第一章:概述
  12. 职场风云 | 导师的光亮
  13. 邻接矩阵(图的存储)
  14. http接口开发与调用案例
  15. nat123内网穿透
  16. python 求3位数的水仙花数_python 求3到8位数的水仙花数Pycharm实现
  17. word常用技巧教程
  18. pandas读取excel使用read_excel()中的usecols参数读取指定的列
  19. 【latex】表格添加注脚;对表格的内容进行注释
  20. Windows Update有用吗

热门文章

  1. el-cascader数据绑定值原理之展平操作的算法
  2. 在尘世间做最好的自己
  3. b站python up主_python爬取B站up主全部视频封面
  4. inter至强服务器处理器型号,Intel发布新处理器,用金/银作为型号区分
  5. 鸿蒙系统 安卓碎片化,鸿蒙系统讲解决安卓碎片化问题,4G流畅度媲美12G!
  6. 2台计算机网线连接无法ping通,两台电脑PING不通怎么办?
  7. 2.4g无线模块 java_ESP32 2.4G无线模块 WIFI和蓝牙双模模块
  8. Hadoop数字统计
  9. 关于服务器磁盘配额超出的问题解决(报错源码是Disk quota exceeded)
  10. RFB-Net论文解读