PID控制算法学习与Matlab仿真

2023-11-17

起因

PID控制算法应该是包括工业机器人等各种行业和领域中非常常用的一种控制算法了。了解这个算法的起因是在稚晖君开发的自行车项目中见到,后来在北理工组会中了解到PID控制算法属于控制工程专业中非常基础的理论。
初步了解之后就会经常注意到这个算法,发现PID在飞控算法中非常重要,也常出现在b站分享的各种自平衡项目中。前两天又了解到著名“载人航天仿真工程软件”《坎巴拉太空计划》的MOD中也可以通过写入PID算法来对火箭姿态进行控制。可以说此算法是既实用又很酷了。

算法原理

连续系统中的PID算法公式如下
U ( t ) = k P [ e r r ( t ) + 1 T I ∫ e r r ( t ) d t + T D d [ e r r ( t ) ] d t ] = k P e r r ( t ) + k P T I ∫ e r r ( t ) d t + T D k P d [ e r r ( t ) ] d t = k P e r r ( t ) + k I ∫ e r r ( t ) d t + k D d [ e r r ( t ) ] d t U(t)=k_P\left [ err(t)+\frac{1}{T_I}\int err(t)dt+T_D\frac{d[err(t)]}{dt} \right ]\\ =k_P err(t)+\frac{k_P}{T_I}\int err(t)dt+T_D k_P\frac{d[err(t)]}{dt} \\ =k_P err(t)+k_I\int err(t)dt+k_D\frac{d[err(t)]}{dt} U(t)=kP[err(t)+TI1err(t)dt+TDdtd[err(t)]]=kPerr(t)+TIkPerr(t)dt+TDkPdtd[err(t)]=kPerr(t)+kIerr(t)dt+kDdtd[err(t)]
其中 U ( t ) U(t) U(t)即为调节的控制量, e r r ( t ) err(t) err(t)为期望值与实际值的偏差,由于实际使用时都要对三个参数进行调节,因此索性直接写为 k P k_P kP k I k_I kI k D k_D kD,正好代表了P比例 I积分 D微分三个调节参数。
离散系统中的PID算法公式如下
U ( t ) = K P e r r ( t ) + K I ∑ n = 0 k e r r ( n ) + K D [ e r r ( k ) − e r r ( k − 1 ) ] U(t)=K_P err(t)+K_I\sum_{n=0}^{k}err(n)+K_D\left [ err(k)-err(k-1) \right ] U(t)=KPerr(t)+KIn=0kerr(n)+KD[err(k)err(k1)]
算法结构如下
在这里插入图片描述

算法解析

比例P就是常规中很直觉的控制思想,即大了就缩小,小了就扩大;

比例P存在的问题是调节速度过快会引起系统在期望值处震荡,因此引入微分D;
微分D考量变化速度,若变化速度过大将降低调节量;

比例P+微分D存在的问题是,存在稳态误差(系统由于其他干扰,使得比例调节无法完成期望值,在另一处实现稳态),因此引入积分I;
积分I考量一段时间的误差积累(特别是稳态误差),根据误差积累改变调节量。

调参小技巧

最优的曲线貌似因人而异,如果需要更快达到目标,可以存在少量超调,微微震荡,如果对震荡敏感,可以严格限制超调,降低达到目标的速度,总的来说:

  1. K p K_p Kp K i K_i Ki最后 K d K_d Kd
  2. 确定 K p K_p Kp 时,由0逐渐加大比例增益 K p K_p Kp,直至系统出现振荡,再从此时的比例增益 K p K_p Kp逐渐减小,直至系统振荡消失,记录此时的比例增益 K p K_p Kp,设定最终的比例增益 K p K_p Kp为当前值的60%~70%;
  3. K i K_i Ki也一样保证在震荡的临界处即可;
  4. 最后加 K d K_d Kd

Matlab仿真

%Project: 【PID控制算法仿真】最简单的系统
%Author: Jace
%Data: 2022/6/12
%====================准备====================
clear all;
close all;
clc;
%====================初始化参数====================
%--------全局参数--------
N=100;
%--------系统模型参数1--------
A=0.9;
B=0.2114;

%--------分配空间--------
x=zeros(1,N);
u=zeros(1,N);
e=zeros(1,N);
Sum_e=zeros(1,N);
r=zeros(1,N);

