控制教程 —— 介绍篇:3.PID控制器设计

2023-05-16

承接上一篇(控制教程 —— 介绍篇:2.系统分析)
介绍完系统建模和基本的系统分析后,我们已经了解了被控对象的特性,这时,就需要用一个合理的控制器,让这个被控对象在该控制器下按照指定的给定来执行,最为广泛使用的那就是PID控制器了。
在本教程中,我们将介绍一个简单而通用的反馈补偿结构,比例积分微分(PID)控制器,PID控制器之所以被广泛采用,是因为它非常容易理解并且非常有效,工程师不需要太理解控制论,只需要理解积分和微分就可以实施控制系统。此外,即使微分积分很简单,它也很复杂,因为它可以包含了系统的历史(积分),并可以预测系统的未来行为(微分)。我们将讨论每个PID参数对闭环系统动力学的影响,并将演示如何使用PID控制器来改善系统性能。
本教程中使用的主要MATLAB命令是:

文章目录

    • PID概述
    • P I D 的特征
    • 例子
    • 设计PID控制器的一般流程
    • 自动PID参数整定

PID概述

在本教程中,我们将考虑以下统一的反馈系统:
在这里插入图片描述
PID控制器的输出等于被控对象的输入,它在时域中根据反馈误差计算如下:
u ( t ) = K p e ( t ) + K i ∫ e ( t ) d t + K d d e d t u(t) = K_p e(t) + K_i \int e(t)dt + K_d \frac{de}{dt} u(t)=Kpe(t)+Kie(t)dt+Kddtde首先,让我们使用上面显示的示意图了解PID控制器在闭环系统中的工作方式,变量 e e e 表示跟踪误差,即期望输出 r r r 与实际输出 y y y 之差。该误差信号( e e e)被送PID控制器,并且控制器计算该误差信号相对于时间的导数和积分,发送到被控对象的控制信号 u u u 等于比例增益 K p K_p Kp 乘以误差幅度加积分增益 K i K_i Ki 乘以误差积分加微分增益 K d K_d Kd 乘以误差导数。
该控制信号( u u u)被送到被控对象,并获得新的输出( y y y),然后,将新的输出( y y y)反馈并与参考进行比较计算新的误差信号( e e e),控制器获取这个新的误差信号,并计算新的控制信号。
通过对上式进行拉普拉斯变换,可以找到PID控制器的传递函数。
K p + K i s + K d s = K d s 2 + K p s + K i s K_p + \frac {K_i} {s} + K_d s = \frac{K_d s^2 + K_p s + K_i} {s} Kp+sKi+Kds=sKds2+Kps+Ki其中, K p K_p Kp 是比例增益, K i K_i Ki 是积分增益, K d K_d Kd 是微分增益.
我们可以使用传递函数直接在MATLAB中定义PID控制器,例如:

Kp = 1;
Ki = 1;
Kd = 1;

s = tf('s');
C = Kp + Ki/s + Kd*s

在这里插入图片描述
或者,我们可以使用MATLAB的pid对象生成等效的连续时间控制器,如下表示:

C = pid(Kp,Ki,Kd)

在这里插入图片描述
让我们将pid对象转换为传递函数,可以看到产生的结果与上述相同:

tf(C)

在这里插入图片描述

P I D 的特征

增加比例增益( K p K_p Kp)具有在相同误差水平下按比例增加控制信号的效果,对于给定的误差级别,控制器将更"有力",会使闭环系统做出更快的反应,但也会导致超调,增加 K p K_p Kp的另一个效果是它将稳态误差趋于减少,但不能消除误差。
在控制器中添加一个微分项( K d K_d Kd),可以增加控制器对“未来”误差的判断能力,对于简单的比例控制,如果 K q K_q Kq 是固定的,要想增大控制输出,则必须增大误差,而利用微分项,即使误差的幅值很小,但如果误差的斜率是增大的,那么控制输出也会增大,这种方式往往会增加系统阻尼,从而减少超调。但是,增加导数项并不会对稳态误差产生影响。
在控制器中添加一个积分项( K i K_i Ki),有助于降低稳态误差,如果存在持续的,稳定的误差,则积分器会不断累积,从而增加控制输出来降低误差。但是,积分项的一个缺点是,但误差的正负发生改变时,积分器可能需要一段时间才能“改变符号”,这会使系统更加缓慢和振荡。
下表总结了每个控制器参数( K p K_p Kp K d K_d Kd K i K_i Ki)对闭环系统的一般影响。请注意,这些准则在许多情况下适用,但并非全部适用。如果你想知道调整各个增益的效果,则必须进行更多分析,或者必须在实际系统上进行测试。

