PID控制算法 – 0、PID原理

news2024/11/15 9:17:54

1、开局一张图

很多地方都觉得PID的控制结构示意图是这样的:

2、目标值(Setpoint)、输入值(Input)、误差(Error)

其实把上图那个输入改为目标值(Setpoint)更合适,因为不管是什么控制系统,都应该有个目标值,比如水位控制系统,水位的高度就是目标值;温度控制系统,想要的温度就是目标值;速度控制系统,想要的速度就是目标值。目标值是所有控制系统的前提,所以PID控制结构示意图应该改 为这样:

要想知道你的控制系统是否达到你的目标值,你需要干什么?当然是不断地看结果,比如温度控制系统,你通过加热的方式把一个铁块的温度控制在60℃,要想知道有没有达到这个目标温度,就需要搞一个温度传感器来测量铁块的温度,这个温度传感器就是测量元件

温度传感器测量铁块温度的目的是什么?就是看铁块的温度是否到60℃了。怎么看,就是把这个测量值与目标值作比较,比大小,比出来的结果就叫误差。温度传感器测出来的温度就是反馈值,因为反馈值是不断地送到控制系统的,所以这个反馈值叫做输入更合适。

 误差值 = 目标值 - 输入值

 也可以写成这样 :    Error = Setpoint - Input

一般把Error写成e,也就是    e = Setpoint - Input

某个时刻的误差值可以写成e(t), 也就是   e(t) = Setpoint - Input

控制系统的计算核心就是根据这个误差e(t)来展开的,这个后面来展开。

比如温度传感器检测出来的温度是50摄氏度,误差Error = 60 - 50 = 10℃,这就表示温度还不够,还得继续加热,这个加热机构就是执行机构,这个执行机构可以是烧柴火,也可以是烧煤气,也可以是电加热条、电加热块...... 

不管是火、还是煤气、还是电,都只是个媒介,我们要的是控制思想。如果温度传感器测出来的温度是10度,远低于60℃,该怎么办,当然是把火烧旺点,电流加大点;如果温度传感器测出来的温度超过60℃,超过目标值了该怎么办,当然是把火或者电给关了。

执行机构执行之后,也就是烧火,或者烧电之后,应该有个结果,这个结果就是铁块的温度,我们通过温度传感器来采集这个结果,并作为反馈值(输入值)送给控制机构,所以那个控制结构示意图还是有些欠妥,应该改为:

3、控制核心

前面说的温度比目标值小就加火加电,温度比目标值大就停火停电,这个加和停就是控制,要烧多大的火或者要放多大的电,这个量就是输出,PID控制就是控制这个火的大小,电的大小,从而达到控制温度的目的,所以,那个控制结构示意图应该这样标注:

 PID的控制核心就是算一下该输出多大的火力或者电力,或者其他什么,反正都叫做输出(Output)。

现在大家应该都理解目标值、输入值(反馈值)、结果、输出、误差这些概念了,那个经典的公式应该可以出来了:

Output = K_{p}*e(t) + K_{i}*\int e(t)d_{t} + K_{d}*\frac{de(t)}{d_{t}}

这个Output就是经过计算之后,应该输出的火力大小;

这个e(t)就是前面所说的误差:e(t) = Setpoint - Input

比例、积分、微分

上面的经典公式又引入了3个新东西

这个K_{p}就是比例系数(它是什么,要它干啥)

这个K_{i}就是积分系数(它是什么,要它干啥)

这个K_{d}就是微分系数(它是什么,要它干啥)

PID相关参数讲解:1、比例系数Kp与静态误差_资深流水灯工程师的博客-CSDN博客

PID代码实现

把这位外国网友的代码拿来分析一下,Arduino的某个PID库就是这哥们写的,原文链接如下

PID « Project Blog (brettbeauregard.com)

PID的开局都是这个公式:

Output = K_{p}*e(t) + K_{i}*\int e(t)d_{t} + K_{d}*\frac{de(t)}{d_{t}}

e(t) = Setpoint - Input

上面的公式是理想的情况,在代码实现的时候,需要将其离散化。

PID算法调用时间的分析

积分与微分与时间是直接相关的,咱也不提什么采样周期的事了,就是随机的调用PID算法,记录每次调用PID算法的时间间隔(timeChange)

这个时间间隔(timeChange)就等于当前的时间减去上一次调用PID算法的时间:

d_{t} = \Delta t = now-lastTime = timeChange

所以累计

误差errSum

errSum = \int e(t)d_{t}= e(0)*d_{t0} + e(1)*d_{t1} +e(2)*d_{t2}+...+e(t)*d_{t}

用C语言表示累计误差可以是这样:

errSum += (error * timeChange);

误差的微分dErr,等于本次的误差减去上次一PID计算时的误差,除以时间间隔:

