1

有没有人知道如何将前馈运算放大器 PID 循环转换为 C 代码?我正在尝试进行这样的转换,老实说,不知道从哪里开始。我可以通过 ADC 获得所有输入值、电压、电流等,但编码前馈 PID 对我来说有点新鲜。有任何想法吗?

4

2 回答 2

1

电路

似乎您要使用 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.

我强烈建议您使用此来源的电路进行学习。 : PID控制器的完整电路图

尽管设置起来有点乏味,但在数学上分析起来要简单得多,因为您可以直接将其与标准数学形式而不是理想形式联系起来。

最后,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 >>> 单循环的代码执行时间(远大于)。在这种情况下,我们可以取消计时器并使用延迟功能。

于 2013-02-06T19:40:20.347 回答
1

您正在谈论用软件替换非线性控制系统的硬件。我认为您唯一的希望是编写硬件模拟。

我对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/

于 2012-11-15T19:46:04.000 回答