参数上升时间超调稳定时间误差
K p K_p Kp减小增大变化小减小
K d K_d Kd减小增大增大减小
K i K_i Ki变化小减小减小减小

例子

假设我们有一个简单的质量块弹簧阻尼器系统,这个在前面建模部分有介绍过。
在这里插入图片描述
该系统的控制方程为:
m x ¨ + b x ˙ + k x = F m\ddot{x} + b\dot{x} + kx = F mx¨+bx˙+kx=F对控制方程进行拉普拉斯变换,可以得到:
m s 2 X ( s ) + b s X ( s ) + k X ( s ) = F ( s ) ms^{2}X(s) + bsX(s) + kX(s) = F(s) ms2X(s)+bsX(s)+kX(s)=F(s)输入力 F ( s ) F(s) F(s) 和输出位移 X ( s ) X(s) X(s) 之间的传递函数变为:
X ( s ) F ( s ) = 1 m s 2 + b s + k \frac{X(s)}{F(s)} = \frac{1}{ms^2 + bs + k} F(s)X(s)=ms2+bs+k1给定:
m = 1 kg
b = 10 N s/m
k = 20 N/m
F = 1 N
将这些值代入上述传递函数
X ( s ) F ( s ) = 1 s 2 + 10 s + 20 \frac{X(s)}{F(s)} = \frac{1}{s^2 + 10s + 20} F(s)X(s)=s2+10s+201此问题的目的是展示 K p K_p Kp K d K_d Kd K i K_i Ki的调整来满足一下目标:

  • 快速的上升时间
  • 最小过冲
  • 零稳态误差
    开环阶跃响应
    让我们首先查看开环阶跃响应:
s = tf('s');
P = 1/(s^2 + 10*s + 20);
step(P)

在这里插入图片描述
被控对象的传递函数的直流增益为1/20,因此0.05是单位阶跃输入的最终值,这相当于95%的稳态误差,这是非常大的。此外,上升时间约为1s,稳定时间约为1.5s,让我们设计一个控制器,该控制器将减少上升时间,减少稳定时间并消除稳态误差。

比例控制
从上表中可以看出,比例控制器( K p K_p Kp)减少了上升时间,增加了超调,但减少了稳态误差。
以下是带有比例控制器的单位反馈系统的闭环传递函数,其中 X ( s ) X(s) X(s) 是我们的输出(等于 Y ( s ) Y(s) Y(s)),而我们的参考 R ( s ) R(s) R(s) 是输入:
T ( s ) = X ( s ) R ( s ) = K p s 2 + 10 s + ( 20 + K p ) T(s)=\frac{X(s)}{R(s)} = \frac{K_p}{s^2+10s+(20+K_p)} T(s)=R(s)X(s)=s2+10s+(20+Kp)Kp让比例增益( K p K_p Kp)等于300。

Kp = 300;
C = pid(Kp)
T = feedback(C*P,1)

t = 0:0.01:2;
step(T,t)

在这里插入图片描述

在这里插入图片描述
上图显示比例控制器减少了上升时间,稳定时间和稳态误差,但增加了过冲。
比例微分控制
现在,让我们看一下PD控制,从上表中可以看出,添加微分控制( K d K_d Kd)可以减少过冲和稳定时间,具有PD控制器的给定系统的闭环传递函数为:
T ( s ) = X ( s ) R ( s ) = K d s + K p s 2 + ( 10 + K d ) s + ( 20 + K p ) T(s) = \frac{X(s)}{R(s)} = \frac{K_d s + K_p}{s^2 + (10 + K_d) s + (20 + K_p)} T(s)=R(s)X(s)=s2+(10+Kd)s+(20+Kp)Kds+Kp K p K_p Kp 等于300,并让 K d K_d Kd 等于10

