有没有人知道如何将前馈运算放大器 PID 循环转换为 C 代码?我正在尝试进行这样的转换,老实说,不知道从哪里开始。我可以通过 ADC 获得所有输入值、电压、电流等,但编码前馈 PID 对我来说有点新鲜。有任何想法吗?
2 回答
电路
似乎您要使用 C 模拟的模拟电路看起来像这样
Ci
|------| |--------------|
| Rp |
|----/\/\/\/\-----------|
| Rd Cd |
Rf |----/\/\/\---| |-------|
Vin o----/\/\/\---| |
| |\ |
| | \ |
|----|- \ |
| \ |
| \-------------|---------o Vout
| /
| /
|+ /
----| /
| |/
|
|
___|___ GND
_____
___
_
LEGEND:
Vin is the input signal.
Vout is the Output.
Rp controls the propotional term ( P in PID)
Ci controls the Integral term ( I in PID)
Rd and Cd controls the differential term ( D in PID)
Rf is the gain control, which is common to all of the above controllers.
我强烈建议您使用此来源的电路进行学习。
尽管设置起来有点乏味,但在数学上分析起来要简单得多,因为您可以直接将其与标准数学形式而不是理想形式联系起来。
最后,Vout 用于控制电机或任何需要控制的东西。Vin 是过程变量电压。
在C(海?)中弄湿你的脚之前
我假设您正在从某种模数转换器读取信号。如果不是,那么您将不得不将信号模拟为输入。
如果使用标准形式,我们有,
假设循环运行时间足够小(一个缓慢的过程),我们可以使用以下函数来计算输出,
PIDoutput = Kp * err + (Ki * int * dt) + (Kd * der /dt);
在哪里
Kp = Proptional Constant.
Ki = Integral Constant.
Kd = Derivative Constant.
err = Expected Output - Actual Output ie. error;
int = int from previous loop + err; ( i.e. integral error )
der = err - err from previous loop; ( i.e. differential error)
dt = execution time of loop.
最初的“der”和“int”为零。如果您在代码中使用延迟函数将循环频率调整为 1 KHz,那么您的 dt 将为 0.001 秒。
现在前馈系统的输出将是,
FeedForwardOutput = Kf * Vin;
其中 Kf = 前馈系统的比例常数。
因此,我们带有 PID 控制器的前馈系统的总输出将是,
Output = FeedForwardOutput + PIDoutput;
检查此链接以进一步了解带有 PID 控制器的前馈系统。
用 C 绘图
我在 C 中找到了这个出色的 PID 代码,虽然它没有涵盖它的所有方面,但它仍然是一个很好的代码。
//get value of setpoint from user
while(1){
// reset Timer
// write code to escape loop on receiving a keyboard interrupt.
// read the value of Vin from ADC ( Analogue to digital converter).
// Calculate the output using the formula discussed previously.
// Apply the calculated outpout to DAC ( digital to analogue converter).
// wait till the Timer reach 'dt' seconds.
}
如果我们采用一个缓慢的过程,那么我们可以使用较低的频率,这样 dt >>> 单循环的代码执行时间(远大于)。在这种情况下,我们可以取消计时器并使用延迟功能。
您正在谈论用软件替换非线性控制系统的硬件。我认为您唯一的希望是编写硬件模拟。
我对PID一无所知,但快速谷歌搜索发现了这一点:
http://www.cds.caltech.edu/~murray/books/AM05/pdf/am06-pid_16Sep06.pdf
它具有描述理想 PID 控制系统的方程和图表。您可以从编写实现这些方程式的代码开始。
在我考虑了你的问题之后,在我看来这可能是一个普遍的问题。我在 Google 上搜索了“离散 PID 控制器仿真”,并找到了 Simulink、Matlab 和 Python 的答案,以及更多参考书籍。
您可能想从 Python 配方开始。Python 比 C 更容易和更快,如果你使用 SciPy,你可以绘制你的结果并确保你得到你想要的数字。一旦你让它在 Python 中工作,然后在需要时移植到 C。
http://code.activestate.com/recipes/577231-discrete-pid-controller/