在积分分离的章节,我们是用Ki去控制积分环节的偏差,是一个固定的值,但为了更好的稳定系统,我们要求在偏差大的时候,积分系数小,偏差小的时候,积分系数大,这样可以稳定系统,不至于出现超调过大、饱和等情况,而且能时间更短的使系统达到稳定状态!因此,变积分就是根据偏差的大小改变积分的速度! 其思想就是:改变积分的累加速度,使其与偏差大小相对应;偏差越大,积分越慢(可以理解为积分少),偏差越小,积分越快!
程序上我们要做的就是在积分系数上加一个速度比例值index: 当 偏差值>200 index=0; 当 偏差值<180 index=1; 当 200>偏差值>180 index= (200-偏差值)/20
具体代码如下: struct _pid{ float SetSpeed; float ActualSpeed; float Err; float Err_Last; float Kp,Ki,Kd; float Voltage; float Integral; }pid; void PID_Init(void) { printf("PID_Init begin! \n"); pid.SetSpeed = 0; pid.ActualSpeed = 0; pid.Err = 0; pid.Err_Last = 0; pid.Kp = 0.2; pid.Ki = 0.2; //增大了积分系数 pid.Kd = 0.2; pid.Voltage = 0; pid.Integral = 0; printf("PID_Init end! \n"); } float PID_Cal(float Speed) { unsigned char index; pid.SetSpeed = Speed; pid.Err = pid.SetSpeed - pid.ActualSpeed; if(abs(pid.Err)>200) //变积分处理控制 { index = 0; } else if(abs(pid.Err)<180) { index =1; pid.Integral += pid.Err; } else { index = (200-abs(pid.Err))/20; pid.Integral += pid.Err; } pid.Voltage = pid.Kp*pid.Err +index*pid.Ki*pid.Integral + pid.Kd*(pid.Err - pid.Err_Last); pid.Err_Last = pid.Err; pid.ActualSpeed = pid.Voltage*1.0; return pid.ActualSpeed; } int main(void) { int count = 0 ; printf("SYSTEM BEGIN! \n"); PID_Init(); while(count<1000) { float speed = PID_Cal(200.0); printf("-%d-%f-",count,speed); count++; } return 0;
}
运行结果:
我们发现系统的稳定速度非常快,在94次PID控制后就趋于稳定了!
转载请注明原文地址: https://www.6miu.com/read-44082.html