PID算法的入门理解以及C代码实现

在结束了自控原理的学习后,了解到PID算法是一种万能算法,在课设中也是经常使用到的一种算法,所以想具体的来进行以下总结与学习,如果有错漏的地方,欢迎大家共同来探讨与批评指正,嘿嘿。

文章目录

  • PID算法的入门理解以及C代码实现
  • 什么是PID算法
  • 一、三大控制算法的作用以及matlab仿真演示
    • (1)比例调节的作用:
    • (2)积分调节的作用:
    • (3)微分调节的作用:
  • 二、从计算机控制与算法的角度解析PID控制
    • 1.模拟PID控制
    • 2.数字PID控制
      • (1)位置式算法:
      • (2)增量式算法:
  • 总结

什么是PID算法

PID三个字是英文单词比例(Proportion),积分(Integral),微分(Differential coefficient)的缩写,顾名思义,PID控制就是由比例、积分、微分三种控制方法综合起来来对系统进行控制的方法,比如,飞行器要稳定飞行,而不是忽上忽下,机器人要稳定准确快速的到达目标,而不走偏,都可以用PID算法来进行反馈调节,从而让执行器做出最有利于达成目标的动作,在工程领域有着广泛的应用。


一、三大控制算法的作用以及matlab仿真演示

PID 控制器(Proportion Integration Differentiation,比例积分微分控制器)作为最早实用
化的控制器已有 70 多年的历史,是目前工业控制中应用最广泛的控制器。PID 控制器由于
其结构简单实用,且使用中无需精确的系统模型等优点,因此,95%以上的现代工业过程控
制中仍然采用 PID 结构。下图就是PID控制器的基本结构,仿真会基于如下结构进行


PID 控制器由比例单元 P、积分单元 I 和微分单元 D 三部分组成,其结构原理框图如图 6-1
所示。简单来说,PID 控制器就是对输入信号 r(t)和输出信号c(t)的差值 e(t)(即误差信号)进行比
例、积分和微分处理,再将其加权和作为控制信号u(t)来控制受控对象,从而完成控制过程的。
PID控制器的公式如下图所示:

式中, K P 、 K I 和 K D 分别为比例、积分和微分系数; T I 和 T D 分别为积分和微分时间。
一个 PID 控制器的设计重点在于设定 K P 、 K I 和 K D 三个参数的值。实际使用时,不一定
三个单元都具备,也可以只选取其中的一个或两个单元组成控制器

(1)比例调节的作用:

比例调节是按比例反应系统的偏差,系统一旦出现了偏差,比例调节立即产生调节作用用以减少偏差。比例控制只改变系统增益,不影响相位。仅采用比例控制时系统输出存在稳态误差。增大 K P 可以提高系统开环增益,减小系统稳态误差,但是会降低系统稳定性,甚至可能造成闭环系统的不稳定。,比例控制器的输出与输入误差信号成比例关系,传递函数如下
G(s)=Kp
接下来matlab仿真说明,比例调节的优缺点:
系统框图如下:

其中

在控制单元施加比例控制,并且采用不同的比例系数 K P =0.1 , 0.5 , 1 , 2 , 5 , 10 ,观察各比例系数下系统的单位阶跃响应及控制效果,matlab程序如下:

Kp=[0.1,0.5,1,2,5,10];
Go=tf(1, conv(conv([1,1],[2,1]),[3,1]) ); %系统开环传递函数
for i=1:6
G=feedback(Go.*Kp(i),1); %不同比例系数下的系统闭环传递函数
step(G); hold on; %求系统的单位阶跃响应
end
gtext('Kp=0.1');gtext('Kp=0.5'); gtext('Kp=1'); %放置 Kp 值的文字注释
gtext('Kp=2'); gtext('Kp=5');gtext('Kp=10');

运行程序得到不同比例系数下的系统单位阶跃响应曲线,如下图所示:

从图 中可以看出,随着比例系数 K P 值的增大,系统的响应速度加快,稳态误差减小,超调量却在增加,调节时间变长,而且随着 K P 值增大到一定程度,系统最终会变得不稳定。这也验证了前面对比例控制的描述。

(2)积分调节的作用:

