当前位置: 首页 > news >正文

PID闭环控制算法的学习与简单使用

平台:matlab2021b,Vivado2018


应用场景和理解


一个早餐店,假如一天都有生意,生意有的时间很火爆,有时候又一般,老板又是个实在人,只知道在后厨蒸包子。由于包子蒸熟需要一定的时间,老板娘在前面卖包子。老板娘耍了一会儿手机,客人买包子的速度很快,一会儿包子就卖完了,老板娘给老板说包子卖完了。老板说马上包。这个问题就可以使用我们的公式来控制,老板娘如果不耍手机,隔几分钟就告诉老板现在还有多少包子。老板根据现在的情况来包包子,保证整体的数量恒定。根据这个例子来说明PID的含义,老板娘看剩余包子个数的频率为几分钟一次还是十几分钟一次。这个时间就是采样时间T。老板加包子有时候抱一笼出来,有时候抱几笼出来,一次拿一笼出来赶不上客人吃包子的速度,一次拿几笼出来,发现客人吃的慢,很久都不用拿出来。这个拿包子的笼数就是比例系数P。在加包子的过程中,有时候直接把蒸笼拿上去蒸,导致累的过高,老板娘取不下来。这时候把包子放在这里,让老板娘自己去把蒸笼放好。这里老板娘控制的放的方式就是积分时间I。后面有时候客人一次买很多包子,有些客人就买几个,老板有时候抱出来的包子太多了,有时候又抱出来的太少了,老板自己想了个办法,在半路上老板娘在看一眼,发现抱多了,就放一些回去,拿少了就再去抱一些出来。这个多少就是微分时间D。好了现在经过一系列的操作老板终于可以保证外面的包子稳定在一个恒定的个数上了。

算法公式


PID控制算法是一种闭环控制算法。在工业中被广泛应用。在PID系统框图中,整个系统包括比较器、PID控制器和控制对象,其中PID控制器包括三个模块,比例(P),积分(I)和微分(D)。
 

r(t)为系统的目标值,y(t)为系统的输出值。e(t)为系统目标值和输出值的偏差。

e(t)=r(t)-y(t)

u(t)作为控制系统中的中间变量,既是偏差e(t)通过PID控制算法处理后的输出量。又是被控制对象的输入量。因此模拟PID控制器的公式为:

u(t)=K_{P}[e(t)+\frac{1}{T_{I}}\int_{0}^{t}e(t)dt+T_{D}\frac{de(t)}{dt}]

其中,K_{P}为比例增益,{T_{I}}为积分时间常数,T_{D}为微分时间常数。
PID离散化算法公式
离散化的算法公式分为位置式PID算法和增量式算法。
位置式算法,假设采样时间间隔为T,则在k时刻:偏差为e(k);积分为e(k),e(k-1),e(k-2)…+e(0);微分时间为(e(k)-e(k-1))/T。离散化后的公式为

u(k)=K_{P}[e(k)+\frac{T}{T_{I}}\sum_{n=0}^{k}e(n)+\frac{T_{D}}{T}(e(k)-e(k-1))]
u(k)=K_{P}e(k)+\frac{K_{P}T}{T_{I}}\sum_{n=0}^{k}e(n)+\frac{K_{P}T_{D}}{T}(e(k)-e(k-1))]

上式化简为

u(k)=K_{P}e(k)+K_{I}\sum_{n=0}^{k}e(n)+K_{D}(e(k)-e(k-1))]

增量式PID算法
根据位置式可知

u(k-1)=K_{P}e(k-1)+K_{I}\sum_{n=0}^{k-1}e(n)+K_{D}(e(k-1)-e(k-2))]

\Delta u(k)= u(k)-u(k-1)

可以得出

\Delta u(k)= K_{P}(e(k)-e(k-1))+K_{I}e(k)+K_{D}(e(k)-2e(k-1)+e(k-2))]

以上就是增量式算法,由增量式算法公式可知,系统的增量只和进三次偏差有关系。
由上述公式特点可以分析出来。位置式公式,需要多每次的误差进行累加,每次的输出都和过去的状态有关系。而增量式公式,误差只与最近三次采集有关系。但是积分影响大,稳态误差。
下面我们将通过matlab仿真对该公式进行分析,详细分析两种公式的参数影响。

