Z转换派生的PID实现的优点是什么?


29

我已经看过许多PID文章,例如this,它们使用通用PID方程的Z变换来导出一些疯狂的差分方程,然后可以在软件(或本例中为FPGA)中实现该方程。我的问题是,与没有博士学位的传统且直观得多的PID相比,这种实现有什么优势?类型实现?第二个似乎更易于理解和实施。P项是直接乘法,积分使用运行总和,并且通过从当前样本中减去前一个样本来估计导数。如果您需要添加诸如积分饱和保护之类的功能,那么它就是直接代数。尝试将Integral Windup保护或其他功能添加到差异类型算法中,例如上面的链接,似乎要复杂得多。除了“我是一个喜欢做有趣的Z变换的坏家伙”类型的吹牛权利外,是否有其他理由使用这种实现?

编辑:没有链接我的PHD文章的PID是更简单实现的一个示例,该实现使用整数总和的连续求和和连续项之间的差作为导数。它可以确定性地通过定点数学实现,并且可以根据需要在计算中包括实时常数信息。我基本上是在寻找Z变换方法的实际优势。我看不出它怎么可能更快,或者使用更少的资源。Z方法似乎不使用积分的总和,而是使用先前的输出并减去先前的P和D分量(通过计算得出积分和)。因此,除非有人可以指出我所缺少的内容,否则我将接受AngryEE的评论,即它们本质上是相同的。

最终编辑:感谢您的答复。我认为我对每个方面都学到了一些知识,但是最后,认为《愤怒》是正确的,因为这只是个人喜好。两种形式:

ëķ-2=È

uk=üķ-1个+ķpËķ-Ëķ-1个+ķ一世Ť一世Ëķ+ķdŤ一世Ëķ-2Ëķ-1个+Ëķ-2
u k - 1 = u k
Ëķ-2=Ëķ-1个Ëķ-1个=Ëķ
üķ-1个=üķ

要么

ü ķ = ķ p È ķ + ķ Ť · 总结 +

=+Ëķ
ëķ-1=Èķ
u(k)=Kpe(k)+KiTisum+KdT一世Ëķ-Ëķ-1个
Ëķ-1个=Ëķ

评估结果基本相同。有人提到第一个可以更快地在DSP或FPGA中实现,但是我不买。都可以向量化。第一个需要两个后期操作,第二个需要一个后期操作和一个后期操作,因此看起来很均匀。第一个在实际计算中还需要再增加1次。


您是说“微分方程”吗?
凯文·维米尔

至少根据我的反馈,我一定误会了您的评论。我将删除我的评论!
Kortuk'3

1
请移至dsp.stackexchange.com
Jason S

Answers:


7

您会被Z变换的所有奇特功能迷住了。两种方法基本相同-没有PHD方法的PID仅具有较少的下标。它们执行相同的基本功能并使用相同的基本数学。

我看到的两者之间的唯一主要区别是,没有PHD的PID并未考虑采样时间。对于做任何可能不稳定的事情,采样时间是一个非常重要的考虑因素。在这种情况下,Z变换方法的好处是您不能在不考虑采样时间的情况下使用它-它迫使您展示工作并帮助您设计更稳定的系统。

看起来您发现实施Z变换方法的案例研究被设计为具有高度确定性。这解释了他们使用FPGA的原因-计算将始终花费相同的时间。没有执行PHD的PID绝对不是确定性的。使用双精度变量代替定点实现肯定会在任何不带浮点单元的微控制器上(以及可能在带有FPU的uC上)引起不确定性行为。与不带PID的PID相比,该案例研究正在研究完全不同的复杂度。

因此,从根本上讲,数学和控制方法是相同的,但案例研究/ Z变换方法更为严格,并且从理论上讲是扎根的。不带PHD的PID仅适用于相对稳定的非常简单,非时间紧迫的系统。


没有PHD文章的PID只是更简单实现的一个示例,它对整数使用运行总和,对导数使用连续样本之间的差。该文章指出采样时间应该是一致的。采样时间可以轻松地添加到I和D计算中,但是在大多数情况下,实际计算中并没有完成。控制器的GUI(或其他接口)将根据循环时间以秒为单位向用户显示I和D项。
bt2

@ bt2听起来像您有一个非常特殊的情况,其中带w / oa PhD的PID是最好的方法。大多数系统都没有以任何方式显示I和D项。PID控制器的结果是对整个系统进行了一些更改,然后又将其自身环回。如果您只是向用户显示,那么实际上没有任何理由担心稳定性。
Kellenjb '01