Kp = 300;
Kd = 10;
C = pid(Kp,0,Kd)
T = feedback(C*P,1)

t = 0:0.01:2;
step(T,t)

在这里插入图片描述

在这里插入图片描述
该图表明,微分项的增加减少了超调和稳定时间,并且对上升时间和稳态误差的影响可忽略不计。
比例积分控制
在进行PID控制之前,让我们研究一下PI控制,从表中可以看出,积分控制( K i K_i Ki)的增加有减少上升时间,增加超调和稳定时间,减小稳态误差的趋势。对于给定的系统,带有PI控制器的闭环传递函数:
T ( s ) = X ( s ) R ( s ) = K p s + K i s 3 + 10 s 2 + ( 20 + K p ) s + K i T(s) = \frac{X(s)}{R(s)} = \frac{K_p s + K_i}{s^3 + 10 s^2 + (20 + K_p )s + K_i} T(s)=R(s)X(s)=s3+10s2+(20+Kp)s+KiKps+Ki让我们将 K p K_p Kp 减少到30,并使 K i K_i Ki 等于70

Kp = 30;
Ki = 70;
C = pid(Kp,Ki)
T = feedback(C*P,1)

t = 0:0.01:2;
step(T,t)

在这里插入图片描述
在这里插入图片描述
在MATLAB命令窗口中运行,即可生成上面的图,我们减小了比例增益( K p K_p Kp),因为积分控制器也像比例控制器那样减少上升时间和增加超调(双重作用),上面的响应表明,在这种情况下,积分控制器消除了稳态误差。

比例积分微分控制
现在,让我们研究一下PID控制,具有PID控制器的给定系统的闭环传递函数为:
T ( s ) = X ( s ) R ( s ) = K d s 2 + K p s + K i s 3 + ( 10 + K d ) s 2 + ( 20 + K p ) s + K i T(s) = \frac{X(s)}{R(s)} = \frac{K_d s^2 + K_p s + K_i}{s^3 + (10 + K_d)s^2 + (20 + K_p)s + K_i } T(s)=R(s)X(s)=s3+(10+Kd)s2+(20+Kp)s+KiKds2+Kps+Ki经过多次调整,比例增益 K p K_p Kp = 350, K i K_i Ki = 300 和 K d K_d Kd = 50

Kp = 350;
Ki = 300;
Kd = 50;
C = pid(Kp,Ki,Kd)
T = feedback(C*P,1);

t = 0:0.01:2;
step(T,t)

在这里插入图片描述

在这里插入图片描述
现在,我们设计了一种闭环系统,该系统没有超调,上升时间快且没有稳态误差

设计PID控制器的一般流程

在为给定系统设计PID控制器时,请遵循以下所示的步骤来获得所需的响应

  1. 获得开环响应并确定需要改进的内容
  2. 添加比例环节来改善上升时间
  3. 添加微分环节来减少超调
  4. 添加积分环节来减少稳态误差
  5. 调整 K p K_p Kp K i K_i Ki K d K_d Kd ,直到获得所需的效果。

最后,请记住,你可以不用再系统中都使用三个控制环节,例如,如果PI控制器可以满足所定的要求(如上述示例),则无需在系统上实现PID控制器,保持控制器尽可能的简单。
在以下链接上可以找到在实际物理系统上调整PI控制器的示例,该示例还说明实现控制的一些挑战:控制饱和,积分器饱和以及噪声放大。

自动PID参数整定

