1

我有一个在 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++?如何?

4

4 回答 4

2

温度控制实验室将来自 Python 的 PID 输出传递到通过串行 USB 接口运行 C++ 代码的 Arduino。如果您可以为应用程序创建接口,则使用 Python 绘制值比使用 C++ 更容易。GitHub 源代码在这里

测试PID控制

于 2019-11-04T02:16:24.257 回答
1

对于数字控制系统,您需要在每个采样时间对数据进行采样并执行控制器。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

于 2019-04-11T16:48:56.173 回答
0

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

祝你好运!

于 2018-04-25T08:49:21.807 回答
0

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

基本上,将数据输出到文本文件中,然后使用 gnuplot 显示它。

于 2019-04-11T16:57:25.247 回答