“不带PHD的PID只能非常简单地工作,”-我不同意。您绝对可以使用Z变换分析来优化数字控制系统,但另一方面,您可以陷入系统建模的困境,以至于您错失了森林。
詹森·S

10

设计PID控制器的Z变换方法最终将产生更有效的实现。如果您要为您的应用设计最小的FPGA / DSP /微控制器,这至关重要。

提到的“不带PHD的PID”可能是在软件中实现PID控制的最简单方法,但是在更高的采样率下变得很麻烦。

此外,Z变换更适合在离散(数字)域中进行设计。传统的(拉普拉斯变换)设计方法更多地用于连续时间。两者之间有多种转换方式(零阶保持,线性插值,极点放置,双线性/ Tustin),每种方式都具有其在系统稳定性和系统响应方面的优缺点。通常,在离散域中进行整个设计会更容易。

长话短说,如果您使用的是相对“慢”的系统(所有主要行为都在100kHz左右的频率下发生),那么第一个设计可能就很好了。您可以在微控制器或PC上实现它并完成它。随着系统变得越来越快,您可能必须使用Z变换方法来获得所需的速度(本文提到9.5MHz,前提是您拥有可以保持同步的A / D和DAC)。


1
相同数量的数学运算,不同的数字表示形式。与案例研究中使用的定点方法相比,双精度数表示数字要复杂得多。不太复杂意味着更少的操作(在硅片上)。
AngryEE 2011年

2
@ bt2,在为SIMD(单指令,多数据)指令集设置DSP芯片的意义上,我想说效率更高。尽管它具有相同数量的数学运算,但是Z转换允许您在一个指令周期内完成所有乘法运算,然后在一个周期内对所得向量的所有元素求和(取决于平台)。因此,尽管数学原理相同,但时间复杂度却大大降低,从而提高了速度。
mjcarroll

1
@ bt2 z形式适合作为差分方程实现,该方程仅取决于过去的输出和当前输入,而无需运行总和,该总和有时会上溢(或下溢)。DSP被设计为允许通过差分方程方法有效实现数字滤波器。参见en.wikipedia.org/wiki/Digital_filter esp。直接形式-这就是DSP的优化目标。
freespace

