一、微分先行PID介绍
PID控制器开发笔记之七:微分先行PID控制器的实现_foxclever的博客-CSDN博客_微分先行
二、代码实现
代码如下:
#include<stdio.h>
#include<stdlib.h>
struct derivation_in_advance_PID
{
float SetPoint;
float ActualSpeed;
float Kp;
float Ki;
float Kd;
float c1;
float c2;
float c3;
float error;
float error_last;
float interal;
float gama;
float control;
float control_dk;
float control_dk_last;
}pid;
void PID_init();
float PID_realize(float speed);
void PID_init()
{
pid.Kp = 0.2;
pid.Ki = 0.1;
pid.Kd = 0.2;
pid.error = 0.0;
pid.error_last = 0.0;
pid.interal = 0.0;
pid.gama = 0.1;
pid.control = 0.0;
pid.control_dk =0.0;
pid.control_dk_last = 0.0;
pid.ActualSpeed = 0.0;
pid.c1 = 0.0;
pid.c2 = 0.0;
pid.c3 = 0.0;
}
void PID_realise(float speed)
{
pid.SetPoint = speed;
pid.error = pid.SetPoint - pid.ActualSpeed;
pid.interal += pid.error;
pid.c1 = (pid.gama*pid.Kd)/(pid.gama*pid.Kd+pid.Kp);
pid.c2 = (pid.Kd+pid.Kp)/(pid.gama*pid.Kd+pid.Kp);
pid.c3 = pid.Kd/(pid.gama*pid.Kd+pid.Kp);
pid.control_dk = pid.c1*pid.control_dk_last + pid.c2*pid.control_dk + pid.c3*pid.control_dk_last;
pid.control = pid.Kp*pid.error + pid.Ki*pid.interal + pid.control_dk;
pid.error_last = pid.error;
pid.control_dk_last = pid.control_dk;
pid.ActualSpeed = pid.control*1.0;
}
int main()
{
PID_init();
int count;
while(count<1000)
{
float speed = PID_realize(200);
printf("%f\n",speed);
count++;
}
return 0;
}