位置式与增量式PID代码(C语言实现)
目录
一、位置式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语言实现)相关推荐
- 搭建机器人电控系统——PID算法——位置式、增量式、模糊式PID
PID算法 PID算法介绍,不同系数仿真,优缺点 位置式.增量式.模糊式PID 大林算法.史密斯算法和PID算法的区别 文章目录 PID算法 位置式PID和增量式PID 位置式PID: 增量式PID: ...
- PID:智能小车入门(位置式和增量式)
PID:智能小车入门(位置式和增量式) 今年大二,以一个新人的角度来说一下PID及其用法,新人第一次写,有不对的请各位指正.手动狗头 大佬们走过路过可否评论一手 PS:开环:无反馈控制 闭环:有反馈控 ...
- 编码器—绝对式与增量式的区别(图解)
1.如何输出脉冲信号: 1.绝对式编码器 绝对编码器是直接输出数字量的传感器,在它的圆形码盘上沿 径向 有若干同心码道(码道是指一圈一圈的同心环),每条道上由透光和不透光的扇形区相间组成,相邻码道的扇 ...
- 位置式与增量式PID
1PID控制算法-----什么是PID PID 控制器以各种形式使用超过了 1 世纪,广泛应用在机械设备.气动设备 和电子设备.在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算 ...
- 我的PID学习历程---PID位置式和增量式
文章目录 起因 一.什么是开环系统? 二.什么是PID? KP,KI,KD三个参数的作用 三.PID算法的离散化 1.什么是位置式PID? 2.位置式PID实现 3.什么是增量式PID? 4.增量式P ...
- 位置式和增量式PID控制
PID控制是一个二阶线性控制器 定义:通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能. 优点 a. 技术成熟 b. 易被人们熟悉和掌握 c. 不需要建立数学模型 d. ...
- 位置式与增量式PID控制器的说明
理想状态下的PID控制器表达式为: 对上式左右进行拉普拉斯变换,可以得到: 为了在控制器或者计算机系统中实现PID计算,必须将上式的连续系统表达式离散化为离散系统.一般进行连续系统离散化,常用的有后向 ...
- 『软件工程3』你应该知道的三种原型实现模型:抛弃式、演化式、增量式
三种原型实现模型 一.抛弃式原型开发 二.演化式原型开发 三.增量式原型开发 一.抛弃式原型开发 1.定义:验证和澄清系统的需求描述,重新构造系统. 2.流程图 3.典型例子 开发者与客户进行沟通交流 ...
- PID控制及位置式与增量式区别
参考文献:<深入浅出过程控制-小锅带你学过控>
- 总结PID算法,位置式增量式理解以及C代码实现
前言 近日刚接触PID,于是查找了所有资料(PID是经典算法,有很多文章),理解一大堆资料后,整理总结才写下在这篇博客. 自己也用STM32F103写些代码实现验证,先是单纯比例控制,后来PI控制,到 ...
最新文章
- 吴恩达Drive.ai因经营困难“卖身”苹果
- 《UG NX8.0中文版完全自学手册》一第1章 UG NX 8.0简介
- 利用python安装opencv_Linux下安装OpenCV+Python支持
- 2016年DDoS攻击趋势分析报告
- 用python重复下载文件_python 爬虫 重复下载 二次请求
- 如何证明在素数p和2p之间存在另一个素数呢?简单却不完备的证明
- 分布式离线计算—MapReduce—为什么被淘汰了?
- 步步为营:Asp.Net序列化Json格式的两种方法
- 普通人学python有意义吗_学python难吗
- python采用的编码是什么意思_深入浅出地,彻彻底底地理解Python中的编码
- 计网学习第一章:概述
- 职场风云 | 导师的光亮
- 邻接矩阵(图的存储)
- http接口开发与调用案例
- nat123内网穿透
- python 求3位数的水仙花数_python 求3到8位数的水仙花数Pycharm实现
- word常用技巧教程
- pandas读取excel使用read_excel()中的usecols参数读取指定的列
- 【latex】表格添加注脚;对表格的内容进行注释
- Windows Update有用吗
热门文章
- el-cascader数据绑定值原理之展平操作的算法
- 在尘世间做最好的自己
- b站python up主_python爬取B站up主全部视频封面
- inter至强服务器处理器型号,Intel发布新处理器,用金/银作为型号区分
- 鸿蒙系统 安卓碎片化,鸿蒙系统讲解决安卓碎片化问题,4G流畅度媲美12G!
- 2台计算机网线连接无法ping通,两台电脑PING不通怎么办?
- 2.4g无线模块 java_ESP32 2.4G无线模块 WIFI和蓝牙双模模块
- Hadoop数字统计
- 关于服务器磁盘配额超出的问题解决(报错源码是Disk quota exceeded)
- RFB-Net论文解读