是使系统消除稳态误差,提高无差度。因为有误差,积分调节就进行,直至无差,积分调节停止,积分调节输出一常值。积分作用的强弱取决与积分时间常数Ti,Ti越小,积分作用就越强。反之Ti大则积分作用弱,加入积分调节可使系统稳定性下降,动态响应变慢。积分作用常与另两种调节规律结合,组成PI调节器或PID调节器,单独的积分单元的引入会带来相位滞后,为系统的稳定性带来不良影响,其传递函数为G(s)=Ki/s,仍然使用上面的框图

在控制单元施加积分控制 1/s ,观察施加积分控制前后系统稳态误差的变化,matlab代码如下:

Go=tf(1, conv([1,1],[2,1]) ); %系统开环传递函数
Gc=tf(1,[1,0]); %积分控制函数
subplot(2,1,1);step(feedback(Go,1)); %原系统闭环传递函数的单位阶跃响应曲线
title('加积分控制前');
subplot(2,1,2);step( feedback(Go*Gc,1)); %加积分控制后系统单位阶跃响应曲线
title('加积分控制后');

运行程序得到加积分控制前后系统的单位阶跃响应曲线,如下图所示。

从图 中可以看出,加入积分控制前,系统的稳态误差为 0.5 ,加入积分控制后,系统的稳态误差被减小为 0 ,这也验证了积分控制可以消除稳态误差的作用。

(3)微分调节的作用:

微分作用反映系统偏差信号的变化率,具有预见性,能预见偏差变化的趋势,因此能产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除。因此,可以改善系统的动态性能。在微分时间选择合适情况下,可以减少超调,减少调节时间。微分作用对噪声干扰有放大作用,因此过强的加微分调节,对系统抗干扰不利。此外,微分反应的是变化率,而当输入没有变化时,微分作用输出为零。微分作用不能单独使用,需要与另外两种调节规律相结合,组成PD或PID控制器。

二、从计算机控制与算法的角度解析PID控制

1.模拟PID控制

框图如下:

其中 ,r(t)为参考输入或称为设定值,y(t)为系统输出,e(t)=r(t)-y(t)为偏差,u(t)为PID控制器的输出,Kp为比例系数,Ti为积分时间常数,Td为微分时间常数,G(s)为被控对象传递函数。时域上可以写成:

经过拉普拉斯变换后并整理得D(s):

其中Ki=Kp/Ti称为积分系数,Kd=Kp*Td称为微分系数

2.数字PID控制

当采样周期T足够小时,可以得到如下公式:

(1)位置式算法:

展开上述式子,并且令积分系数Ki=Kp*T/Ti,微分系数Kd=Kp*Kd/T,则可以得到:

用语言来表述这个公式就是:
PID偏差=比例系数 * 当前偏差+积分系数 * 偏差之和+微分系数 * (当前偏差-上次偏差)
总结下位置式控制算法的特点:
(1)输出控制量u(k)与各次采样值相关,需要占用较多的存储空间。
(2)计算u(k)需要做误差值的累加,容易产生较大的累加误差,甚至产生累加饱和现象。
(3)控制量u(k)以全量输出,误动作影响较大。当计算机出现故障时,u(k)的大幅度变化会引起执行机构位置的大幅度变化。

以下是基于C语言的位置式PID控制算法的代码:

=====================================================================
================================*/
#include <reg52.h>
#include <string.h> //C 语言中 memset 函数头文件
/*===================================================================
=================================
PID Function
The PID (比例、积分、微分) function is used in mainly
control applications. PIDCalc performs one iteration of the PID
algorithm.
While the PID function works, main is just a dummy program showing
a typical usage.
=====================================================================
================================*/
typedef struct PID {double SetPoint; // 设定目标 Desired value
double Proportion; // 比例常数 Proportional Const
double Integral; // 积分常数 Integral Const
double Derivative; // 微分常数 Derivative Const
double LastError; // Error[-1]
double PrevError; // Error[-2]
double SumError; // Sums of Errors
} PID;
/*===================================================================
=================================
PID 计算部分
=====================================================================
================================*/
double PIDCalc( PID *pp, double NextPoint )
{double dError, Error;
Error = pp->SetPoint - NextPoint; // 偏差
pp->SumError += Error; // 积分
dError = Error - pp->LastError; // 当前微分
pp->PrevError = pp->LastError;
pp->LastError = Error;
return (pp->Proportion * Error // 比例项
+ pp->Integral * pp->SumError // 积分项
+ pp->Derivative * dError // 微分项
);
}
/*===================================================================
=================================
Initialize PID Structure PID 参数初始化
=====================================================================
================================*/
void PIDInit (PID *pp)
{memset ( pp,0,sizeof(PID));
}
/*===================================================================
=================================
Main Program 主程序
=====================================================================
================================*
double sensor (void) // Dummy Sensor Function
{
return 100.0;
}
void actuator(double rDelta) // Dummy Actuator Function
{}
void main(void)
{
PID sPID; // PID Control Structure
double rOut; // PID Response (Output)
double rIn; // PID Feedback (Input)
PIDInit ( &sPID ); // Initialize Structure
sPID.Proportion = 0.5; // Set PID Coefficients
sPID.Integral = 0.5;
sPID.Derivative = 0.0;
sPID.SetPoint = 100.0; // Set PID Setpoint
for (;;) { // Mock Up of PID Processing
rIn = sensor (); // Read Input
rOut = PIDCalc ( &sPID,rIn ); // Perform PID Interation
actuator ( rOut ); // Effect Needed Changes
}

(2)增量式算法:

当执行机构不需要控制量的全值而需要其增量时,可由位置式推导出增量式 PID 控制算法。根据上面的u(k),写出u(k-1),然后两个式子相减,得到:

用语言来表述公式就是:
PID偏差 = 比例×(当前偏差 - 上次偏差) + 积分 * 当前偏差 + 微分 * (当前偏差 - 2×上次偏差+上上次偏差)

增量式算法的特点:
(1)可以节省存储空间
(2)只输出控制增量,误动作影响小。
C语言代码如下:

/*==================== =====================================================
PID Function
The PID (比例、积分、微分) function is used in mainly
control applications. PIDCalc performs one iteration of the PID
algorithm.
While the PID function works, main is just a dummy program showing
a typical usage.
==========================================================================*/
typedef struct PID
{int SetPoint; //设定目标 Desired Value
long SumError; //误差累计
double Proportion; //比例常数 Proportional Const
double Integral; //积分常数 Integral Const
double Derivative; //微分常数 Derivative Const
int LastError; //Error[-1]
int PrevError; //Error[-2]
} PID;
static PID sPID;
static PID *sptr = &sPID;
/*================================================================================
Initialize PID Structure PID 参数初始化
===============================================================================*/
void IncPIDInit(void)
{sptr->SumError = 0;
sptr->LastError = 0; //Error[-1]
sptr->PrevError = 0; //Error[-2]
sptr->Proportion = 0; //比例常数 Proportional Const
sptr->Integral = 0; //积分常数 Integral Const
sptr->Derivative = 0; //微分常数 Derivative Const
sptr->SetPoint = 0;
}
/*===============================================================================
增量式 PID 计算部分
=================================================================================*/
int IncPIDCalc(int NextPoint)
{register int iError, iIncpid; //当前误差
iError = sptr->SetPoint - NextPoint; //增量计算
iIncpid = sptr->Proportion * iError //E[k]项
- sptr->Integral * sptr->LastError //E[k-1]项
+ sptr->Derivative * sptr->PrevError; //E[k-2]项
//存储误差,用于下次计算
sptr->PrevError = sptr->LastError;
sptr->LastError = iError;
//返回增量值
return(iIncpid);
}

总结

本文对连续系统的PID控制理解到算法综合讲述了一遍,用matlab仿真能够更直观的理解各种调节方式对控制算法的影响,在不知道该如何对控制系统进行调试的时候,可以对照各种算法的优缺点进行选择调试,并最终使系统可以拥有正常的响应,如果要将该算法应用到实际中去,就是计算机控制的知识了,需要对传递函数进行离散化,再通过算法调控PWM等一系列方法将其实际应用,谢谢各位小伙伴们读完到这里,希望能够对大家有所帮助或者是有所启发,如果有不对的地方或者改进建议,欢迎大家的私信或者留言.

