精度提高,稳定时间增加
#include<stdio.h>
#include<stdlib.h>
struct _pid{
float SetSpeed; //定义设定值
float ActualSpeed; //定义实际值
float err; //定义偏差值
float err_next; //定义上一个偏差值
float err_last; //定义最上前的偏差值
float Kp,Ki,Kd; //定义比例、积分、微分系数
}pid;
void PID_init() //初始化
{
pid.SetSpeed=0.0;
pid.ActualSpeed=0.0;
pid.err=0.0;
pid.err_last=0.0;
pid.err_next=0.0;
pid.Kp=0.2;
pid.Ki=0.015;
pid.Kd=0.2;
}
float PID_realize(float speed)
{
float incrementSpeed;
pid.SetSpeed=speed;
pid.err=pid.SetSpeed-pid.ActualSpeed;
incrementSpeed=pid.Kp*(pid.err-pid.err_next)+pid.Ki*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last);
// 比例*(当前偏差-上一个偏差) + 积分*当前偏差 + 微分*(当前偏差-二倍的上一个偏差+上上一个偏差)
pid.ActualSpeed+=incrementSpeed;
//实际速度 = 计算变量之和
pid.err_last=pid.err_next;
//上一个偏差 赋值给 上上一个
pid.err_next=pid.err;
//当前偏差 赋值给 上一个偏差 下次循环使用
return pid.ActualSpeed;
}
int main()
{
int count=0;
PID_init();
while(count<1000)
{
float speed=PID_realize(200.0);
printf("%f\n",speed);
count++;
}
system("pause");
return 0;
}