增量式PID的P和I怎么理解(三)

您所在的位置:网站首页 pid控制中p参数过大会怎样 增量式PID的P和I怎么理解(三)

增量式PID的P和I怎么理解(三)

2024-07-14 08:52| 来源: 网络整理| 查看: 265

新晋霸主篇之辉煌

增量式PID的P、I理解之应用篇

如果增量式PID是这样子的,我们要如何使用好它呢? 就一句话:P需要多大要根据公式——PWM限幅值==增域*P系数+开电机时的初始PWM来定。 其实,我们控制电机大部分电机都处于初始PWM=轮子当前转速的情况,毕竟,初始PWM≠轮子当前转速的情况只有在特殊情况(先开单片机运算PID,过一段时间后开电机)时才出现,常态是:电机的各种频繁变速都是在PWM=轮子转速下发生的。即轮子速度从200变到300,就是一个增域100,初始PWM为200的情况。此时,最好的P系数应该是根据公式8×100+200=999所得,P要取8。轮子从0转到100,10×100+0=999,最完美的P要为10。请看下图来证明我的说法(其中,绿线是设定值100,粉线是编码器测得的实际值。):

当P:10,I:0.15,增域:100时,图如下:

初始PWM=轮子的初始速度=0(初始PWM为0,轮子的初始速度为0)。 P:10,I:0.15,增域:100

P:10,I:0.15,增域:100

初始PWM=轮子的初始速度=200。 轮子这次是从200开始转,绿线为设定值从200变到300,粉线为实际的速度,跟踪情况如下图。根据公式可知:现在是10×100+200=1200>999,被限幅了,响应性的确比上面的图低。那么当P改为8怎如何呢?毕竟8×100+200=1000,它可是更接近限幅值999。 在这里插入图片描述

P:8,I:0.15,增域:100

初始PWM=轮子的初始速度=200。这次轮子同样是从200,开始转的,是带有初始PWM的,这次的响应性可比上面的图高,唯一变化的是P为8。 在这里插入图片描述

增量式PID的P、I理解之原由篇

至此,你的确会用增量式PID了,一手增量式PID调参更是使得出神入化,也知道了其中的机理(玄学问题由限幅造成)。

但是,为什么增量式PID的P、I会有这样的情况? 造成这一机理的原因又是什么? 机理的背后是否有站着一个更大的“boss”呢? 我觉得我研究的还不够深入,让我们牺牲掉所有的脑细胞,坠入更深的深渊(额叶的脑细胞,顶叶的脑细胞,小脑的脑细胞…,伸出你们的右手,把你们的生命贡献出来)!!! 为什么限幅值能造成这种问题呢??? ————不多bb————上图:纯P控制的图表(纯P指:I参数与D参数永远为0,我只给P参数)

P图(初始PWM为0)描述0.01设定值200,就是图里的绿色线,实际值一直为0轮子不转0.05轮子不转0.1P太小,轮子不转0.5在这里插入图片描述轮子终于转了,设定值200,轮子以20的速度在转1在这里插入图片描述轮子以80的速度在转,P的增大使控制力度越来越大了3在这里插入图片描述轮子转速达到了1404在这里插入图片描述160了5在这里插入图片描述依然是1607在这里插入图片描述竟然降低到了11010在这里插入图片描述这次转速只有80,可以100%的确定:P很大时转速在下降 。峰值和P=1一样,为80,但是明显不一样的是调节时间变短了15在这里插入图片描述上面绿线是设定值,现在粉线是设定值,因为这是后面又补充的图,转速为60,这次轮子的噪音很大20在这里插入图片描述转速大致为50,但是更抖,我应该称这是等幅振荡呢?还是静差太大?30在这里插入图片描述P大到30时,已经这幅鬼图了,轮子正转一下又反转一下,所以肉眼看到轮子在卡顿,根本没有转,是肉眼可见的静止

看到了吗?虽然难以置信,但这是真的,P在很小时(0.1)和很大时(10)响应性都会越来越低,当P是4~5时,响应性最高。也就是说,P竟然是个2次型的函数,这你敢信?但是,这是事实。

然后我们再做一个实验,纯I控制的图表:

I图(有/无初始PWM都一样)描述0.01在这里插入图片描述超调很严重,设定值是200,峰值能达到850,并且最后的稳态终值是150,静差达到了500.05在这里插入图片描述这次的峰值为680,看来超调量减小了,并且最后的稳态终值是200,这次静差已被消除0.1在这里插入图片描述峰值550,静差依然很小,但是现在的调节时间变的越来越长了0.3在这里插入图片描述峰值450,I为0.01时只震荡一下,现在振荡很多次才趋于稳定,超调量在减小,调节时间在增长0.5在这里插入图片描述超调量在减小,调节时间在增长1在这里插入图片描述等幅振荡,已经稳定不下来了3在这里插入图片描述依然等幅振荡,但振荡峰值在减小,振荡的频率在增大

