【自动控制理论(一)】对PID控制的理解

2023-05-16

PID公式

在这里插入图片描述
以上是离散PID计算公式,PID的连续和离散,以及离散中的位置和增量,原理上都是完全一样的。一般控制都是离散PID,而且离散的表达形式更加直观,这里只给出离散的形式。

PID控制的理解

非线性的可不可以

有了PID控制,系统的输入和输出间的具体关系就不重要了。PID最好还是线性,非线性需要根据情况改变pid系数,比如某个既不是线性也不是单调的系统,输出与输入间的关系为——二次函数:
y = ( u − 1 ) 2 y=(u-1)^2 y=(u1)2

  1. 想让这个函数达到一个稳定的值y=4,初始状态为u=0,y=1。
    假设不知道内部的关系是什么,只知道参考值4比初值1要大,可以先随便设个系数。
    用matlab模拟该系统:
clc,clear;
ref = 4;
err = 0;
err_last = 0;
integral = 0;
y(1) = 1;
u(1) = 0;

for i=1:60
    err = ref-y(i);
    integral = integral+err;
    u(i+1) = 0.05*err+0.05*(err-err_last)+0.05*integral;
    err_last = err;
    y(i+1) = (u(i+1)-1).^2;
end
i=1:61;
plot(i,u);
hold on;
plot(i,y);
grid on;
xlabel('采样次数');
ylabel('u and y');
legend('u','y');

结果为:
在这里插入图片描述
2. 如果初始状态为u=5,y=16。在这里插入图片描述
虽然也能调节到参考值,但是u在最开始的时候变为了负。而且根据计算,y的初值比参考值大,误差为负,那么第一次采样的时候,u必为负。如果某些系统的输入不能为负,就可能出现问题。这种问题也很容易解决,给u加上限值即可,只允许u在这个范围内变化,一是为系统安全考虑,二是避免PID调节失败。比如虽然第一次采样后u被调为负,但是由于系统对u有限制,只能调到0,那么y=1,之后就会重复之前u=0,y=1的调节过程。
3. 如果初始状态为u=0,y=1,参考值为0
使用同样的pid系数就完全调不了了:
在这里插入图片描述
这是因为调节方向完全反了,即使加了限制,也不可行。比如若限制 0 < = u < = 5 0<=u<=5 0<=u<=5, 调节过程中u会一直卡在0处。
应该将PID系数改成负值。
如果系统单调,就不会有上述的问题,如果系统不单调,可能调着调着越过了极值点,就不是负反馈了。

对于线性系统

输入量=当前和过去所有误差的加权之和,对于PID来说,当前误差的权重较大,同时之前所有的误差也影响着最后计算出来的输入量。

比例部分

比例部分就是当前误差乘以某个系数 K p K_p Kp。比如说某个系统y=u,想从y=1调到y=5。调节过程中y肯定在逐渐变大,差距在逐渐缩小,那么比例部分就越来越小。所以越到后期,越到差距小的时候,比例部分就接近0。
比例部分主要是在调节刚开始的时候有用,可以显著加快前期的调节速度。如果比例系数过大,有可能调节过程中出现超调,积分过大也有可能出现超调。但积分造成的超调更严重些,不能把积分环节设置得太大,因此为了追求前期的快速,还是要设置一定比例系数的。
如果只有比例部分,可以计算一下对于 y = u y=u y=u系统只使用比例环节得到的输出量终值,设该终值为 y n y_n yn,那么:
( y r e f − y n ) K p = y n (y_{ref}-y_n)K_p=y_n (yrefyn)Kp=yn
y n = K p y r e f K p + 1 y_n=\frac{K_py_{ref}}{K_p+1} yn=Kp+1Kpyref
比例部分的作用就是在刚开始出现误差的时候让输入量快速向合理的方向移动。

积分部分

积分部分才是使系统调节到 y r e f y_{ref} yref的关键。看增量PID算法的公式可以看出来,积分环节的输入量的变化量=当前误差*积分系数。
在这里插入图片描述
积分部分的最终目标就是误差为0。

pid系数的正负确定

pid系数都是有正负的,设定前得先知道调节的方向。如果系统单调递增,想让y增大,误差为正,u也得增大,因此积分系数为正。如果系统单调递减,想让y增大,误差为正,u就得减小,因此积分系数为负。否则根本调不到稳定值。
比例系数和积分系数的正负是一致的。

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

