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)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试数据库篇(mysql)- 12分库分表

拆分策略 垂直分库 垂直分库:以表为依据,根据业务将不同表拆分到不同库中。 特点: 按业务对数据分级管理、维护、监控、扩展在高并发下,提高磁盘IO和数据量连接数垂直分表:以字段为依据,根据字段属性将不同字段拆分到不同表中。 特点: 1,冷热数据分离 2,减少IO过渡争…

Qt中tableView控件的使用

tableView使用注意事项 tableView在使用时,从工具栏拖动到底层页面后,右键进行选择如下图所示: 此处需要注意的是,需要去修改属性,从UI上修改属性如下所示: 也可以通过代码修改属性: //将其设…

[项目]深度估计增强的多目标跟踪

去年10月开始到年底,做了一个小工作,就是将自监督单目深度估计与MOT结合,目的是充分利用深度信息解决遮挡问题,并且在估计深度的同时可以估计相机位姿,这是可以计算出相邻两帧像素的映射。这在视角较大变化下比较有用。…

OpenCV实现目标追踪

目录 准备工作 语言: 软件包: 效果演示 代码解读 (1)导入OpenCV库 (2)使用 cv2.VideoCapture 打开指定路径的视频文件 (3)使用 vid.read() 读取视频的第一帧,ret…

MyBatis 学习(一)之 MyBatis 概述

目录 1 MyBatis 介绍 2 MyBatis 的重要组件 3 MyBatis 执行流程 4 参考文档 1 MyBatis 介绍 MyBatis 是一个半自动化的 ORM (Object-Relational Mapping,对象关系映射)持久层框架,它允许开发者通过 XML 或注解将对象与数据库中…

proteus8.15图文安装教程

proteus8.15版本可以用STM32系列单片机来进行仿真设计,比7.8版本方便多了,有需要的朋友们可以在公众号后台回复 proteus8.15 获取软件包。 1、下载好软件包,解压如下,右键proteus8.15.sp1以管理员身份运行。 2、第一次安装&#x…

获取tensorflow lite模型指定中间层的输出

以mobilenet v2为例子,我已经训练好了模型,有tflite格式和onnx格式两种模型的权重文件,我想获取tflite模型在推理阶段neck部分的输出。 查看onnx模型得到neck最后一层位置 使用netron查看onnx模型结构 从name中能知道Reshape是neck的最后一…

clickhouse 随心所欲的聚合模型-AggregatingMergeTree

clickhouse 强大的 MergeTree 系列引擎令人信服,其 ReplacingMergeTree、SummingMergeTree 在数据唯一性和汇总场景中表现非凡。但你是否还有保留最小(大)、平均等预聚合需求,甚至在一个模型中既有唯一性语意也有汇总、最小、最大、平均值语意该如何处理…

DBAPI如何使用数组类型参数

DBAPI如何使用数组类型参数 需求 根据多个id去查询学生信息 API创建 在基本信息标签&#xff0c;创建参数ids &#xff0c;参数类型选择 Array<bigint> 在执行器标签&#xff0c;填写sql&#xff0c;使用in查询 select * from student where id in <foreach ope…

Unity(第十一部)场景

游戏有多个场景组成&#xff08;新手村&#xff0c;某某副本&#xff0c;主城&#xff09; 场景是有多个物体组成&#xff08;怪物&#xff0c;地形&#xff0c;玩家等&#xff09; 物体是有多个组件组成&#xff08;刚体组件&#xff0c;自定义脚本&#xff09; 创建场景 编辑…

Folx Pro Mac中文p破解版如何使用?为您带来Folx Pro 详细使用教程!

​ Folx pro 5 中文版是mac上一款功能强大的老牌加速下载软件&#xff0c;新版本的Folx pro整体界面非常的简洁和漂亮&#xff0c;具有非常好用的分类管理功能&#xff0c;支持高速下载、定时下载、速度控制、iTunes集成等功能。Folx pro兼容主流的浏览器&#xff0c;不但可以下…

【卷积神经网络中用1*1 卷积有什么作用或者好处呢?】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;深度学习 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 1*1 卷积有什么作用或者好处呢 作用降维和增加非线性特征组合和交互网络的宽度和深度调整全连接替代增强…

09-认证-自研微服务框架

认证 1. 开启https支持 func (e *Engine) RunTLS(addr, certFile, keyFile string) {err : http.ListenAndServeTLS(addr, certFile, keyFile, e.Handler())if err ! nil {log.Fatal(err)} }1.1 测试 证书生成&#xff1a; 安装openssl 网站下载&#xff1a;http://slproweb…

华为HCIP Datacom H12-831 卷24

多选题 1、如图所示&#xff0c;某园区部署OSPF实现网络互通&#xff0c;其中Area1部署为NSSA区域。某工程师为了实现R1访问R4的环回口地址&#xff0c;在R4的OSPF进程中引入直连路由。以下关于该场景的描述,错误的有哪些项? A、在R4引入直连路由后&#xff0c;R1通过转换后的…

Socket网络编程(三)——TCP快速入门

目录 概述TCP连接可靠性1. 三次握手过程2. 四次挥手过程3. 为什么挥手需要四次&#xff1f; 传输可靠性TCP核心APITCP传输初始化配置&建立连接客户端创建Socket建立连接服务端创建ServerSocket监听连接ServerSocket 和 Socket的关系 Socket基本数据类型传输客户端数据传输服…

postman测试接口

1、postman测试接口 &#xff08;1&#xff09;首先安装postman 下载地址&#xff1a;Download Postman | Get Started for Free 选择对应版本下载&#xff0c;然后安装即可 &#xff08;2&#xff09;使用postman发送请求 比如以下这个请求例子&#xff1a; 使用postman发…

UE4 材质多张图片拼接成一张图片(此处用2×2拼接)

UE4 材质多张图片拼接成一张图片&#xff08;此处用22拼接&#xff09; //TexCoord,TextureA,TextureB,TextureC,TextureDfloat3 ReturnTexture TextureA; if(TexCoord.x < 0.5 && TexCoord.y < 0.5) {ReturnTexture TextureA; } else if(TexCoord.x > 0.5…

php docx,pptx,excel表格上传阿里云,腾讯云存储后截取第一页生成缩略图

php把word转图片的方法:首先给服务器安装libreoffice;然后使用exec函数来调用命令行操作;最后通过“exec(“soffice --headless --invisible…””方法把word转图片即可。 服务器环境:centos7 *集成环境:宝塔 我们开始给服务器安装libreoffice 直接执行下面的代码就可以…

代码随想录Leetcode213. 打家劫舍 II

题目&#xff1a; 代码(首刷看解析 2024年2月29日&#xff09;&#xff1a; class Solution { public:int robRange(vector<int>& nums, int start, int end) {if (start end) return nums[start];vector<int> dp(nums.size(), 0); // 遍历dp[start] nums[s…

【Oracle】玩转Oracle数据库(七):RMAN恢复管理器

前言 嘿&#xff0c;数据库大魔法师们&#xff01;准备好迎接新的技术大招了吗&#xff1f;今天我们要探索的是Oracle数据库中的神奇利器——RMAN恢复管理器&#xff01;&#x1f6e1;️&#x1f4be; 在这篇博文【Oracle】玩转Oracle数据库&#xff08;七&#xff09;&#xf…