MATLAB提供了用于自动选择最佳PID增益的工具,从而无需进行上述反复试验。您可以直接使用pidtuner访问调优算法,也可以使用pidTuner通过美观的图形用户界面(GUI)访问调优算法
MATLAB自动整定算法选择PID增益来平衡性能(响应时间,带宽)和鲁棒性(稳定性裕度)。默认情况下,该算法设计为60度的相位裕度。
让我们探索这个自动化工具,方法是首先输入一下所示命令为质量块弹簧阻尼器系统生成比例控制器,在所示的语法中,P是之前生成的模型,"p"指控制器采用比例控制器。

  pidTuner(P,'p')

将会显示pidTuner GUI窗口,如下所示:
在这里插入图片描述

注意,所示的阶跃响应比我们手动设计的比例控制器要慢,现在,单击右上方的Show Parameters按钮,正如预期的那样,比例增益 K p K_p Kp 小于我们采用的比例增益 K p K_p Kp = 94.86 < 300.
在这里插入图片描述
现在,我们可以调整控制器参数,并立即在GUI窗口中看到生成的响应。尝试将”Response Time slider“滑块向右拖动到0.14s,如下所示,这确实会加快响应,并且我们可以看到 K p K_p Kp现在更接近于手动选择的值。我们还可以看到系统的其他性能和鲁棒性参数,请注意,在调整滑块之前,目标相位裕度为60度,这是pidTuner的默认设置,通常可以再鲁棒性和性能之间取得良好的平衡。

在这里插入图片描述
现在,让我们尝试为我们的系统设计PID控制器,通过将先前设计的控制器指定第二个参数”C“,pidTuner将设计另一个PID控制器(而不是P或PI),并将系统与自动控制器的响应与参考的响应进行比较

   pidTuner(P,C)

我们在输出窗口中看到,自动控制器的响应较慢,并且比参考表现出更多的超调,现在,从工具栏中选择"Domain:Frequency"选项,该选项显示了频域调整参数。
在这里插入图片描述
现在输入32rad/s(带宽)和90deg(相位裕量),以生成性能与参考相似的控制器,请记住,较高的闭环带宽会导致更快的上升时间,而较大的相位裕量会减小超调并提高系统稳定性。
在这里插入图片描述

最后,我们注意到我们可以使用命令行工具pidtune代替使用pidTuner的GUI

opts = pidtuneOptions('CrossoverFrequency',32,'PhaseMargin',90);
[C, info] = pidtune(P, 'pid', opts)

在这里插入图片描述

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

