【问题标题】:PID controller and transfer function in C++C++中的PID控制器和传递函数
【发布时间】:2018-04-25 08:19:22
【问题描述】:

我有一个在 simulink 中工作的 PID 控制器,但我想将它传递给 C++ 代码。我找到了如何使用代码制作 PID,如下所示:

error = input - refeed;
iError += error * sampleTime;
dError = (error - lastError)/ sampleTime;
//PID Function
output = Kp * error + Ki * iError + Kd * dError;
refeed = output;
lastError = error;

但是,这是我在研究中得到的唯一明确的东西。

我需要知道下一步是什么,我已经离散化了传递函数,但我不确定我应该如何处理“z”参数、时间……

是否可以手动将 PID 控制器传递给 C++?怎么样?

【问题讨论】:

    标签: c++ transfer-function pid-controller


    【解决方案1】:

    Temperature Control Lab 将来自 Python 的 PID 输出传递到通过串行 USB 接口运行 C++ 代码的 Arduino。如果您可以为应用程序创建接口,则使用 Python 绘制值比使用 C++ 更容易。 GitHub源代码是here

    【讨论】:

    • 如果您需要添加离散时间传递函数模型来与 PID 响应进行比较,您可以使用时间序列模型,其中每个 z^-1、z^-2、z^-3 等是该变量后退的时间步数。 apmonitor.com/wiki/index.php/Apps/ARXTimeSeries
    【解决方案2】:

    对于数字控制系统,您需要在每个采样时间对数据进行采样并执行控制器。 z 变换将连续系统转换为离散系统。
    例如,如果您的采样时间为“1”,您可以如下表示一个简单的时间序列模型,

    y(t) = a1*u(t-1) + a2*u(t-2)
    --> y(t) = a1*z^-1*u(t) + a2*z^-2*u(t)
    --> y(t) = A(z)u(t),其中 A(z) = a1*z^-1 + a2*z^-2
    a1, a2 = FIR 系数

    但是,此时移运算符“z^-1”并未出现在您的代码中。它通过您的采样时间和 FOR 或 DO 循环隐式表达,具体取决于您使用的语言。 请参阅 PID 控制器速度形式的 python 代码。速度形式更容易实现,因为您不必担心防复位结束的额外逻辑。

    for i in range(1, ns):  #ns = simulation time
        # PID Velocity form
        e[i] = sp[i] - pv[i]
        P[i] = Kc * (e[i] - e[i-1])
        I[i] = Kc*delta_t/tauI * (e[i])
        D[i] = Kc*tauD/delta_t * (pv[i] - 2*(pv[i-1]) + pv[i-2])
        op[i] = op[i-1] + P[i] + I[i] + D[i]
        if op[i] < oplo or op[i] > ophi:
            # clip output
            op[i] = max(oplo,min(ophi,op[i]))
    

    您还可以在以下链接中找到使用 GEKKO 包的 PID 控制器示例。

    https://apmonitor.com/wiki/index.php/Main/GekkoPythonOptimization

    【讨论】:

      【解决方案3】:

      是的,这是可能的。你有没有考虑过使用别人的代码?还是你想自己写?如果您使用已经编写好的代码没有问题,请查看 Github。它有很多PID项目。例如PID-controller。它有一个使用示例,您只需传入您的 p、i 和 d 参数(您已经从 Matlab 获得)。

      祝你好运!

      【讨论】:

      • 我检查了您传递给我的链接,它与我的代码相似。但我想要的是输出图,当你用传递函数编译 PID 时,你可以在 Matlab 中获得输出图,这是随着时间的推移输出值的示例。但是感谢您的宝贵时间!
      • 当然没问题!我想你可以找到一个库来制作图表,对吧?我认为 Boost 有一个图形库,但我从未使用过它。
      【解决方案4】:

      基本上,您应该将值发送到某个地方。通读 cmets,您想及时绘制输出变量图,所以我想您最好的选择(也是更简单的方法)是使用 gnuplot

      基本上就是把数据输出到一个文本文件中,然后用gnuplot显示出来。

      【讨论】:

        猜你喜欢
        • 2021-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-03
        • 1970-01-01
        相关资源
        最近更新 更多