PID控制(带代码),验证和调度

PID控制器都是控制领域的主力。PID控制器的目标是在系统中出现一些错误并将其减少到0.虽然还有许多其他控制策略,PID可能是最常见的(除非你计算人工控制),只是设置一个设定值。有许多先进的控制策略,但在大多数情况下,它们会比PID更相似或更差,并且要复杂得多。当其他方法做得更好时,通常只会少量。一个例外是如果你有一个设备模型及其操作条件,你可以创建一个前馈控制器(对博士生有好处),表现更好。然而,在许多情况下,使用带PID的反应控制是最简单,最快速的实现方法。
当我们谈论PID控制时,您应该记住每个字母代表控制器的不同模式。P表示比例元素,I表示积分元素,D表示微分元素。每个元素都有一个“term”,它与这些元素相乘。我们使用k是一个通用的恒定值,所以常数项(或收益)为K P,K ,和K d分别。根据您的申请,您可能会或可能不会拥有所有这三个条款。在许多应用程序中,您将只有PD或PI术语。
所以基本的问题是:如何在系统中转换错误以形成更好的新命令?
PID方程单击图像可查看更清晰/更大版本的方程式。
PID控制器有很多种形式。但这是大多数人都会关心的两个:
注意:e和e(t)是误差项,定义如下:e = desired_value - actual_value。通常,actual_value来自某个传感器,您必须检测当前值。
第一个是连续时间:


output(t)= \\(K_ {P} * e(t))+(K_ {I} * \ int_ {0} ^ {t} e(t)d_ {t})+(K_ {D} * \ frac {\ mathrm {d}} {\ mathrm {d} t} e(t))+偏见

第二个是离散时间,这是计算机控制应用中更常用的:

output = \\(K_ {P} * e)+(K_ {I} *(K_ {I} \ _ _ previous + e * iteration \ _time))+(K_ {D} * \ frac {e  -  e \ _prior} {iteration \ _time})+偏见

以下是PID控制器的离散版本的一些伪代码:
error_prior = 0 
integral = 0 
P =你需要出现的一些值(见下面的调整部分)
I =你需要出现的一些值(参见下面的调整部分)
D =你需要出现一些值(见下面的调整部分)
while(1){ 
    error = desired_value - actual_value 
    integral = integral +(error * iteration_time)
    derivative =(error - error_prior)/ iteration_time 
    output = K P * error + K I * integral + K D * derivative + bias 
    error_prior = error 
    sleep (iteration_time)
}
从实现的角度来看,离散方法更有用。在理解和调整控制器时,持续的方法对您来说很重要。
另外,虽然你通常没有看到偏置项被添加到过滤器中,但我喜欢把它放在以防万一其他总和为0我将不会有0作为输出。这不是严格需要的,但在很多情况下都很好。偏差项通常是一个小值(<1)。

条款

所以现在我们知道这个控制器的形式,我们可以看看每个术语的作用。

