增量型PID的C语言实现
上一节中介绍了最简单的位置型 PID 的实现手段,这一节主要讲解增量式PID 的实现方法,位置型和增量型 PID 的数学公式请参见个人系列文《PID 控制算法的 C 语言实现二》中的讲解。实现过程仍然是分为定义变量、初始化变量、实现控制算法函数、算法测试四个部分,详细分类请参加《PID 控制算法的 C 语言实现三》中的讲解,这里直接给出代码了。算法
struct _pid{ float SetSpeed; //定义设定值 float ActualSpeed;//定义实际值 float err; //定义误差值 float err_last; //定义上一个误差值 float err_past; //定义前一个误差值 float Kp,Ki,Kd; //定义比例、积分、微分系数 float voltage; //定义电压值(控制执行器变量) float integral; //定义积分值 int index; // 积分分离时的变量 float umax; //积分极限 float umin; }pid; void PID_init() //pid变量初始化 { printf("PID_init begin \n"); pid.SetSpeed = 0.0; pid.ActualSpeed = 0.0; pid.err = 0.0; pid.err_last = 0.0; pid.err_past = 0.0; pid.voltage = 0.0; pid.integral = 0.0; pid.Kp = 0.4; pid.Ki = 0.2; pid.Kd = 0.2; pid.umax = 400; pid.umin = -200; printf("PID_init end \n"); }
//增量型PID算法 //结果和最近三次的偏差有关,,输出=U(K)+增量调节值 float PID_realize2(float speed) { pid.SetSpeed = speed; pid.err = pid.SetSpeed - pid.ActualSpeed; float incrementSpeed = pid.Kp * (pid.err - pid.err_last)+ pid.Ki * pid.err + pid.Kd * (pid.err - 2 * pid.err_last + pid.err_past);//电压 pid.ActualSpeed += incrementSpeed; pid.err_past = pid.err_last; pid.err_last = pid.err; return pid.ActualSpeed; }
实验数据以下:函数
83.000000 11.555000 59.559677 28.175406 52.907425 38.944149 51.891701 46.141655 53.339050 51.510002 55.908447 55.944637 58.970676 59.882942 62.224998 63.537247 65.527702 ....... 199.999359 199.999374 199.999374 199.999390 199.999390 199.999405 199.999405 199.999420 199.999420 199.999435 199.999435 199.999451 199.999451 199.999466 199.999466 199.999481 199.999481 199.999496 199.999496 199.999512 199.999512