我有一个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 ++?怎么样?
答案 0 :(得分:1)
Temperature Control Lab将Python的PID输出传递给Arduino,该Arduino通过串行USB接口运行C ++代码。如果可以为应用程序创建接口,则使用Python绘制值比使用C ++更容易。 GitHub源代码为here。
答案 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进行显示。