比例期限(K P

比例项是控制错误的主要术语。这会直接缩放您的错误,因此使用较小的K P时,控制器将进行较小的尝试以最小化错误,并且使用较大的K P,控制器将进行较大的尝试。如果K P太小,您可能永远不会最小化错误(除非您使用D和I术语)并且无法响应影响系统的更改,并且如果K P太大,您可能会出现不稳定(即。奇怪的振荡)过滤器严重超过所需的值。

积分项(K I

积分项使控制器能够处理随时间累积的错误。当您需要处理错误稳态错误时,这很好。问题是,如果你有一个大的K 我,你试图纠正错误随着时间的推移,所以它可能会干扰你的响应,以处理当前的变化。该术语通常是PID控制器不稳定的原因。

衍生术语(K D

衍生术语是关注系统在时间间隔之间的表现。这有助于抑制系统以提高稳定性。许多电机控制器只允许您配置PI控制器。

我需要哪种P,I和D的排列?

在许多应用程序中,您不会使用所有3个术语。那么为什么不总是使用所有3个术语呢?您使用的术语越少,控制器就越容易理解和实现。此外,您很快就会看到一些模式可能会导致控件不稳定(例如极端振动)。
几乎每个过滤器都有P项。所以我们假设K P在我们的过滤器中。现在问题是我想在我的过滤器中添加I,D,或两者。
如果你想要,你只能有一个P项。这是最简单的控制器类型,因为您只使用一个值。缺点是您的控制器不会因突然和持续的错误而平稳地纠正自己。
如果添加D项,您将更容易受到噪声和随机值的影响。因此,如果您有非常嘈杂的数据或传感器测量的随机脉冲,您可能希望将D项保留。将D术语排除在外的缺点是您没有响应那些可能合法的随机值,因此您的响应时间会变慢。这方面的一个例子是,如果您的电机撞到岩石,则需要更长的时间才能增加您的指令值,因为您没有看到错误随时间变化的情况。但是,如果您正在使用机器人手臂,则可能需要D术语,以便您可以快速响应不断变化的力量。
我的术语变得棘手。在许多情况下,您将需要I term,以便您可以从缓慢累积的错误中恢复。缺点是I术语的反应很慢。这种缓慢可能导致您的控制不稳定。

如何调整过滤器?

调整滤波器可能很困难,因为设备(比如电机)可能需要响应不同的条件。例如,如果您在没有负载的情况下调整电机,它可能无法在负载下达到最佳性能; 如果更改负载,则可能需要一组不同的值才能获得最佳控制。因此,您经常尝试找到一组在所有情况下都最佳的参数,并且对于任何给定的情况都不一定是最佳的。还有另一种方法,您可以在过滤器中使用不同的常量(K值),并根据系统中的实际值选择要使用的集合。
调整PID控制器的方法有很多种。我所知道的两种最好的方法是手动(我知道人们不喜欢依赖专家的手工制品)和Ziegler-Nichols方法。据说我发现通过手动调整系统可以获得更好的结果,但是你可以使用Ziegler-Nichols方法作为起点。(接下来的两个小节主要来自维基百科)。

手动调整

如果系统在线,则一种调整方法是首先将K I和K D值设置为零。增加K P直到环路输出振荡(或只是表现良好),然后K P应该设置为“四分之一振幅衰减”类型响应的该值的大约一半。然后增加K I,直到在足够的时间内校正任何偏移量。然而,过多的ķ 就会导致不稳定。最后,如果需要,增加K D,直到过冲最小化。但是,K D太多了将导致缓慢的反应和迟缓。快速PID回路调谐通常会略微超调以更快地达到设定点; 然而,一些系统不能接受过冲,在这种情况下需要过阻尼闭环系统,这将要求K P设置显着小于引起振荡的K P设置的一半。
PID手动调整

齐格勒 - 尼科尔斯

另一种启发式调整方法正式称为Ziegler-Nichols方法,由John G. Ziegler和Nathaniel B. Nichols在20世纪40年代引入。如在上面的方法中,首先将K I和K D增益设置为零。比例增益增加,直到达到最终增益K U,环路输出开始振荡。K U和振荡周期P U用于设置增益,如图所示:
PID Ziegler Nichols的价值观

验证控制参数

通过在应用步进命令时查看输出波形,可以验证所选增益是否良好。如果在运动开始时有很多初始振铃(不断变化)或过冲,那么你的增益可能会很高。如果初始命令慢慢达到所需输出,则可能需要增加增益。
电机调谐图图显示常见的调整问题,然后是良好的响应曲线。蓝线是命令,红线是实际的电机输出。
在上面的图像中,从左侧开始,我们可以看到:
1。输出运动过冲,当信号稳定到命令时会发出一点信号振铃。稍微超调通常很好,但我们确实尽量减少过冲,同时仍然有一个响应系统。
2.输出响应慢。我们可能希望更快的响应,因此系统将不那么迟缓。当您使系统变得迟钝时,通常会增加过冲和不稳定的可能性。
3.非常不稳定。从一堆振荡开始,接着是命令输出的大量尖峰。我们想避免这个!
最后这个最右边的情节看起来不错。电机输出直接位于指令运动的顶部,具有非常轻微的过冲(如果你看得很近)。
检查刚刚调整的系统稳定性的下一步可以是波德绘图。点击这里了解它

增益调度

简而言之,增益调度允许您根据系统的性能选择不同的术语集。因此,您可以说如果速度小于或等于某个值,则使用一组PID项,如果速度大于该值,则使用一组不同的PID项。这通常用于非线性系统,因此您可以将其简化为几个(几乎)线性部分。如果控制器的某个区域需要更具侵略性,这也很好。

我希望这是有用的,快乐的调整!

用户喜欢...