先看位置式PID

clc;
clear;PID_target = 24; % 目标温度为24摄氏度% 定义PID三个参数的初始值
Kp = 0.01;
Ki = 0;
Kd = 0;% 定义误差
ek = 0;
ek_1 = 0;
ek_sum = 0;
sum_threshold = 8; % 阈值设定为8% PID输出
PID_out = 0;% 数据采集点数
numPoints = 200;% 采集初始值
ADC_data = zeros(1,numPoints);% 存储PID输出数据
PID_out_data = zeros(1, numPoints);
PID_target_data = PID_target * ones(1, numPoints);% 计算PID输出
for t = 4:numPointsek = PID_target - ADC_data(t-3);if (t>=12)ek_sum = ek_sum - ek_sum/sum_threshold;endek_sum = ek_sum+ek;PID_out = PID_out + Kp * ek + Ki * ek_sum + Kd * (ek - ek_1);ek_1 = ek;
%     ADC_data(t) = PID_out + randn(1); % 添加随机噪声ADC_data(t) = PID_out; PID_out_data(t) = PID_out;
end% 绘制PID_out和PID_target的图像
figure;
hold on;
plot(1:numPoints, PID_out_data, 'b', 'LineWidth', 1.5);
plot(1:numPoints, PID_target_data, 'r--', 'LineWidth', 1.5);
hold off;
title('PID输出与目标值变化图像');
xlabel('时间步数');
ylabel('数值');
legend('PID输出', '目标值', 'Location', 'best');

在应用过程中对误差累积求和往往往往不需要进行全部累加。这里代码中只累加了8次。采集值我这里做了延迟响应,即PID调整三个值后在响应第一个点。这样就模拟了外部的响应时间。这里我们将调节目标设置在10个点左右到达稳定值。

设置初始值P=0.01;I=0;D=0;

调节时间明显过长。

设置值P=0.1;I=0;D=0;

缩短了调节时间但是不够。

设置值P=0.2;I=0;D=0;

调节时间满足了但是有点过冲了。这里看一下积分项I的作用,稍微增大一点点。

设置值P=0.2;I=0.005;D=0;

可以看到过冲更加明显了。

设置值P=0.2;I=0.005;D=0.01;

尝试使用微分将过冲调节下来。适当增大微分项。

设置值P=0.2;I=0.005;D=0.2;

减小了一点点。但是减不下去。

设置值P=0.2;I=0.0005;D=0.2;在减少积分项将过冲拉低。

可以看到波形过冲消失,但是不够平滑。

适当的缩小I微分参数,可以将波形调整到很平滑的位置。差不多达到我们预计的要求。

设置值P=0.2;I=0.0005;D=0.1;

再看增量式PID

clc;
clear;PID_target = 24; % 目标温度为24摄氏度% 定义PID三个参数的初始值
Kp = 0.01;
Ki = 0.01;
Kd = 0.01;% 定义误差
ek = 0;
ek_1 = 0;
ek_2 = 0;% PID输出
PID_out = 0;% 采集初始值
ADC_data = 0;% 数据采集点数
numPoints = 200;% 采集初始值
ADC_data = zeros(1,numPoints);% 存储PID输出数据
PID_out_data = zeros(1, numPoints);
PID_target_data = PID_target * ones(1, numPoints);% 计算PID输出
for t = 4:numPointsek = PID_target - ADC_data(t-3);PID_out = PID_out + Kp * (ek - ek_1) + Ki * ek + Kd * (ek - 2 * ek_1 + ek_2);ek_2 = ek_1;ek_1 = ek;
%     ADC_data(t) = PID_out + randn(1); % 添加随机噪声ADC_data(t) = PID_out ; % 添加随机噪声PID_out_data(t) = PID_out;
end% 绘制PID_out和PID_target的图像
figure;
hold on;
plot(1:numPoints, PID_out_data, 'b', 'LineWidth', 1.5);
plot(1:numPoints, PID_target_data, 'r--', 'LineWidth', 1.5);
hold off;
title('PID输出与目标值变化图像');
xlabel('时间步数');
ylabel('数值');
legend('PID输出', '目标值', 'Location', 'best');

