黎明曙光篇之新生
一、据我所知的资料里关于PID三个参数的理解是这样的:(我这里只说P和I)
P的作用:比例P可以加快系统调节速度,P过小调节时间变长,响应性不够,P越大响应性越高超调也越严重,过大的P会使系统振荡。
I的作用:消除静差,提高控制精度,I越大越滞后,过大会使系统振荡。
二、以上这些对于位置式的PID的确如其所说,但是对于增量式并不是如此。而现有的书上的、网上的资料里也没有区分位置式和增量式的不同,所以意思是增量式也是如此。
现在我们用实践出的证据说话:看看增量式PID的P、I是否像书上说的那样(P可以加快系统调节速度,I消除静差)。
————废话少说————上图:
可以看到随着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…