【自动控制理论(一)】对PID控制的理解 的相关文章

  • PID简介

    一 基本定义 Sv 用户设定值 给定信号 Pv 控制对象当前状态值 反馈信号 E 偏差值 偏差信号 所以 E Sv Pv 二 PID各个控制基本分析 1 P控制 比例控制 Pout Kp Ek 假定从早上开机上电 我们每隔一秒钟就通过传感器
  • 控制算法之PID算法

    控制算法之PID算法 从入门到理解到应用 一发入魂 云 社区 腾讯云 tencent com
  • 详解汽轮机的TSI系统

    汽轮机安全监视系统 TSI 是一种集保护和检测功能于一身的永久监视系统 是大型旋转机械必不可少的保护系统 TSI可以对机组在起动 运行过程中的一些重要参数能可靠地进行监视和储存 它不仅能指示机组运行状态 记录输出信号 实现数值越限报警 出现
  • PID算法应用于室内温度控制的C语言实现

    我最近在学习PID算法 对此很感兴趣 所以与大伙分享下 有不足的地方欢迎指出 非常谢谢 PID算法的基本内容本篇博客就不做阐述了 网上有很多资料 文章的主题是用C语言实现PID算法 为了更好的理解 我采用软件模拟室内温度控制的方式与大伙分享
  • 【STM32CubeMX】位置式PID调节控制输出电压(超详解)

    本文将借助STM32CubeMX来配置ADC DMA DAC USART 并利用PID位置式算法实现对输出电压进行AD采集通过PID算法调节DAC 获取到我们想要的电压值 讲解的主要知识 何为PID以及为何需要PID STM32CubeMX
  • [经验] 轻松解读PID控制算法的三种参数的自整定方法

    轻松解读PID控制算法的三种参数的自整定方法 机器人论坛 电子技术论坛 广受欢迎的专业电子论坛 elecfans com
  • 如何以编程方式获取 OS X 上给定 PID 的打开文件描述符列表?

    我所看到的一切都说要使用lsof p 但我正在寻找不需要 fork exec 的东西 例如 在 Linux 上 人们可以简单地步行 proc pid fd You can use proc pidinfo与PROC PIDLISTFDS枚举
  • 进程组必须有一个正在运行的领导进程吗?

    在类 Unix 操作系统中 如果一个进程 pid和它的pgid相等 则该进程是进程组的领导者 但是 如果进程领导者已经退出 并且同组中的其他进程仍在运行 那么谁是继任的领导者进程 没有继任领导者 一旦流程组领导者退出 该组就失去了领导权 没
  • 如何在C++中使用system()命令获取执行进程的pid

    当我们使用system 命令 程序等待完成 但我正在执行process using system 并使用负载平衡服务器 因为该程序在执行系统命令后立即进入下一行 请注意 process可能不完整 system my script after
  • 如何在Python中检查是否存在给定pid的进程?

    有没有办法检查 pid 是否对应于有效进程 我从其他来源获取 pid 而不是os getpid 我需要检查机器上是否不存在具有该 pid 的进程 我需要它在 Unix 和 Windows 中可用 我还在检查 PID 是否未被使用 如果 pi
  • multiprocessing.Pool 与 maxtasksperchild 产生相同的 PID

    我需要在一个与所有其他内存完全隔离的进程中运行一个函数多次 我想用multiprocessing为此 因为我需要序列化来自函数的复杂输出 我设置了start method to spawn 并使用一个游泳池maxtasksperchild
  • 如何获取生成的 java 进程的 PID

    我正在编写几个 java 程序 在完成我想做的任何事情后 需要在单独的 JVM 中杀死 清理 为此 我需要获取我正在创建的 java 进程的 PID jps l可在 Windows 和 Unix 上运行 您可以使用 java 程序调用此命令
  • 将手柄传递到管道中

    说我有 node foo js node bar js 有没有办法将 foo 的标准输入句柄传递给 bar js 我有一个罕见的情况 我想在管道中进行向后通信 至少我知道我可以发送node bar js的pidnode foo js 鉴于
  • 以编程方式获取另一个进程的父进程pid?

    我尝试谷歌 但发现getppid 它获取的父pidcurrent过程 我需要类似的东西getppid some other pid 有这样的事吗 基本上获取某个进程的 pid 并返回父进程的 pid 我认为最简单的事情是打开 proc 并解
  • 如何迭代 PCB 以显示 Linux 内核模块中的信息?

    我想编写一个 Linux 内核模块 它可以显示所有正在运行的进程的 PID 我有以下代码 procInfo c My Kernel Module for process info include
  • Ubuntu Java:查找特定程序的 pid 并终止该程序

    我正在尝试创建一个应用程序来检查此特定应用程序是否正在运行 然后在指定的时间后终止该应用程序 我打算获取应用程序的 pid 如何获取应用程序的 pid Thanks 你可以尝试ps aux grep foobar获取 pid 然后发出kil
  • 有没有办法链接linux的线程TID和pthread_t“线程ID”

    在 Linux 上 线程由pthread t或 TID 我正在寻找这两种线程 id 之间的桥梁 given a pthread t我可以得到它吗TID 显然 https stackoverflow com questions 558469
  • mysql.server 启动时出现 PID 错误?

    我刚刚尝试使用自制程序 在 Mac OS X 10 6 上 安装 MySQL 但我在第一个障碍时遇到了问题 当尝试手动启动服务器 mysql server start 时 出现以下错误 ERROR Manager of pid file q
  • AppleScript:从应用程序隐藏/获取进程名称

    我想隐藏最前面的应用程序 我知道您可以使用以下语法隐藏进程 tell application System Events set visible of process to false end tell 我知道如何获取最前面的应用程序 pa
  • 如何通过VBA获取当前Excel实例的进程ID,而不使用标题?

    如何获取运行 VBA 代码的当前 Excel 实例的进程 ID 我不想通过标题中的名称来请求它 当我有两个或多个具有相同标题的 Excel 实例时 这会导致问题 您可以使用此方法来获取当前进程ID Declare Function GetC

随机推荐