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

问题描述 投票:1回答:3

我有一个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 ++?怎么样?

c++ transfer-function pid-controller
3个回答
0
投票

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

祝好运!


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循环一起隐式表示,具体取决于您使用的语言。请参阅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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.