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

黎明曙光篇之新生

增量式PID的P、I理解之推翻篇

、据我所知的资料里关于PID三个参数的理解是这样的:(我这里只说P和I)

P的作用:比例P可以加快系统调节速度,P过小调节时间变长,响应性不够,P越大响应性越高超调也越严重,过大的P会使系统振荡。

I的作用:消除静差,提高控制精度,I越大越滞后,过大会使系统振荡。

、以上这些对于位置式的PID的确如其所说,但是对于增量式并不是如此。而现有的书上的、网上的资料里也没有区分位置式和增量式的不同,所以意思是增量式也是如此。
现在我们用实践出的证据说话:看看增量式PID的P、I是否像书上说的那样(P可以加快系统调节速度,I消除静差)。
————废话少说————上图:

P I 图像 描述
0.1 0.01 在这里插入图片描述 设定值为200,从0开始到200,此时最大已经超过了800
0.3 0.01 在这里插入图片描述 可以看到峰值小于800
0.5 0.01 在这里插入图片描述 峰值600左右
1 0.01 在这里插入图片描述 超调更小了,并且调节时间变长了
3 0.01 在这里插入图片描述 超调再次减小了,调节时间已经非常长了,响应性越来越差
7 0.01 在这里插入图片描述 没有超调量,因为最开始峰值才125,后面越来越高,最后趋于设定值,静差几乎为0
15 0.01 在这里插入图片描述 开始抖了,变的有点奇怪起来了
30 0.01 在这里插入图片描述 轮子已经肉眼看到不转了,一会正转一会反转,所以轮子在卡,转不了

可以看到随着P的增大,超调量在减小。至此,得出结论:增量式PID的P——“比例P可以加快系统调节速度,P过小调节时间变长,响应性不够,P越大响应性越高超调也越严重”这是完全错误的。
上面是证明P作用的图,接下来是I的图:

P I 图像 描述
3 0.01 在这里插入图片描述 设定值200 ,峰值不到300,最后它趋于稳定了
3 0.03 在这里插入图片描述
3 0.05 在这里插入图片描述
3 0.1 在这里插入图片描述 随着I的正大调节时间变短,响应性增大
3 0.3 在这里插入图片描述 可以看到I的增大,超调量在慢慢减小
3 0.5 在这里插入图片描述
3 1 在这里插入图片描述
3 3 在这里插入图片描述 处在稳定与振荡的边缘
3 5 在这里插入图片描述 振荡

至此,得出结论:增量式PID的I——I参数从0.01-1的确能提高控制精度,过大会振荡,但是“I越大越滞后”这句话是否正确暂且待定,毕竟I参数从0.01~1这动态性能(响应性提高)怎么解释?

由上图可以看到:P减小才可以加快系统调节速度,增大会使调节时间变长。I增大则能加快系统调节速度,消除静差,过大会振荡,但I越大越滞后看不出来。所以,《自动控制原理》书上说的:P增大可以加快系统调节速度是说错了吗?

三、既然现有的对于增量式的P的理解不对,对I的理解不准确,那么增量式的P、I的真正理解是什么呢?
真正理解:想理解增量式的P、I的真正作用,我要先提一下两个前提:1、启动电机的第一个瞬间,当前控制器内输出值(PWM)的高低2、增域。详情如何我的下一篇博客将揭露增量式的P、I的真正面纱。










最后,这里再说一下我的控制:很纯粹的增量式PI控制电机,测量变送器用的是龙邱家的1024线编码器,充当PID控制器的是K66单片机+代码,被控对象是有刷直流电机。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);

motor.speed_R是编码器测的车子右轮真实速度,motor.speed_set_R是车子右轮设定值。
限幅和PWM输出代码:

 if(motor.speed_duty_output_L>999 motor.speed_duty_output_L=999;
    if(motor.speed_duty_output_L<-999) motor.speed_duty_output_L=-999;
        if(motor.speed_duty_output_R>999) motor.speed_duty_output_R=999;
    if(motor.speed_duty_output_R<-999) motor.speed_duty_output_R=-999;
     myMotor_Setspeed(motor.speed_duty_output_R,motor.speed_duty_output_L);
void myMotor_Setspeed(int16 PWM_R,int16 PWM_L)//给速度
{
    
     
  //左
  if(PWM_L>=0)
    {
    
    
      ftm_pwm_duty(L_BACK_FTM,L_BACK_CH,0);
      ftm_pwm_duty(L_GO_FTM,L_GO_CH,(uint32)(PWM_L));
    }
  else
    {
    
    
      ftm_pwm_duty(L_GO_FTM,L_GO_CH,0);
      ftm_pwm_duty(L_BACK_FTM,L_BACK_CH,(uint32)(-PWM_L));
    } 
  //右
  if(PWM_R>=0)
    {
    
    
      ftm_pwm_duty(R_BACK_FTM,R_BACK_CH,0);
      ftm_pwm_duty(R_GO_FTM,R_GO_CH,(uint32)(PWM_R));
    }
  else
    {
    
    
      ftm_pwm_duty(R_GO_FTM,R_GO_CH,0);
      ftm_pwm_duty(R_BACK_FTM,R_BACK_CH,(uint32)(-PWM_R));
    }
  
}

…To Be Continued…

猜你喜欢

转载自blog.csdn.net/fangchenglia/article/details/109518121