PID闭环控制算法的学习与简单使用
平台:matlab2021b,Vivado2018
应用场景和理解
一个早餐店,假如一天都有生意,生意有的时间很火爆,有时候又一般,老板又是个实在人,只知道在后厨蒸包子。由于包子蒸熟需要一定的时间,老板娘在前面卖包子。老板娘耍了一会儿手机,客人买包子的速度很快,一会儿包子就卖完了,老板娘给老板说包子卖完了。老板说马上包。这个问题就可以使用我们的公式来控制,老板娘如果不耍手机,隔几分钟就告诉老板现在还有多少包子。老板根据现在的情况来包包子,保证整体的数量恒定。根据这个例子来说明PID的含义,老板娘看剩余包子个数的频率为几分钟一次还是十几分钟一次。这个时间就是采样时间T。老板加包子有时候抱一笼出来,有时候抱几笼出来,一次拿一笼出来赶不上客人吃包子的速度,一次拿几笼出来,发现客人吃的慢,很久都不用拿出来。这个拿包子的笼数就是比例系数P。在加包子的过程中,有时候直接把蒸笼拿上去蒸,导致累的过高,老板娘取不下来。这时候把包子放在这里,让老板娘自己去把蒸笼放好。这里老板娘控制的放的方式就是积分时间I。后面有时候客人一次买很多包子,有些客人就买几个,老板有时候抱出来的包子太多了,有时候又抱出来的太少了,老板自己想了个办法,在半路上老板娘在看一眼,发现抱多了,就放一些回去,拿少了就再去抱一些出来。这个多少就是微分时间D。好了现在经过一系列的操作老板终于可以保证外面的包子稳定在一个恒定的个数上了。
算法公式
PID控制算法是一种闭环控制算法。在工业中被广泛应用。在PID系统框图中,整个系统包括比较器、PID控制器和控制对象,其中PID控制器包括三个模块,比例(P),积分(I)和微分(D)。
r(t)为系统的目标值,y(t)为系统的输出值。e(t)为系统目标值和输出值的偏差。
u(t)作为控制系统中的中间变量,既是偏差e(t)通过PID控制算法处理后的输出量。又是被控制对象的输入量。因此模拟PID控制器的公式为:
其中,为比例增益,
为积分时间常数,
为微分时间常数。
PID离散化算法公式
离散化的算法公式分为位置式PID算法和增量式算法。
位置式算法,假设采样时间间隔为T,则在k时刻:偏差为e(k);积分为e(k),e(k-1),e(k-2)…+e(0);微分时间为(e(k)-e(k-1))/T。离散化后的公式为
上式化简为
增量式PID算法
根据位置式可知
则
可以得出
以上就是增量式算法,由增量式算法公式可知,系统的增量只和进三次偏差有关系。
由上述公式特点可以分析出来。位置式公式,需要多每次的误差进行累加,每次的输出都和过去的状态有关系。而增量式公式,误差只与最近三次采集有关系。但是积分影响大,稳态误差。
下面我们将通过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:传输控制协议,面向连接,…...
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)的整数值,每读取一个值,程序打印出该值个数的 *。
题目:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的 *。 程序分析:无。 实例 #include<stdio.h> #include<stdlib.h> int main() {int n,i,j;printf("请输入…...
如何在Windows轻量应用服务器上安装和配置SSH?
如何在Windows轻量应用服务器上安装和配置SSH? 检查OpenSSH的可用性:首先,需要以管理员身份打开PowerShell并运行命令Get-WindowsCapability - Online | Where-Object Name - like OpenSSH*来检查OpenSSH服务是否可用。如果服务未启动或不可…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...