dErr=\frac{de(t)}{d_{t}} =(error - lastErr)/timeChange

综上,公式Output = K_{p}*e(t) + K_{i}*\int e(t)d_{t} + K_{d}*\frac{de(t)}{d_{t}}用C语言表示出来可以是这样的:

Output = kp * error + ki * errSum + kd * dErr;

因为是随机的调用PID算法,所以需要记录每次PID计算时的时间点和误差

   lastErr = error;
   lastTime = now;

 比例系数、积分系数、微分系数的设置函数实现

void SetTunings(double Kp, double Ki, double Kd)
{
   kp = Kp;
   ki = Ki;
   kd = Kd;
}

完整的PID实现代码如下所示

/*working variables*/
unsigned long lastTime;
double Input, Output, Setpoint;
double errSum, lastErr;
double kp, ki, kd;
void Compute()
{
   /*How long since we last calculated*/
   unsigned long now = millis();
   double timeChange = (double)(now - lastTime);

   /*Compute all the working error variables*/
   double error = Setpoint - Input;
   errSum += (error * timeChange);
   double dErr = (error - lastErr) / timeChange;

   /*Compute PID Output*/
   Output = kp * error + ki * errSum + kd * dErr;

   /*Remember some variables for next time*/
   lastErr = error;
   lastTime = now;
}

void SetTunings(double Kp, double Ki, double Kd)
{
   kp = Kp;
   ki = Ki;
   kd = Kd;
}

这个Compute()函数是被不定期的调用,一般情况下效果也可以,能正常的工作起来,但距离工业应用还差的很远,还需要解决下面一系列的问题:

  1. 采样时间 :如果定期对PID算法进行评估,则其效果最佳。如果算法知道此间隔,我们还可以简化一些内部数学运算。
  2. 微分冲击 :这不是最大的问题,但是很容易解决,因此我们将这样做。
  3. 动态调整参数 : 一种好的PID算法可以在不影响内部工作的情况下更改调整参数。
  4. 缓解积分饱和 : 我们将介绍什么是缓解积分饱和,并实施具有附带好处的解决方案。
  5. 开/关(自动/手动):在大多数应用中,有时需要关闭PID控制器并手动调节输出,而不会干扰控制器。
  6. 初始化 : 控制器首次开启时,我们希望进行”无扰动的传输“,也就是说,我们不希望输出突然变为某个新值。
  7. 控制方向 : 最后一个不是鲁棒性本身名称的更改,它旨在确保用户输入具有正确符号的调优参数。
  8. 新增 测量比例(Proportional on Measurement) :添加这个特性使得它更加容易控制特定类型的过程。

本系列后面的文章就是围绕着8个问题展开,这8个问题全部解决之后,就是一个比较完善的PID控制算法了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/677525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

canvas详解08-基本动画

由于我们是用 JavaScript 去操控 canvas 对象,这样要实现一些交互动画也是相当容易的。在本章中,我们将看看如何做一些基本的动画。 可能最大的限制就是图像一旦绘制出来,它就是一直保持那样了。如果需要移动它,我们不得不对所有东西(包括之前的)进行重绘。重绘是相当费…

CoreMark 跑个分:OrangePi5 RK3588S

一、 Orange Pi 5 简介 Orange Pi 5 采用了瑞芯微 RK3588S 新一代八核 64 位处理器,具体为四核A76四核A55,采用了 8nm 工艺设计,主频最高可达 2.4GHz,集成 ARM Mali-G610 MP4 GPU,内嵌高性能 3D 和 2D 图像加速模块&am…

【python桌面应用设计】tkinter库 01. Tkinter程序设计思想和结构(保姆级代码注释)

目录 实现思路代码实战简单的基础结构示例稍微丰富一点的示例 总结 『python图形化GUI界面设计』分享tkinter库、PyQt5库、wxPython库等相关的新手入门教程,目标是编写python程序时可以给程序一个可视化界面。 欢迎关注 『python桌面应用设计』 系列,持续…

ubuntu18.04安装ORBSLAM2

最近倒腾了一下旧项目,发现之前的环境不知道抽了什么风,直接不能用了,好吧,索性从头装过。 一、第三方库 主要包括Pangolin 、 OpenCV 、 Eigen g2o 与 DBoW2在ORB-SLAM2里面自带可以不需要自己搞 # 更新apt库,更新软件列表 su…

七、c++学习(加餐3:深入分析类和对象(下))

我们把这篇《深入分析类和对象》分为两篇,就是为了简化一下大家学习的压力,现在我们接下来看下一篇。 C学习,b站直播视频 文章目录 7.1 对象操作7.1.1 对象拷贝7.1.1.1 无拷贝赋值运算符7.1.1.2 测试编译器会不会自动生成7.1.1.3 自己写拷贝…

【吃透网络安全】2023软考网络管理员考点网络安全(四)防火墙详解