PID算法入门与C语言代码实现相关推荐

  1. 数据结构_dfs深度优先算法入门(C语言)

    数据结构_dfs深度优先算法入门(C语言) 文章目录 数据结构_dfs深度优先算法入门(C语言) 0.闲话 1.个人理解 2.全排列问题(1到n的排列组合) 2.八皇后问题求解 3.二维迷宫 (1)只 ...

  2. 算法导论中C语言代码,算法导论-学习笔记与进度

    算法导论 阅读进度 第一部分 基础知识 第一章 计算中算法的角色 Done 1.1 算法 输入与输出 算法可以解决哪些问题 数据结构 技术 一些比较难的问题 1.2 作为一种技术的算法 效率 算法和其 ...

  3. 家族关系查询系统程序设计算法思路_七大查找算法(附C语言代码实现)

    来自:Poll的笔记 - 博客园 链接:http://www.cnblogs.com/maybe2030/p/4715035.html 阅读目录 1.顺序查找 2.二分查找 3.插值查找 4.斐波那契 ...

  4. c语言实现克鲁斯卡尔算法,跪求C语言代码纠错,急~~~,克鲁斯卡尔算法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 程序可以运行,但是输入一半时会停止运行,极少数时能成功运行. #include #define MaxVertexNum 100 //最大顶点个数 #d ...

  5. 路程c语言,求最短路程(Prim算法)求C语言代码的解题

    #include #define max 10000 using namespace std; int main() { int sum=0;//总路程 int min, min_f , min_t, ...

  6. c语言提取图片yiq分量,图片数字水印C语言代码

    一篇本科毕业论文的附件:图片数字水印的C语言程序代码 //本文算法实现的C语言代码,Windows XP平台DEV-CPP(4.9.9.2)环境下编译通过// #include // #include ...

  7. c语言程序位置式pid算法,位置式PID算法的C语言代码

    描述 位置式PID的C语言写法详解 PID调节口诀: 参数整定找最佳,从小到大顺序查 先是比例后积分,最后再把微分加 曲线振荡很频繁,比例度盘要放大 曲线漂浮绕大湾,比例度盘往小扳 曲线偏离回复慢,积 ...

  8. pid温度控制c语言程序及仿真,温度控制PID算法的C语言程序实例代码

    //PID算法温控C语言 #include #include #include #include struct PID { unsigned int SetPoint; // 设定目标 Desired ...

  9. C语言实现PID算法:位置式PID和增量式PID

    原创者微信公众号 PID算法可以说是在自动控制原理中比较经典的一套算法,在现实生活中应用的比较广泛. 大学参加过电子竞赛的朋友都应该玩过电机(或者说循迹小车),我们要控制电机按照设定的速度运转,PID ...

最新文章

  1. eclipse上项目如何在resin中部署
  2. JavaScript 事件——“事件类型”中“复合事件”和“变动事件”的注意要点
  3. 微信 Tinker 负责人张绍文关于 Android 热修复直播分享记录
  4. linux+gpfs配置文件,GPFS for linux实施
  5. ffplay.c学习-6-⾳视频同步基础
  6. My Appointment - Belonging to me, Search by team, Search by group
  7. visualstudio调试html,Visual Studio Code中调试JavaScript
  8. css高度自动填满_Unity--自动版面(Grid Layout Group)
  9. python 基础语法学习笔记(2019年4月第二周学习笔记)
  10. 【李宏毅2020 ML/DL】P82 Generative Adversarial Network | Improving Sequence Generation by GAN
  11. 一题多解 —— 判断一个数是否为奇数
  12. C++复制粘贴代码去行标
  13. Android 设置背景透明度
  14. php微信推送的模板信息内容都是空,微信模板消息 推送成功 但是内容显示空白...
  15. mac已安装flash控件_如何在Mac上安装和更新Flash
  16. 各种HTTP返回错误代码大全 HTTP 403 Forbidden / 404 Not Found / 500 Internal Server Error / 502 Bad Gateway / 50
  17. f2fs学习二:预分配
  18. 使用正则表达式批量替换掉 空格及换行符
  19. 使用Kubernetes最常见的10个错误
  20. 企业实名认证api数据接口介绍

热门文章

  1. 微信开发者管理工具上线内测版,增加了内置的git管理和支持npm安装,6666666……
  2. 单用户操作系统 多用户操作系统
  3. Android UI 设计规范,数据结构与算法面试题
  4. 智云通CRM:如何判断客户忠诚度的高低?
  5. 矩阵分析与计算学习记录-向量范数与矩阵范数
  6. 华为科普:芯片设计制造全流程
  7. SSR初体验-结合Vue3全家桶
  8. 苹果正式发布iOS 8.3,修复漏洞,性能提升
  9. Win10运行处,之前输入的记录怎么设置才能保存
  10. IP报文格式及各字段意义