控制教程 —— 介绍篇:3.PID控制器设计 的相关文章

  • PI闭环的FPGA实现

    PID闭环的FPGA实现 1 原理分析 最近小张同学在做项目的时候发现PI闭环的FPGA学习资料很少 秉持着 既然没有轮子 那么自己就造一个的原则 于是乎自己写了个PI的Verilog程序 FPGA中实现PI闭环与DSP STM32 arm
  • PID简介

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

    工程实践 ZN法整定PID 知乎 zhihu com
  • 电机控制进阶——PID速度控制

    之前的几篇文章 电机控制基础篇 介绍的电机编码器原理 定时器输出PWM 定时器编码器模式测速等 本篇在前几篇的基础上 继续来学习电机控制 通过PID算法 来进行电机的速度控制 并进行实验测试 PID基础 PID即 Proportional
  • 连载---《自动调节系统解析与PID整定》之一

    原创连载 自动调节系统解析与PID整定 之一 360doc com
  • PID自控理论(频域bode图理论分析)

    PID 迟后超前矫正 临界比例度法整定PID 在低频区 主要是PI控制器起作用 用以提高系统型别消除或减小稳态误差 在中 高频区 主要是PD控制器起作用 用以增大幅值穿越频率和相位裕度 提高系统的响应速度 因此 PID控制器可以全面地提高系
  • 串级PID与单极PID的区别

    目录 前言 一 什么是串级PID 二 串级PID与单极PID比较 1 控制小车开到某一位置 2 平衡小车速度控制 三 什么时候用串级PID 结语 前言 本文将讲述串级PID与单极PID的区别 并由此引出什么时候用串级PID 对于想深入学习P
  • 深入浅出PID控制算法(二)————PID算法离散化和增量式PID算法原理及Matlab实现

    引言 上篇介绍了连续系统的PID算法 但是计算机控制是一种采样控制 他只能根据采样时刻的偏差来计算控制量 因此计算机控制系统中 必须对公式进行离散化 具体就是用求和代替积分 用向后差分来代替微分 使模拟PID离散化为数字形式的差分方程 准备
  • 什么是死区时间

    死区时间是PWM输出时 为了使H桥或半H桥的上下管不会因为开关的关断延迟问题发生同时导通而设置的一个保护时段 通常也指pwm响应时间 由于IGBT 绝缘栅极型功率管 等功率器件都存在一定的结电容 所以会造成器件导通关断的延迟现象 一般在设计
  • PID控制算法01

    PID控制算法 PID控制算法公式 原理 参数作用 PID算法及改进 两个基本类型 位置型PID控制 增量型PID控制 积分环节改进的PID控制 积分分离的PID控制 变速积分的PID控制 抗积分饱和的PID控制 微分环节改进的PID控制
  • TSI系统测量参数之:轴向振动

    一 TSI系统测量参数 1 轴向位移 2 盖振或瓦振 3 偏心 4 键相 5 零转速 6 轴向振动 7 相对热膨胀 胀差 8 绝对热膨胀 缸胀 二 各参数作用 2 轴向振动 测量的是大轴相对于轴瓦的X向振动和Y向振动 反馈电压量程为 4V至
  • 进程组必须有一个正在运行的领导进程吗?

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

    我正在编写几个 java 程序 在完成我想做的任何事情后 需要在单独的 JVM 中杀死 清理 为此 我需要获取我正在创建的 java 进程的 PID jps l可在 Windows 和 Unix 上运行 您可以使用 java 程序调用此命令
  • 在 Unix 环境中检测过时的 pid 文件

    在 Unix 环境中检测陈旧 pid 文件的标准 跨平台方法是什么 假设我想终止应用程序的旧实例 但如果该应用程序已经退出 我当然不想破坏具有相同 PID 的不相关进程 现在我找到了一种在我的 Ubuntu 也可能是其他基于 GNU Lin
  • C - 获取用popen打开的进程的PID

    我有一个用 C 编写的程序 它使用 popen 打开另一个程序 我想获取该程序的 pid 或某种处理程序 以便在一定时间限制后 或者在它超出某些 ram 和 stdout 限制时杀死它 我认为这必须用ptrace来完成 它需要PID 但我不
  • Ubuntu Java:查找特定程序的 pid 并终止该程序

    我正在尝试创建一个应用程序来检查此特定应用程序是否正在运行 然后在指定的时间后终止该应用程序 我打算获取应用程序的 pid 如何获取应用程序的 pid Thanks 你可以尝试ps aux grep foobar获取 pid 然后发出kil
  • Bash:是否可以阻止 PID 被重复使用?

    是否可以阻止 PID 被重复使用 例如 如果我运行一份工作myjob在背景中myjob 并使用获取PIDPID 是否可以阻止 linux 系统重新使用该 PID 直到我检查该 PID 不再存在 进程已完成 换句话说 我想做类似的事情 myj
  • 有没有办法链接linux的线程TID和pthread_t“线程ID”

    在 Linux 上 线程由pthread t或 TID 我正在寻找这两种线程 id 之间的桥梁 given a pthread t我可以得到它吗TID 显然 https stackoverflow com questions 558469
  • 查看用户最近执行的Android任务

    我想查看我的 Android 手机最近的任务 我尝试了一些来自互联网的代码 但没有一个能正常工作 我只想获取用户最后执行的应用程序的PID和名称 例如 如果我执行计算器应用程序 然后执行我创建的最近任务应用程序 则该应用程序应该能够告诉我类
  • 如何在bash中列出所有后台pid

    要么我无法正确表达我的搜索 要么答案不容易找到 但我正在尝试找出如何列出我的所有后台任务 PID 例如 到目前为止 我发现要列出我们使用的最后一个 PID 但现在我想列出之前任务的 PID 如果存在 但我找不到如何做到这一点 最终我想列出我

随机推荐