PID(微分)的实现


8

我正在实现PID控制器以进行电动机速度控制。我已经实现了PI控件,并且对我来说效果很好。在规范中,我被告知要通过对D部分使用以下公式来实现过滤技术:

在此处输入图片说明

现在,到目前为止,我所理解的是通常s代表"dx/dt"与误差变化率相对应的代表,但是在这里,我可以将其与反馈变化率联系起来。Td/N用于限制整体增益输出(希望我做对了)。现在用C代码来表示,我尝试了以下方法:

        s = (CurrentFeedback()-Old_Feedback)*100/(MaxFeedback()); //to calculate the % change in feedback
        s = s*1000/sampleTime;      //1000 is multiplied because sampleTime is in milliseconds
        D = (Td*s)/(1+(s*Td/N));
        D = D*KP;   //Kp is multiplied as per the standard pid equation.

        Old_Feedback = CurrentFeedback();
        PID = P+I-D;

好吧,加上D的结果不是我所预期的。我只想知道我是否正确实现了D部分方程式?在我对微分的基本数学的理解上是否犯了任何错误?

注意:我不能随意更改重新计算kp,ti,td,因为它直接来自VFD。


尝试Embedded.com/design/prototyping-and-development/4211211/…,“没有博士学位的PID”。关于派生实现有一个明确的部分。
斯科特·塞德曼

2
当您声明Old_Feedback = CurrentFeedback()错误时。您保留使用CurrentFeedback()读取值并将其存储在temp中。变量CurrentFeedback_tmp,然后在该ISR中的任何地方都使用该值,因为每次调用fct CurrentFeedback()时,它都会检索实际值,每次调用该值都会有所不同。
MarkoBuršič2015年

“加D的结果不是我预测的结果”-您预测了什么?他们为什么不同?
2015年

这里有很大的可能发生整数溢出。涉及变量的类型是什么,您是否考虑过它们的最大值?
伦丁2015年

s,D为S32,KP,Td和N U16。采样时间为U32,我认为是根据特定数据类型可能的最大值来确定变量的最大值。
spp

Answers:


1

我有3点要分享:

1-我将告诉您为什么人们会迷惑D项的正负项,PID = P + I + D但D = kd *(错误-旧错误),并且在位置控制中,如果您接近设定点,则始终会出现olderror <错误,因此D项将为负,从而减少输出并防止过冲。

2-关于时间,请勿分割或使用时间。由于您使用的是嵌入式微控制器,因此只需设置一个时间常数,然后从所有等式中将其取消:例如,使用计时器中断生成1ms的时间常数,然后在内部调用函数。

3-为什么要使用PID进行速度控制,所以速度控制中PI的90%的时间就足够了,因为这里的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.