C ++中的PID控制器和传递函数

时间:2018-04-25 08:19:22

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

我有一个PID控制器在simulink中工作,但我想把它传递给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 个答案:

答案 0 :(得分:1)

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

Test PID Control

答案 1 :(得分:0)

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

祝你好运!

答案 2 :(得分:0)

对于数字控制系统,您需要采样数据并在每个采样时间执行控制器。 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循环隐式表示。 请参阅Python代码以了解PID控制器的速度形式。 Velocity表单更容易实现,因为您不必担心防重置缠绕的附加逻辑。

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 :(得分:0)

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

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