PID控制是一种线性控制,它将给定值r(t)与实际输出值y(t)的偏差的比例(P)、积分(I)、微分(D)通过线性组合形成控制量,对被控对象进行控制。
PID控制的微分方程为:
y(t)——系统的输出;
n(t)——给定值;
e(t)——控制的输入,即偏差:e(t)=n(t)-y(t)被控量与给定值的偏差;
u(t)——控制的输出;
——比例系数;
——积分时间常数;
#include <stdio.h>
// 第一步:定义PID变量结构体,控制算法中所需要用到的参数在一个结构体中统一定义,方便后面的使用。
//代码如下:
struct _pid
{
float SetSpeed; //定义设定值
float ActualSpeed; //定义实际值
float err; //定义偏差值
float err_last; //定义上一个偏差值
float Kp,Ki,Kd; //定义比例、积分、微分系数
float voltage; //定义电压值(控制执行器的变量)
float integral; //定义积分值
}pid;
// 第二部:初始化变量,统一初始化变量,尤其是Kp,Ki,Kd三个参数,调试过程当中,对于要求的控制效果,可以通过调节这三个量直接进行调节。
//代码如下:
void PID_init()
{
printf("PID_init Begin \n");
pid.SetSpeed = 0.0;
pid.ActualSpeed = 0.0;
pid.err = 0.0;
pid.err_last = 0.0;
pid.voltage = 0.0;
pid.integral = 0.0;
pid.Kp = 0.2;
pid.Ki = 0.015;
pid.Kd = 0.2;
printf("PID_init End \n");
}
// 第三步:编写控制算法,这里用了最基本的算法实现形式,没有考虑死区问题,没有设定上下限,只是对公式的一种直接的实现,后面的介绍当中还会逐渐的对此改进。,
//代码如下:
float PID_realize(float speed)
{
pid.SetSpeed = speed; //定义设定值
pid.err = pid.SetSpeed - pid.ActualSpeed; //定义偏差值 = 设定值 - 实际值
pid.integral += pid.err; //定义积分值 = 当前积分值 + 当前偏差值
//定义电压值(控制执行器的变量) = 比例*偏差值 + 积分*积分值 + 微分*(偏差值-上一个偏差值)
pid.voltage = pid.Kp*pid.err + 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()
{
printf("System Begin \n");
PID_init();
int count=0;
while(count < 1000)
{
float speed = PID_realize(200.0);
printf("%f\n",speed);
count++;
}
+printf("PID_init End \n");
return 0;
}