pid是滞后超前校正_PID控制器、超前校正网络等经典传递函数的C语言实现

前面发了一个视频,主要讲如何通过系统辨识来得到系统的传递函数,接着通过仿真,用仿真出来的控制器参数,来指导实际的控制器调节。

但这里实际上有一个问题,就是我们理论上的PID控制器、或者各种校正网络:超前校正网络、滞后校正网络等等,或者书上常讲的什么一阶惯性环节,到底怎么在C语言上实现?

我自己本科在学控制的时候,就经常有一个问题,就是老师讲的这些理论,我到底怎么用在我的智能车、机器人上呢?

这篇文章就是为了解决这个问题。

PID控制器

我们先来看PID控制器,PID控制器的传递函数为:

tex?formula=%5Cfrac%7BOut(s)%7D%7BErr(s)%7D%3DK_ps%2B%20%5Cfrac%7BK_i%7D%7Bs%7D%2B%20K_ds

为了等下方便变成微分方程,我们先稍微变形一下:

tex?formula=Out(s)%3DErr(s)K_ps%2BErr(s)%20%5Cfrac%7BK_i%7D%7Bs%7D%2B%20Err(s)K_ds

好了,现在变成微分方程(实际上就是变回时域):

tex?formula=Out(t)%3DErr(t)K_p%2B%5Cint%7BErr(t)K_idt%7D%20%2B%20K_d%5Cfrac%7BdErr(t)%7D%7Bdt%7D%0A

考虑到这是理论上的连续系统,实际上我们在C语言只能是离散系统,因此继续变成差分方程:

tex?formula=Out(nT)%3DErr(nT)K_p%2BK_i%5Csum_%7B0%7D%5E%7Bn%7DTErr(nT)%20%2B%20K_d%5Cfrac%7BErr(nT)-Err%5B(n-1)T%5D%7D%7BT%7D

需要注意,一定不要漏掉I项和D项的T。这个T是程序实现差分方程的采样时间,也就是多久调用一次这个函数。比如PID控制是5ms控制一次,那么这个T就是

tex?formula=%5Cfrac%7B1%7D%7B5ms%7D。网上很多推导,推导最后漏掉了这两个T,虽然说这样也能调出合适的参数,只是这样调出来的Ki和Kd与理论值会差一个T倍的系数,因此为了能把理论值直接用上,这个T不要漏掉。包括之后所有的差分方程,都有一个T。

好了,有了差分方程,我们就可以在C上实现了。

超前校正网络

好了,接下来我们再推一个超前校正网络,传递函数是:

tex?formula=%5Cfrac%7BOut(s)%7D%7BIn(s)%20%7D%3D%20%5Cfrac%7B1%2Ba%5Ctau%20s%7D%7Ba(1%2B%5Ctau%20s)%7D

同样变形:

tex?formula=Out(s)a(1%2B%5Ctau%20s)%3D%20(1%2Ba%5Ctau%20s)In(s)%0A%0A

微分方程:

tex?formula=a(Out(t)%2B%5Ctau%20%5Cfrac%7BdOut(t)%7D%7Bdt%7D)%3D%20In(t)%2Ba%5Ctau%20%5Cfrac%7BdIn(t)%7D%7Bdt%7D

差分方程:

tex?formula=a(Out(t)%2B%5Ctau%20%5Cfrac%7BOut(nT)-Out%5B(n-1)T%5D%7D%7BT%7D)%3D%20In(t)%2Ba%5Ctau%20%5Cfrac%7BIn(nT)-In%5B(n-1)T%5D%7D%7BT%7D%0A%0A

好了,下面是C语言实现:

一阶惯性环节

这个就不再推到了,反正原理差不多,都是先列出传递函数,变成微分方程,然后变成差分方程。

传递函数:

tex?formula=%5Cfrac%7Ba%7D%7Bs%2Ba%7D

实现:


版权声明:本文为weixin_35765731原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。