%--------初始化--------
r(1)=800;
x(1)=0;
e(1)=0;   
Sum_e(1)=0;

%--------PID参数--------
% kp=0.22;    
% ki=0.13;
% kd=0;
kp=2;    
ki=0.23;
kd=0.2;
for k=2:N
    %系统运行
    x(k)=A*x(k-1)+B*u(k-1)+B*u(k);%系统状态方程
    if k<N/2
        r(k)=r(1);%期望值
    else
        r(k)=r(1)-200;
    end
    e(k)=r(k)-x(k);%误差信号
    Sum_e(k)=Sum_e(k-1)+e(k);%误差的累加和
    u(k)=kp*e(k)+ki*Sum_e(k)+kd*(e(k)-e(k-1)); %PID控制器输出
end

figure;
hold on,box on;
plot(x,'-r.');
plot(r,'-k.');
legend('State','Expect');
axis([0 N 0 1000])
xlabel('Sampling Time');ylabel('Value');
title('State');

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PID控制算法学习与Matlab仿真 的相关文章

  • 单元格的 Fieldnames 函数的等效项

    正如标题所说 只是想知道是否有一个函数可以用作字段名 http www mathworks co uk help matlab ref fieldnames html 但适用于单元格 所以如果我有类似的东西 a imread redsqua
  • 为什么 MATLAB 本机函数 cov(协方差矩阵计算)使用与我预期不同的除数?

    给定一个 M 维和 N 个样本的数据矩阵数据 例如 data randn N M 我可以计算协方差矩阵 data mu data ones N 1 mean data cov matrix data mu data mu N 如果我使用原生
  • 从 imread 返回的 ndims

    我正在从文件夹中选取图像 尺寸为128 128 为此 我使用以下代码行 FileName PathName uigetfile jpg Select the Cover Image file fullfile PathName FileNa
  • 在Matlab中选择图像上的像素时,索引指的是什么?

    当在Matlab中查看图像的单个像素时 该索引指的是什么 X Y 指的是像素的坐标 RGB 指的是颜色 但是关于索引是什么有什么想法吗 为了澄清一下 当我在 Matlab 中查看图形并使用数据光标选择一个点时 显示的三行是 X Y 指数 R
  • 使用 R2010b 中的符号工具箱来求解和/或 linsolve

    我前几天问了一个问题here https stackoverflow com questions 20317038 matlab linear congruence solver that supports a non prime modu
  • 检查图像中是否有太薄的区域

    我正在尝试验证雕刻机的黑白图像 更多的是剪贴画图像 不是照片 我需要考虑的主要事情之一是区域的大小 或线条的宽度 因为机器无法处理太细的线条 所以我需要找到比给定阈值更细的区域 以此图为例 竖琴的琴弦可能太细而无法雕刻 我正在阅读有关 Ma
  • 在 Matlab 的命令窗口中获取旧式帮助

    问题的简短版本 在最新版本的 Matlab 中 我在 Windows 上的 R2014b 和 R2015a 中看到过 当您键入help foo你得到一个简要描述 简介函数及其签名 例如 输入help bsxfun产生类似这样的东西 只有更好
  • Matlab 一个图上有多个图例 2014b

    我想在一个地块上有多个传说 该解决方案在 2014b 版本之前完美运行 我试图弄清楚如何使用手柄优雅地制作它 但到目前为止还没有成功 欢迎任何想法 2013b 的示例 x 1 50 y1 sin x 2 y2 cos x 2 f figur
  • 如何使用Matlab将数据保存到Excel表格中?

    我想将数据以表格形式保存在 Excel 工作表中 它应该看起来像 Name Age R no Gpa Adnan 24 18 3 55 Ahmad 22 12 3 44 Usman 23 22 3 00 每次当我执行我的文件时类数据 m 下
  • 如何在Matlab中打印带有千位分隔符的整数?

    我想使用逗号作为千位分隔符将数字转换为字符串 就像是 x 120501231 21 str sprintf 0 0f x 但随着效果 str 120 501 231 21 如果内置fprintf sprintf做不到 我想可以使用正则表达式
  • for 循环中的绘图没有可见点

    我正在努力解决我想使用 for 循环制作的情节 我知道当我在循环之后添加它时它会起作用 只是一个简单的图 但我想用另一种方式尝试一下 fib ones 1 10 for k 3 10 hold on fib k fib k 1 fib k
  • MATLAB 编译器与 MATLAB 编码器

    两者有什么区别 据我了解 MATLAB Compiler将MATLAB代码包装成 exe文件 这样就可以在不安装MATLAB的情况下使用它 并且只需要MCR 除此之外 MATLAB Builder NE 还可以用于生成与 Net 框架一起使
  • Matlab:3D 堆积条形图

    我正在尝试创建一个 3D 堆积条形图 如这个问题所示 Matlab 中的 3D 堆叠条形图 https stackoverflow com questions 13156133 3d stacked bars in matlab 5D 然而
  • 如何在 MATLAB 编译的应用程序中运行外部 .m 代码? [复制]

    这个问题在这里已经有答案了 我有一个 MATLAB 项目 我使用 MCC 对其进行编译以获得单个可执行文件 然后我想知道外部程序员是否可以在 exe 中执行他的一些 m 文件 而无需重新编译整个项目 重点是提供一个应用程序 其他开发人员可以
  • 通过多次合并相同的行向量来构建矩阵

    有没有一个matlab函数可以让我执行以下操作 x 1 2 2 3 然后基于x我想建立矩阵m 1 2 2 3 1 2 2 3 1 2 2 3 1 2 2 3 您正在寻找REPMAT http www mathworks com help t
  • MATLAB 除法...29/128 应该返回 0 吗?

    我真的不认为这是一个精度问题 答案应该是0 226左右 这是确切的代码 val I i j bucketSize pos val bucketSize I只是我从中获取值的矩阵 以下是 MATLAB 的输出 val 29 bucketSiz
  • 在 MATLAB 中绘图后恢复轴

    从文本文件绘制多种方法的输出后 未显示轴的右侧和上侧 我需要拥有它们并将它们加粗 就像当前的轴一样 绘制的数据来自存储每种方法数据的文件 每个数据文件都是一个 256x2 文件 包含 0 1 之间的值 第一列是精度 第二列是召回率 figu
  • MATLAB - 通过垂直连接子矩阵重新排列矩阵

    我在执行以下任务时遇到问题 假设一个 3x6 矩阵 A 0 2787 0 2948 0 4635 0 8388 0 0627 0 0435 0 6917 0 1185 0 3660 0 1867 0 2383 0 7577 0 6179 0
  • 如何选择面积最大的对象?

    我用过bwconvhull检测图像的某个部分 正如您在图像中看到的那样 有许多具有特定质心的对象 我想做的是检测面积最大的物体 左起第一个大物体 并忽略其他物体 我应该遵循哪种方法 我将非常感谢您的帮助 以下是代码 由于我仍在努力 所以写得
  • 优先连接,Matlab 中的复杂网络

    大家好 我现在正在 MATLAB 中研究优先附件模型 在理解以下内容时遇到一些困难 假设我一开始有 4 个节点 连接如下 time 0 1 lt gt 2 3 lt gt 4 在下一个时间步骤中 我添加一个节点和 4 个连接 然后添加另一个

