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

km0tfn4u  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(119)

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

fnx2tebb

fnx2tebb1#

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


的数据

wnavrhmk

wnavrhmk2#

对于数字控制系统,需要在每个采样时刻进行数据采样并执行控制器。z变换将连续系统转换为离散系统。
例如,如果采样时间为“1”,则可以如下所示表示简单的时间序列模型,
y(t)= a1u(t-1)+ a2u(t-2)
--> y(t)= a1z^-1u(t)+ a2z^-2u(t)
y(t)= A(z)u(t),其中A(z)= a1z^-1 + a2z^-2
a1,a2 = FIR系数
但是,这个时移运算符'z^-1'并没有出现在你的代码中。它是用你的采样时间和FOR或DO循环隐式表达的,具体取决于你使用的语言。请参阅PID控制器的velocity形式的python代码。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

lnvxswe2

lnvxswe23#

基本上,你应该把值发送到某个地方。阅读注解,你想及时绘制输出变量的图,所以我想你最好的选择(也是更简单的方法)是使用gnuplot
基本上,在文本文件中输出数据,然后使用gnuplot显示它。

erhoui1w

erhoui1w4#

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

相关问题