I参数的确和我们已知的一样,I增大能减小静差,控制的力度在随着I增大,的确是书上说的那样。I增大,超调量在减小,调节时间在增长,妥妥的一次型函数关系。

不知大家是否注意到?我的纯P图表里面的图有意用括号说明是:初始PWM为0。 当满足公式P*增幅=限幅值时,曲线峰值取到最高,此时P为5,毕竟,5×200=999。上面的纯P控制无初始PWM在P很小的时候轮子是不转的,所以我做出假设:纯P控制有初始PWM状态的曲线图一样在P很小的时候将有很大超调。

————不多bb————上图:纯P控制的图表2

P图(有初始为600)描述0.01在这里插入图片描述设定值为200,就是那条绿线 。你敢信?这次P0.01,电机都能转动了,还有超调0.05在这里插入图片描述和上面的图峰值几乎一样0.1在这里插入图片描述峰值变低了,这次不到700,上面两幅图在700以上0.3在这里插入图片描述峰值再次变低,不到6000.5在这里插入图片描述峰值再次变低,不到5001在这里插入图片描述峰值再次变低,不到4003在这里插入图片描述

果然!PWM就是整个问题的最根本核心和导致这一切奇幻诡谲现象的始作俑者!

为什么PWM能造成这种问题?难道你不好奇吗?

我觉得:我们有必要手撕一下增量式PID的公式。现在回过头来仔细的看看增量式PI的公式:

motor.speed_last_error_R = motor.speed_current_error_R; //更新每次的差值 motor.speed_current_error_R = (int16)(motor.speed_set_R-motor.speed_R); //速度当前差值 motor.speed_duty_output_R = motor.speed_duty_output_R+(int16)(motor.speed_P*(motor.speed_current_error_R-motor.speed_last_error_R)+motor.speed_I*motor.speed_current_error_R);

在这里插入图片描述

(一个累加的东西 ) + (P系数×偏差之差+I系数×当前偏差) 就这两部分组成。

现在我们来看看,P=0.1,I=0.02,初始PWM=999的曲线图凭什么是如下这幅鬼图:

在这里插入图片描述 在下不才,人送外号:人肉单片机!!! 现在,单片机执行此段代码的第一个瞬间,

有K=1, 定义变量名:motor.speed_last_error_R,代码里我们对motor.speed_last_error_R不赋初值,所以C语言中会把变量motor.speed_last_error_R的初值默认设为0; 轮子初始不转,所以轮子速度初值为0; 设定值给:200; 初始PWM为999的话,就是变量motor.speed_duty_output_R初值为999; 在单片机第一次执行此段代码时, motor.speed_last_error_R=0, motor.speed_current_error_R=200-0=200, motor.speed_duty_output_R=999+0.1×(200-0)+0.02×200=999+20+4,它>999,我们有限幅,所以motor.speed_duty_output_R=999.

K=2 单片机的第二个瞬间 motor.speed_last_error_R=200, motor.speed_current_error_R=200-999=-799, motor.speed_duty_output_R=999+0.1×(-799-200)+0.02×(-799)=999-99.9-15.98=883.12

K=3 单片机的第三个瞬间 motor.speed_last_error_R=-799, motor.speed_current_error_R=200-883.12=-683.12, motor.speed_duty_output_R=883.12+0.1×(-683.12+799)+0.02×(-683.12)=883.12+11.588-13.6624=881.0456

… 算8动了,根据现在的计算趋势,不出意外的话,轮子的速度最终应该会收敛在设定速度200,的确与曲线图相符,也与现实看到的情况一致,从一开始的轮子猛转,再到之后的轮子速度稳定于200。一切皆有道理!

现在,我们让初始PWM为0,轮子初始速度为0,增域设为200。 脑细胞还够的朋友可以亲自手算一下初始PWM为0时,单片机的第一个瞬间、第二个瞬间和第三个瞬间的PWM,这里我已经猪脑过载就不算了,只简单说一下:

我们知道在单片机第一次执行此段代码时,motor.speed_duty_output_R初值为0,motor.speed_last_error_R是默认值为0,motor.speed_current_error_R是设定值-真实值为200,那么motor.speed_P*(motor.speed_current_error_R-motor.speed_last_error_R)这句话它的值是:在P为2时就是400,P为5时是999,P为10时依然被限幅为999.所以单片机第一个瞬间motor.speed_duty_output_R 是会被赋值为400的(我以P是2举例),,所以我们看到P为5时(就是PWM为999),曲线响应性比P为2时的高,P为10时曲线响应性比P为5时的低(因为本来的2000被砍成了999)。I乘的是motor.speed_current_error_R,第一次motor.speed_current_error_R是200,越到后面偏差motor.speed_current_error_R的值会越来越小,如果I参数比较大,那么每次调整的力度就比较大,所以我们看到静差反而变大了。I参数从小变到中,I越大越能减小静差,I参数从中变到大,I越大静差会越大,最后静差大到振荡起来。 …To Be Continued…



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3