随机推荐

  • 数仓虚拟化技术:PieCloudDB Database 通过中国信通院 2023 「可信数据库」性能评测的强力支撑...

    可信数据库 是国内首个数据库的评测体系 被业界广泛认可为产品能力重要的衡量标准之一 PieCloudDB Database在该评测中展现出卓越的数据处理速度 稳定性和可扩展性 为用户提供了强大的数据分析和查询能力 6 月 15 16 日 中
  • EF Core Migration 报错:An error occurred using the connection to database ‘‘ on server ‘10.28.253.2‘

    EF Core Migration update database的时候 An error occurred using the connection to database on server 10 28 253 2 问题 在做EF Co
  • 嵌入式Linux构建yaffs根文件系统

    嵌入式Linux构建yaffs根文件系统 开发环境说明 ubuntu1404 i686 天嵌光盘里的交叉编译链 版本4 4 3 busybox 1 13 0 下载地址 https busybox net downloads 一 编译busy
  • TQ2440移植u-boot2016.11全过程记录-【1】单板建立并启动

    TQ2440移植u boot2016 11 单板建立并启动 移植说明 u boot2016 11是S3C2440最后一版的uboot支持 所以选择了此版本进行移植 交叉编译器使用的是天嵌官方的交叉编译器 版本为4 4 3 使用的ubuntu
  • rsync随机启动脚本

    服务端 1 bin sh 2 chkconfig 2345 21 60 3 description Saves and restores system entropy pool for 4 create by xiaohu 5 2014 0
  • Dev-c++怎么设置背景色

    我们在使用Dev c 这个软件的时候 遇到夜晚等的条件下 希望使用一种暗一点的颜色 而默认的是白色的背景十分亮眼 如何进行设置呢 在教程的开始先附上设置后的效果图 显然这种背景更加适合晚上开发 话不多说 直接开始设置步骤 设置步骤 1 菜单
  • opencv-图片矫正

    转载 https www jianshu com p a1838972d1da 对于倾斜的图片通过矫正可以得到水平的图片 一般有如下几种基于opencv的组合方式进行图片矫正 1 傅里叶变换 霍夫变换 直线 角度 旋转 2 边缘检测 霍夫变
  • 英国程序员的工资

    我在英国做程序员工作将近2年了 接触到他们当地的一些的程序员 他们的大概工资如下 一个刚刚从学校毕业的计算机系大学生 月工资水平大概是2000到3000英镑左右 约合人民币3万至4 5万元 这是税前收入 英国是一个高税收高福利的国家 如果你
  • Windows上如何使用SWIG (c++ android 示例)

    SWIG介绍 SWIG Simplified Wrapper and Interface Generator 即简化包以及接口生成器 为脚本语言 tcl perl python等 提供了C和C 的接口 SWIG在1995年在Los Alam
  • 获取nan只能用numpy,不能用pandas

    a pd Series a b pd nan d AttributeError module pandas has no attribute nan a pd Series a b np nan d print a 0 a 1 b 2 Na
  • c语言输入并判断成绩等级

    输入并判断成绩等级 include
  • 华为OD机试 - 总最快检测效率(Java)

    题目描述 在系统 网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查 每名采样员的效率不同 采样效率为N人 小时 由于外界变化 采样员的效率会以M人 小时为粒度发生变化 M为采样效率浮动粒度 M N 10 输入保证N 10 的结
  • 数据结构与算法 各类数图概念集合

    拓扑排序 有向无环图才能进行拓扑排序 理解 就是在大学期间所有的课程 你只有先学完计算机基础 才能学更加高深的课程 从一个入度为0的点出发 找下一个一直到最后就是拓扑排序 前 中 后序排序 前 根左右 中 左中右 后 左右中 要确定一颗二叉
  • <毕业设计>最适合大学生的12个Java系统项目(附源码)

    就业 毕业设计 Java项目合集 小编给大家整理了12个Java系统项目 附源码 白嫖到底 最合适大学生学习的Java毕业设计教程合集 合集视频教程链接 https www bilibili com video BV1pB4y1h7Pr s
  • [Python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒

    前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒 同样可以通过Spider获取网站内容 最近学习了Selenium Phantomjs后 准备利用它们获取百度百科的旅游景点消息盒 InfoBox 这也是毕业设计实体对齐和属
  • 1Panel 安装部署

    1Panel 是一个现代化 开源的 Linux 服务器运维管理面板 1 环境要求 安装前请确保您的系统符合安装条件 操作系统 支持主流 Linux 发行版本 基于 Debian RedHat 包括国产操作系统 服务器架构 x86 64 aa
  • Limit

    Mysql limit用法 select from test LIMIT 3 当 limit后面跟一个参数的时候 该参数表示要取的数据的数量 表示直接取前三条数据 以下的两种方式均表示取2 3 4三条条数据 select from test
  • R语言深度学习:智能客服聊天机器人

    目录 一 准备工作 二 数据预处理 三 构建模型 1 准备训练数据 2 构建seq2seq模型
  • Ubuntu18.04安装docker及nvidia docker、NVIDIA Container Toolkit

    1 卸载旧版docker sudo apt get remove docker sudo apt get remove auto remove docker sudo apt remove docker ce 如果上面方法都不行直接 使用d
  • PID控制算法学习与Matlab仿真

    文章目录 起因 算法原理 算法解析 调参小技巧 Matlab仿真 起因 PID控制算法应该是包括工业机器人等各种行业和领域中非常常用的一种控制算法了 了解这个算法的起因是在稚晖君开发的自行车项目中见到 后来在北理工组会中了解到PID控制算法