设置初始值

设置初始值P=0.01;I=0.01;D=0.01;

适当增加比例系数P=0.2;I=0.01;D=0.01;

波形调节无明显变化。前面说到增量式积分项对响应时间影响较大,这里适当增加积分项。

P=0.2;I=0.1;D=0.01;

继续增加积分项到满足调节时间P=0.2;I=0.26;D=0.01;

满足了调节时间有了过冲,适当P=0.2;I=0.26;D=0.1;

可以看到波形在接近目标值的时候震荡。继续调整参数。发现要到达预定的响应时间,波形不会平滑。笔者又尝试了一些参数。

最后P=0.01;I=0.17;D=0.01;波形接近稳定,但是没有达到预计的响应时间。

从上面可以看出来位置式相对增量式可以更快更稳定的达到响应时间。且位置式的参数的作用和增量式参数的作用在调试的过程中有一点点差别。从实现方式来看,增量式的计算量明显更小。

参考

演示PID三个参数的控制作用 (qq.com)

相关文章:

PID闭环控制算法的学习与简单使用

平台:matlab2021b,Vivado2018 应用场景和理解 一个早餐店,假如一天都有生意,生意有的时间很火爆,有时候又一般,老板又是个实在人,只知道在后厨蒸包子。由于包子蒸熟需要一定的时间,老…...

【无刷电机学习】光耦HCNR200基本原理及应用(资料摘抄)

【仅作自学记录,不出于任何商业目的。如有侵权,请联系删除,谢谢!】 本文摘抄翻译自: https://docs.broadcom.com/wcs-public/products/application-notes/application-note/331/6/av02-1333en-an_5394-16jul10.pdfhtt…...

【LeetCode】1768_交替合并字符串_C

题目描述 给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 https://leetcode.cn/problems/merge-strings-al…...

C#解析JSON

https://blog.csdn.net/weixin_43046974/article/details/131449900 C#解析JSON 1. JSON定义2. JSON一般构成及解析方法3. 解析举例子 1. JSON对象解析,只包含一层对象{}2. 嵌套JSON对象解析,包含多层对象{}3. JSON数组解析1(数组循环遍历&…...

AI图像识别算法助力安全生产*提升风险监测效率---豌豆云

2024年开年来安全生产事故频发,工厂爆炸、工程坍陷等重大安全生产事故的发生再次为我们敲响了警钟。 安全生产是企业发展的生命线,而传统的安全监测手段存在盲区和延迟,难以及时发现和应对潜在风险。 AI图像识别算法通过利用先进的计算机视…...

CSS技巧:实现两个div在同一行显示的方法

css如何让两个div在同一行显示 - web开发 - 亿速云 在Web开发中,经常遇到需要将多个元素水平排列在同一行的情况。其中一个常见的需求是将两个div元素放置在同一行上,使它们并排显示。在本文中,我们将介绍几种实现这一效果的CSS方法。 1. 使…...

【Unity】Node.js安装与配置环境

引言 我们在使用unity开发的时候,有时候会使用一些辅助工具。 Node.js就是开发中,经常会遇到的一款软件。 1.下载Node.js 下载地址:https://nodejs.org/en 2.安装Node.js ①点击直接点击Next下一步 ②把协议勾上,继续点击…...

Vue3:使用 Composition API 不需要 Pinia

在 Vue.js 开发的动态环境中,在单个组件中处理复杂的业务逻辑可能会导致笨重的文件和维护噩梦。虽然 Pinia 提供集中式状态管理,但仅依赖它来处理复杂的业务逻辑可能会导致代码混乱。本文探讨了使用 Composition API 的替代方法,说明开发人员…...

ExoPlayer 播放视频黑屏的解决方法

最近项目中在使用 ExoPlayer 来进行视频的播放,开发过程中遇到了部分视频打开后黑屏的问题,报错日志如下。 E Audio codec error android.media.MediaCodec$CodecException: Error 0xe E Playback error androidx.media3.exoplayer.ExoPlaybackExcept…...

C语言初阶—数组

