/*******************************************************************************
* 普通增量型PID的C语言实现
*******************************************************************************
* PID增量表达式:∆u(k) = Kp*(error(k) - error(k-1)) + Ki*(error(k)) + Kd*(error(k) - 2*error(k-1) + error(k-2))
* 最终的结果 = u(k) + ∆u(k)
******************************************************************************/
#include<stdio.h>
#include<stdlib.h>
struct _pid
{
float SetSpeed; //定义设定值
float ActualSpeed; //定义实际值
float error; //定义偏差值
float error_next1; //定义偏差值(k-1)
float error_next2; //定义偏差值(k-2)
float Kp,Ki,Kd; //定义比例、积分、微分系数
}pid; //定义了一个结构名为_pid的结构变量pid
void PID_init()
{
printf("PID_init begin\n");
pid.SetSpeed = 0.0;
pid.ActualSpeed = 0.0;
pid.error = 0.0;
pid.error_next2 = 0.0;
pid.error_next1 = 0.0;
pid.Kp = 0.2; //需要自行整定
pid.Ki = 0.015; //
pid.Kd = 0.2; //
printf("PID_init end\n");
}
float PID_realize(float speed)
{
float incrementSpeed;
pid.SetSpeed = speed;
pid.error = pid.SetSpeed - pid.ActualSpeed;
incrementSpeed = pid.Kp*(pid.error - pid.error_next1) + pid.Ki*pid.error + pid.Kd*(pid.error - 2*pid.error_next1 + pid.error_next2);
pid.ActualSpeed += incrementSpeed;
pid.error_next2 = pid.error_next1;
pid.error_next1 = pid.error;
return pid.ActualSpeed;
}
int main()
{
PID_init();
int count = 0;
while(count < 1000) //运行1000次,得到1000个数据
{
float speed = PID_realize(200.0);
printf("%f\n",speed);
count++;
}
return 0;
}