我正在实现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”。关于派生实现有一个明确的部分。
—
斯科特·塞德曼
当您声明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