1
我认为您缺少某些东西。在正常情况下,运行总和永远不会溢出。IIR滤波器不会总是饱和,对于PID控制,通常情况并非如此。用一种算法会说,但不会用另一种算法说是错误的。行驶总和同样基于先前的输出。如果一个导致溢出,它们都会。以这种方式思考,第二次植入是第一次,具有一些数学因素... u(k-1)-kp(e(k-1)-kd / Ti(e(k-1)-e( k-2)==(运行总和)
bt2

1
-1:Z变换不能为您提供更有效的实现。实际上,如果将使用“朴素”数字方法的1极点低通滤波器与使用双线性变换的1极点低通滤波器进行比较,则使用这种方法的效率会稍差一些。不管过滤器的推导如何,相同数量的状态变量=大约相同的实现效率。在很大程度上,这是与滤波器设计方式无关的数量。
詹森·S

5

根据我的经验,这是交易:

  • Z变换有助于进行某些分析:离散时间采样系统的理论最好通过Z变换建模。
  • PID控制器或低通滤波器的设计既可以通过Z变换也可以通过经典分析来完成,可以使用几种近似值之一来将导数/积分从连续时间转换为离散时间。如果零点和零点的频率与采样率相比较低,则没关系。坚持使用您最自信的方法。
  • 滤波器和控制器的Z变换推导通常会掩盖那些滤波器和控制器的参数的物理含义。如果我有一个具有积分增益,比例增益和微分增益的PID回路,则我知道每个参数都直接起作用。如果我使用Z变换,它们只是我必须以某种方式得出的数字。
  • 过滤器和控制器的实现可能会或可能不会掩盖那些过滤器和控制器的参数的物理含义。这种质量在很大程度上与先前的观点无关:如果我具有基于Z变换的设计,则可以将其转换为经典外观的实现,反之亦然。在FINAL EDIT下的示例很好,因为第二种实现将积分器(“ sum”)保留在其自己的状态变量中。该状态变量具有含义。第一个实现将状态变量保留为错误的历史记录;虽然有意义,但我认为它提供的见解较少。

最后,还有其他涉及非线性或分析的问题,这些问题通常使您选择一种实现而不是另一种实现(对我而言,这始终是控制器的经典方法,对于FIR滤波器而言,它是Z变换,对于1极或2极IIR滤波器而言,通常是经典方法):

  • 对于控制器,我始终将积分器作为状态变量,而不是过去的错误样本。原因是实际系统通常需要抗饱和,您必须限制积分的正负。(如果您是在定点实现的,则无论如何都必须这样做,因为遇到溢出时的环绕条件会对控制循环的行为造成不良影响)

  • 出于同样的原因,我也总是以输出相关的方式计算积分器:例如sum += Ki*error; out = stuff + sum而不是sum += error; out = stuff + Ki*sum。使用第二种方法,如果您更改增益Ki,则可以上下缩放积分器对输出的影响,这可能不是您想要的,并且极限会根据增益而变化。如果在积分之前将误差乘以Ki,则积分器的单位与控制回路输出的单位相同,并且具有更明显的物理意义。

(更新:我已经写了一篇关于该主题的博客文章。)


4

编辑

使用Z变换可以更轻松地组合和简化LTI系统进行分析。例如,具有传递函数H1,H2,...,Hk的k个LTI系统的级联系列将作为一个简单的产品组合H = H1*H2*...*Hk。同样,负反馈回路的传递函数为T = G/(1 + G*H),其中H在反馈路径上。一旦有了整体传递函数,就可以分析稳定性(极点位置)和性能(瞬态,稳态误差),并添加其他滤波器和反馈来优化设计。

对于高阶子系统,您可以对系统功能进行分区,并将其实现为一系列级联的双二阶(即,通过成对的零点和极点,例如复共轭或重复的根),从而减少了量化引起的不稳定性。典型形式的二元方程:

双二段


您的回答听起来令人印象深刻,但我几乎不知道您说什么。例如,什么是量化稳定性?方程的一种形式比另一种形式优越吗?
bt2

1
传递函数H(z)是有理函数B(z)/ A(z)。对于第N阶系统,z中的每个多项式都是N个零的因数。分母中的A(z)的零称为极点(这是反馈路径)。对于恒定的比例因子,线性时不变(LTI)系统由其零点和极点描述。
Eryk Sun

1
如果离散时间LTI系统的所有极都在z平面的单位圆内,则它是稳定的。但是,具有有限数字精度的量化会引入噪声,这些噪声会导致系统随着时间的流逝略微稳定,不稳定或不稳定。通过将H(z)分解为乘积二次方程(biquads),可以将这种误差最小化。
Eryk Sun

2
双二元数是首选的最小分区,因为具有实系数的多项式的零是实数或成对的复共轭。双二阶B(z)/ A(z)为(b0 + b1z ^ -1 + b2z ^ -2)/(a0 + a1z ^ -1 + a2z ^ -2)。
Eryk Sun

我添加并删除了一个量化噪声示例,该示例将级联的二次方与直接的4阶多边形进行了比较。但这太多了。我要睡觉了 抱歉,tyblu。
Eryk Sun

3

PID控制器的难点不是代码本身。这些问题实际上是在尝试优化控制器时出现的。当然,您可以进行反复试验并获得一个不错的控制器,但是某些系统过于复杂,以至于反复试验方法难以执行。这些相同的系统往往需要一个非常好的控制器,而不仅仅是一个体面的控制器。在这种情况下,Z变换更容易分析。

要考虑的另一件事是系统的稳定性。您可能正在处理一个很难变得不稳定的系统,即使这样做也不会造成任何伤害。但是,如果控制器使控制器变得不稳定,则许多系统可能会导致灾难性的后果。Z变换是另一个地方,它很容易识别是否存在任何问题。

还有1个最后的音符。在分析整个系统时,您将必须获得系统中所有组件的方程式。当然,您可以从带有w / oa PhD的PID中获取它,但是如果您已经在Z变换方法中使用它,那么来回的工作就少得多。

现在,根据个人喜好,我始终使用不带PhD方法的PID。这仅仅是因为我只是将微控制器与不完全依赖控制器的系统一起使用。


2

Z变换形式具有更高的实用性有几点。

询问任何提倡基于时间/简单/ sans-PHD方法的人,他们的Kd项设置如何。他们可能会回答“零”,他们可能会说D是不稳定的(没有低通滤波器)。在我了解所有这些如何结合之前,我会并且确实会说这样的话。

在时域中调整Kd很困难。当您看到传递函数(PID子系统的Z变换)时,您可以轻松地看到它的稳定性。您还可以轻松了解D项相对于其他参数如何影响控制器。如果您的Kd参数为z多项式系数贡献了0.00001,但是您的Ki项为10.5,则您的D项太小,无法对系统产生实际影响。您还可以查看Kp和Ki条款之间的平衡。

DSP旨在计算有限差分方程(FDE)。它们具有可将系数相乘,求和到累加器并在一个指令周期内将值移入缓冲区的操作码。这利用了FDE的并行特性。如果机器缺少此操作码...则不是DSP。嵌入式PowerPC(MPC)具有专用于计算FDE的外围设备(它们称为抽取单元)。DSP被设计为计算FDE,因为将传递函数转换为FDE很简单。16位的动态范围不足以轻松量化系数。因此,许多早期的DSP实际上都有24位字(我相信今天32位字很普遍。)

IIRC,即所谓的双线性变换,采用传递函数(时域控制器的z变换)并将其转换为FDE。证明它是“困难的”,用它来获得结果是微不足道的-您只需要扩展形式(将所有内容相乘),多项式系数就是FDE系数。

PI控制器不是一个好方法-更好的方法是建立一个系统行为模型并使用PID进行纠错。该模型应该简单,并基于您正在做的基本物理学。这是进入控制块的前馈。然后,PID块使用受控制系统的反馈来纠正错误。

如果将标准化值[-1 .. 1]或[0 ... 1]用于设定点(参考值),反馈和前馈,则可以在其中实现一个2极2零算法优化的DSP组件,您可以使用它来实现任何二阶滤波器,包括PID和最基本的低通(或高通)滤波器。这就是为什么DSP的操作码会假定归一化的值,例如,一个操作码会输出该范围的反平方根的估计值(0..1]您可以串联两个2p2z滤波器并创建一个4p4z滤波器,您可以利用2p2z DSP代码来实现4抽头低通巴特沃斯滤波器。

大多数时域实现将dt项烘焙到PID参数(Kp / Ki / Kd)中。大多数z域实现都没有。将dt放入采用Kp,Ki和Kd的方程式中,并将它们转换为a []和b []系数,因此您现在对PID控制器的校准(调整)与控制速率无关。您可以使其运行速度提高十倍,启动a []和b []数学,PID控制器将具有一致的性能。

使用FDE的自然结果是该算法隐式地“无毛刺”。您可以在运行时即时更改增益(Kp / Ki / Kd),并且表现良好-取决于时域实现,这可能很糟糕。

通常要在时域PID控制器上花费很多精力,以防止出现积分缠绕。FDE格式有一个简单的技巧,可以使PID表现良好,您可以将其值限制在历史缓冲区中。我还没有做过数学运算来了解它如何影响滤波器的行为(关于Kp / Ki / Kd参数),但经验结果是它是“平滑的”。这是在利用FDE形式的“无干扰”性质。前馈模型有助于防止整体缠绕,并且使用D项有助于平衡I项。PID确实不能按照预期的那样获得D增益。(回转设定点是防止过度缠绕的另一个关键功能。)

最后,Z变换是本科课程的主题,而不是“博士学位”。您应该已经在复杂分析中了解了所有这些知识。在这里,您所上的大学,您所拥有的老师以及您在学习数学和学习如何使用可用工具上所付出的努力会极大地改变您在行业中的表现能力。(我的复杂分析课太可怕了。)

事实行业工具是Simulink(缺少计算机代数系统CAS,因此您需要另一个工具来计算一般方程式)。MathCAD或wxMaxima是可以在PC上使用的符号求解器,我了解了如何使用TI-92计算器来实现。我认为TI-89也具有CAS系统。

您可以在Wikipedia上查找PID和低通滤波器的z域或laplace域方程。这里有一个步骤,我不理解,我相信您需要PID控制器的离散时域形式,然后需要对其进行z变换。拉普拉斯变换应该与z变换非常相似,并以PID {s} = Kp + Ki / s + Kd·s的形式给出。Dt是delta-t [ime],我使用Dt是为了避免将此常数与派生词'dt'混淆。

b[0] = Kp + (Ki*Dt/2) + (Kd/Dt)
b[1] = (Ki*Dt/2) - Kp - (2*Kd/Dt)
b[2] = Kd/Dt

a[1] = -1
a[2] = 0

这是2p2z FDE:

y[n] = b[0]·x[n] + b[1]·x[n-1] + b[2]·x[n-2] - a[1]·y[n-1] - a[2]·y[n-2]

DSP通常只有一个乘加运算(而不是乘加运算),因此您可能会看到求和运算被推到a []系数中。添加更多的b可获得更多的极点,添加更多的a可获得更多的零。


1

通常,最好使用Z变换方法,因为这样做可以保留等效模拟系统的确切行为。有许多众所周知的调优方法,例如Ziegler-Nichols,它们已在模拟领域发挥作用。如果使用Z变换方法,则在数学上会有严格的期望,即对于给定的增益,所得的控制器将对P,I和D增益的相同值执行相同的操作,这将在模拟域中执行。另外,您可以为系统绘制离散的根轨迹,并预测给定增益集的稳定性,如果直接在代码中创建临时控制器则无法做到。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.