数组是一组相同类型元素的集合。 在C99标准之前,数组的大小必须是常量或常量表达式。 在C99标准之后,数组的大小可以是变量,可以支持变长数组,但变长数组不能初始化。 不完全初始化,剩余的元素默认初始化为0 。 数组访…...

飞桨(PaddlePaddle)数据预处理教程

文章目录 飞桨(PaddlePaddle)数据预处理教程1. 安装飞桨2. 了解飞桨的数据预处理方法3. 应用单个数据预处理方法4. 组合多个数据预处理方法5. 在数据集中应用数据预处理5.1 在框架内置数据集中应用5.2 在自定义数据集中应用 6. 总结 飞桨(Pad…...

MYSQL C++链接接口编程

使用MYSQL 提供的C接口来访问数据库,官网比较零碎,又不想全部精读一下,百度CSDN都是乱七八糟的,大部分不可用 官网教程地址 https://dev.mysql.com/doc/connector-cpp/1.1/en/connector-cpp-examples-connecting.html 网上之所以乱七八糟,主要是MYSQL提供了3个接口两个包,使用…...

并发编程中常见的设计模式,c++多线程如何设计

C多线程设计(任务的“多对一”、“一对多”、“多对多”情况 该如何设计线程?) C书籍中并未找到对多线程设计,有很完整详细的总结!!C并发编程书籍中也只是一些理论或则零散的多线程实例。无奈,…...

解决android studio build Output中文乱码

1.效果如下所示: 代码运行报错的时候,Build Output报的错误日志中中文部分出现乱码,导致看不到到底报的什么错。 2.解决办法如下: 点击Android studio开发工具栏的Help-Edit Custom VM Options....,Android studio会…...

[云原生] K8s之pod进阶

一、pod的状态说明 (1)Pod 一直处于Pending状态 Pending状态意味着Pod的YAML文件已经提交给Kubernetes,API对象已经被创建并保存在Etcd当中。但是,这个Pod里有些容器因为某种原因而不能被顺利创建。比如,调度不成功(…...

[Unity3d] 网络开发基础【个人复习笔记/有不足之处欢迎斧正/侵删】

TCP/IP TCP/IP协议是一 系列规则(协议)的统称,他们定义了消息在网络间进行传输的规则 是供已连接互联网的设备进行通信的通信规则 OSI模型只是一个基本概念,而TCP/IP协议是基于这个概念的具体实现 TCP和UDP协议 TCP:传输控制协议,面向连接&#xff0c…...

Tomcat的配置文件

Tomcat的配置文件详解 一.Tomcat的配置文件 Tomcat的配置文件默认存放在$CATALINA_HOME/conf目录中,主要有以下几个: 1.server.xml: Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息&#x…...

猴子吃桃问题(python版)

文章预览: 题目python解法一:运行结果 python解法二:运行结果 python解法三:运行结果 题目 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早…...

C语言入门到精通之练习49:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的 *。

题目&#xff1a;读取7个数&#xff08;1—50&#xff09;的整数值&#xff0c;每读取一个值&#xff0c;程序打印出该值个数的 &#xff0a;。 程序分析&#xff1a;无。 实例 #include<stdio.h> #include<stdlib.h> int main() {int n,i,j;printf("请输入…...

如何在Windows轻量应用服务器上安装和配置SSH?

如何在Windows轻量应用服务器上安装和配置SSH&#xff1f; 检查OpenSSH的可用性&#xff1a;首先&#xff0c;需要以管理员身份打开PowerShell并运行命令Get-WindowsCapability - Online | Where-Object Name - like OpenSSH*来检查OpenSSH服务是否可用。如果服务未启动或不可…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...

Linux-进程间的通信

1、IPC&#xff1a; Inter Process Communication&#xff08;进程间通信&#xff09;&#xff1a; 由于每个进程在操作系统中有独立的地址空间&#xff0c;它们不能像线程那样直接访问彼此的内存&#xff0c;所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

Centos 7 服务器部署多网站

一、准备工作 安装 Apache bash sudo yum install httpd -y sudo systemctl start httpd sudo systemctl enable httpd创建网站目录 假设部署 2 个网站&#xff0c;目录结构如下&#xff1a; bash sudo mkdir -p /var/www/site1/html sudo mkdir -p /var/www/site2/html添加测试…...