涉及知识点 什么是防火墙?防火墙的概念及定义,防火墙的优缺点,软考网络管理员常考知识点,软考网络管理员网络安全,网络管理员考点汇总。 后面还有更多续篇希望大家能给个赞哈,这边提供个快捷入口&#xf…

Reactive 环境配置 遇到的问题记录

问题:Watchman: watchman--no-pretty get-sockname returned with exit code 1 ERROR: Unknown option --no-pretty 解决方案:运行ReactNative工程watchman运行错误 解决过程就是,我的watchman 没安装好,于是卸载,重新…

电子电气架构 —— OEM关于DTC具体实现相关见解

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 我们当前遇到的几乎所有的成长问题都可以归结道目光短浅、及时满足的天性上,不过在现代社会,用避难趋易和急于求成来指代他们更贴切。 本文主要讲…

Vivado使用技巧之外部编辑器配置

目录 一、前言 二、编辑器配置 2.1 环境变量添加 2.2 环境变量验证 2.3 Vivado设置 2.4 配置验证 2.5 解决Vivado配置失败问题 一、前言 Vivado自带的默认编辑器功能受限,不如第三方编辑器Eclipse,Notepad,Sublime功能强大。因此&…

Python基础篇(八):文件和os、shutil模块

文件和os、shutil模块 1. 文件1.1 打开文件1.2 写入文件1.3 读取文件内容1.4 关闭文件1.5 异常处理 2. os模块2.1 获取当前工作目录2. 创建目录2.3 重命名文件或目录2.4 删除文件2.5 执行系统命令 3. shutil模块3.1 复制文件3.2 移动文件3.3 复制目录(包括子目录和文…

【Linux】死锁(更新中)

文章目录 一. 什么是死锁二. 死锁产生的四个条件三. 避免死锁1. 死锁检测算法2. 银行家算法 结束语 一. 什么是死锁 死锁是指一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占用的不会释放的资源,而处于一种永久等待的状态。 就像…

Elasticsearch是什么,如何学习Elasticsearch,整合SpringBoot

目录 一、是什么Elasticsearch 二、Elasticsearch,整合SpringBoot 三、Elasticsearch的优势和应用场景 一、是什么Elasticsearch Elasticsearch是一个开源的搜索引擎,它采用Java语言编写,使用Lucene作为核心搜索引擎,并在其基…

2.文本分析

目录 1. 词频统计--语料库的构建 1. 词频统计–语料库的构建 文本挖掘:将文本信息转换为可利用的知识。通常,对大量文件的归类,一般通过建立不同的文件夹,来保存不同的文章。 同样的,将需要分析的【文本文件】读取到…

Shell - 01_shell的概述

一、shell 概述 1.shell 的两层含义: 既是一种应用程序,又是一种程序设计语言 a.作为应用程序: 交互式地解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应功能。称之为 shell 命令解析器。shell 是用户和…

机器学习对风险管理的重要性

✏️写作:个人博客,InfoQ,掘金,知乎,CSDN 📧公众号:进击的Matrix 🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。 机器学…

logback-spring.xml详解

本文来写说下logback-spring.xml相关的知识与概念 文章目录 概述configuration元素定义上下文名称定义变量appender组件 概述 对于xml日志文件的配置,大多数人第一次接触时有一种望而生畏的感觉,其实如果仔细分析,会发现核心的部分只有三个元…

【黄啊码】为什么程序员大都鄙视php?

“PHP 是世界上最好的语言”。。。“吗”?相信很多人跟我一样,都会在后边打个问号。这些年以来,“PHP 已死”、“PHP 行将消亡”之类的言论甚嚣尘上,由此看得出,很多开发人员讨厌 PHP。这又是为什么呢?PHP …

Nginx配置https证书遇到的一个问题

前言 今天在给一个站点配置 HTTPS 证书的时候,遇到了一个问题,写此文章记录一下解决过程。 环境 Ubuntu 22.04 Nginx 1.18 过程 今天给一个站点申请了 HTTPS 证书,然后在 Nginx 中进行配置,Nginx 的 SSL 配置如下&#xff1a…

Matplotlib---饼图

1. 饼图 pie()函数用于绘制饼图,其基本语法如下: plt.pie(x, explodeNone, labelsNone, colorsNone, autopctNone, startangleNone, shadowFalse) 其中,参数含义如下: - x: 数组,表示饼图中每个部分的数值大小。 -…

手机技巧:iOS微信 8.0.38正式版更新功能一览

目录 1、安装包变大了很多 2、拍摄功能优化 3、订阅号消息展示优化 4、转账界面优化 5、视频号关注展开更多 7、朋友圈置顶(灰度测试) 8、搜一搜页面新增问一问功能 2023.06.09大家期待已久的IOS微信8.0.38正式版终于发布了,今天就来给…