一、对于PID控制算法的引入

位式控制算法(二位式)所比较的只有输出值与设定值,输出方式只有两种,用开关量控制控制对象,但是用“开关量”来控制一个物理量,就显得比较简单粗暴了。有时候,是无法保持稳定的。因为单片机、传感器不是无限快的,采集、控制需要时间。而且,控制对象具有惯性。比如你将一个加热器拔掉,它的“余热”(即热惯性)可能还会使水温继续升高一小会。导致输出不稳定且输出不平滑,相对设定值有很大的误差。由此我们需要一个更新的算法来满足:
它可以将需要控制的物理量带到目标附近
它可以“预见”这个量的变化趋势
它也可以消除因为散热、阻力等因素造成的静态误差

二、对于PID算法的理解

P:比例(Kp)
I:积分(Ki)
D:微分(Kd)
过程:输入通过比例调节,积分调节,微分调节,判断输出到执行机构;执行机构输出的同时有测量元件,对于输出与设定再比较,再输入。循环往复
公式:

u(t)——控制器(也称调节器)的输出。
e(t)——控制器的输入(常常是设定值与被控量之差,即e(t)=r(t)-c(t)。
Kp——控制器的比例放大系数。
Ti ——控制器的积分时间。
Td——控制器的微分时间。

PID三个最基本的参数:Kp、Ki、Kd:
Kp:比例,它的作用最明显,原理最简单,以加热水为例:
有设定值与当前值:
当两者差距不大时,就让加热器以小功率加热一下。 要是因为某些原因,温度降低了很多,就让加热器提高功率工作。要是当前温度比目标温度低得多,就让加热器全功率加热,尽快让水温到达目标附近。就让偏差(目标减去当前)与调节装置的“调节力度”,建立一个一次函数的关系,就可以实现最基本的比例控制了

Kp越大,调节作用越激进,Kp调小会让调节作用更保守。

Kd:微分的作用比较好理解。(仍以水温为例)
首先,由于P的作用,水温会在目标温度上下波动,整个系统不稳定。类似于弹簧振子,会在平衡位置震荡。
我们需要一个控制作用,让被控制的物理量的“变化速度”趋于0,即类似于阻力的作用。
因为,当比较接近目标时,P的控制作用就比较小了。越接近目标,P的作用越温柔。有很多内在的或者
外部的因素,使控制量发生小范围的摆动。D的作用就是让物理量的速度趋于0,
只要什么时候,这个量具有了速度,D就向相反的方向用力,尽力刹住这个变化。
Kd参数越大,减小波动的效果明显,在波动较小时,Kd较小。

Ki:积分过程使用于特殊情况,(以水温为例)
假如加热装置带到了非常冷的地方,开始烧水了。需要烧到50℃。在P的作用下,水温慢慢升高。
直到升高到45℃时,他发现了一个不好的事情:天气太冷,水散热的速度,和P控制的加热的速度相等。

“Kp:45度与50度差距小,只需要轻轻加热就可以了。
Kd:加热和散热相等,温度没有波动,不用调整什么。”

于是,水温永远地停留在45℃,永远到不了50℃。
因此:设置一个积分量。只要偏差存在,就不断地对偏差进行积分(累加),并反应在调节力度上。

这样一来,即使45℃和50℃相差不太大,但是随着时间的推移,只要没达到目标温度,这个积分量就不断增加。系统就会慢慢意识到:还没有到达目标温度,该增加功率啦!
到了目标温度后,假设温度没有波动,积分值就不会再变动。这时,加热功率仍然等于散热功率。
但是,温度是稳稳的50℃。Ki的值越大,积分时乘的系数就越大,积分效果越明显。

所以,i的作用就是,减小静态情况下的误差,让受控物理量尽可能接近目标值。
i在使用时还有个问题:需要设定积分限制。防止在刚开始加热时,就把积分量积得太大,难以控制。

PID一般可以用PI、PD控制,也可以PID全部。

三、绝对式(位置式)PID和增量式PID算法

位置式控制算法:
每次周期性计算出的 PID 为绝对的数值,是执行机构实际的位置。
公式:u(k)=Kp*e(k) + Ki∑e(i) + Kd * [e(k) - e(k - 1)]
由于计算机输出的u(k)可直接控制执行机构(如阀门),u(k)的值和执行机构的位置(如阀门开度)是一一对应的。
因此通常称该公式为位置式PID控制算法。

位置式控制算法的缺点:
当前采样时刻的输出与过去的各个状态有关,计算时要对e(k)进行累加,运算量大; 而且控制器的输出u(k)对应的是执行机构的实际位置,如果计算机出现故障, u(k)的大幅度变化会引起执行机构位置的大幅度变化。

增量式控制算法:
控制器的输出只是控制量的增量Δu(k)。计算机输出的控制量Δu(k)对应的是本次执行机构位置的增量。
公式:△u(k) = u(k) - u(k - 1)
△u(k) = Kp[e(k) - e(k - 1)] + Ki*e(k) + Kd[e(k ) - 2e(k - 1) + e(k - 2 )]

增量式控制算法的缺点:截断效应大,溢出影响大。

区别:
位置式PID控制的输出与整个过去的状态有关,有误差的累加值;
而增量式PID的输出只与当前拍和前两拍的误差有关,因此位置式PID控制的累积误差相对更大。

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

由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,而位置式的输出直接对应对象的输出,因此对系统影响较大。

从数学角度位置式和增量式没有差别,增量式通过做差免去了一直对e(k)做积分而已,并不是没有积分作用,只是没有积分这一运算过程。对于不同的控制模型,我们可以使用PI、PD、PID、甚至单P调节,就是说要根据实际对PID的三个部分进行取舍

代码部分

位置型PID的C语言实现:
第一步:定义PID变量结构体

typedef struct
{float limit;   //积分限制float Kp;     float Ki;float Kd;float eSum;       //误差float e0;       float e1;
}PID_AbsoluteType;//位置式PID

第二步:初始化变量

void PID_Struct_Init_abs(PID_AbsoluteType* PID,float kp,float ki,float kd,float out_max)
{PID->Kp = kp;//比例PID->Ki = ki;//积分PID->Kd = kd;//微分PID->e0 = 0;//现在的误差PID->e1 = 0;//上次的误差PID->eSum = 0;PID->limit = out_max;//自己设置积分限幅
}

第三步:编写控制算法

float PID_Update_Absolute3(PID_AbsoluteType* PID,float tar,float cur)
{float pe, ie, de;float out=0;PID->e0 = tar - cur;PID->eSum += PID->e0;//可以做一个积分限幅de = PID->e0 - PID->e1;pe = PID->e0;ie = PID->eSum;PID->e1 = PID->e0;out = pe*(PID->Kp) + ie*(PID->Ki) + de*(PID->Kd);//输出限幅也有时有必要做return out;
}

到此为止,PID的基本实现部分就初步完成了,当然pid的参数调节才是重中之重,这里我才疏学浅,还需进一步学习。

萌新初来报道,多多包涵,文章排版好丑,大家凑合看吧。拜谢支持

对于pid控制的个人理解 附c语言代码相关推荐

  1. c52传感器温度显示c语言编程,基于STC89C52的数字温度计 附C语言代码.doc

    基于STC89C52的数字温度计 附C语言代码 <数字显示温度计>论文 学校: 华侨大学 学院: 信息科学与工程学院 班级:10级 集成电路设计与集成系统 组别: 自控06组 组员:*** ...

  2. 【机器视觉案例】(5) AI视觉,远程手势控制虚拟计算器,附python完整代码

    各位同学好,今天和大家分享一下如何使用MediaPipe+Opencv完成虚拟计算器,先放张图看效果.FPS值为29,食指和中指距离小于规定阈值则认为点击按键,为避免重复数字出现,规定每20帧可点击一 ...

  3. pid控制加热算法,附代码仓库——开源免费

    1.该项目层次化结构清晰,代码框架耦合度低,可复用性.可移植性强. 2.功能代码与底层硬件无直接关联,无需更改上层应用逻辑,只需更改接口文件,即可移植到不同的硬件平台: 3.使用lwrb开源组件.pi ...

  4. 【机器视觉案例】(8) AI视觉,手势控制电脑鼠标,附python完整代码

    各位同学好,今天和大家分享一下如何使用 MediaPipe+Opencv 通过手势识别来控制电脑鼠标的移动和点击,如果有兴趣的话,可以代替鼠标去打游戏.先放图看效果.用画图板来测试 黄框代表电脑屏幕的 ...

  5. c语言循环字符,字符串 非暴力for循环法(内附C语言代码)

    对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能.它们的前几个是: 00000 00001 00010 00011 00100 请按从小到大的顺序输出这32种01串. 输入格式 本试 ...

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

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

  7. 【数据可视化应用】实现空间栅格(附R语言代码)

    R-ggplot2 可视化绘制 由于对ggplot2的绘图体系还不是很了解,所以这一步花费很长时间,但也对ggplot2的绘图语法有了更深的理解.话不多说,我们直接上代码,如下: # Raster_d ...

  8. 0基础学会SIGCHLD()信号的使用(可以解决僵尸进程的问题,内附C语言代码)

    SIGCHLD信号产生的3个条件: 1.子进程结束: 2.子进程暂停了: 3.子进程继续运行: 都会给父进程发送该信号,父进程默认忽略此信号. 接下来使用代码来解释这个问题: 1 #include & ...

  9. 【数据可视化应用】华夫饼型柱状图(附R语言代码)

    这个图中,其实比例直方图就可以实现,但是这里把简单的直方图变成华夫饼图,提升了美观程度.整体实现代码如下: library(wesanderson)library(tidyverse)library( ...

最新文章

  1. 数字治理转型与公共卫生治理能力现代化调查项目
  2. 利用SparkSQL(java版)将离线数据或实时流数据写入hive的用法及坑点
  3. P2P平台选择网关支付、第三方托管、第三方+银行联合托管有什么区别?
  4. PAT(乙级)1014
  5. php 主页子标题修改,关于有部分用户默认PC主页大标题标签修改无效的答疑.
  6. winfrom 去掉字符串空格
  7. Axure rp 9安装包下载地址、汉化文件、授权码(包括下载地址)
  8. echars中国地图,省份名字居中
  9. Mac用户必备翻译软件!Bob 0.5.3 中文版 附谷歌翻译插件!
  10. PAT 1055 集体照
  11. HDU-不定积分-求一条直线与抛物线所围成的面积
  12. 一衣带水 守望相助:中日夫妻七七再行慈善之旅
  13. joomla网页加速插件
  14. Visio 与 office 不兼容问题
  15. html水晶按钮图片,css 如何实现一个水晶按钮的效果呢?
  16. Ruby-Devise采用多种形式登录
  17. 在线取名应用!给你自己取个好听的网名吧!
  18. Office 365 IT Professional—— 如何将Office 365中的文档同步到客户端,加强协同管理
  19. 如何一键拼图?不妨试试这三个一键拼图软件
  20. python-xlrd使用手册

热门文章

  1. 如何计算当地的中央子午线?
  2. opencv离散傅里叶变换进行图像旋转校正
  3. 工作流系统理解(1)
  4. 事件的独立与常见的几种分布
  5. Django模型类操作数据表
  6. 独立事件-independent event
  7. 软件测试2020年终总结
  8. rg1 蓝光危害rg0_LED蓝光危害评估的最新标准IEC/TR 62778:2014
  9. 三菱MR-JE-C伺服应用详细介绍
  10. C51中封装WS2812