PID算法的C语言实现

时间:2025-12-05 22:17:48 C语言

PID算法的C语言实现

  积分饱和通俗讲就是系统在一个偏差方向上的饱和,下面一起来跟着小编学习一下PID算法的C语言实现方法吧,希望可以帮助到大家!

  比如一个系统设定了输出不会超过100,但因为出现一个方向上的偏差积分使得输出超过了100,此时达到了饱和状态,如果继续在这个方向上积分会导致PID控制超过100系统却运行在100,相当于积分调节对系统输出没有作用,就出现失控的状态,这是系统不能接受的,而且饱和积分越深,退出饱和就越久。上面是在正向的饱和,负向的饱和类似!

  为了解决这个问题,我们采用抗积分饱和算法,其思路就是:如果上一次的输出控制量超过了饱和值,饱和值为正,则这一次只积分负的偏差,饱和值为负,则这一次只积分正的偏差,从而避免系统长期留在饱和区!

  下面我以 位置型+抗积分饱和+积分分离的PID控制算法C语言来观察调节结果:(相对应的代码可以参考以往的文章)

  /pic/p>

  struct _pid{

  float SetSpeed;

  float ActualSpeed;

  float Err;

  float Err_Last;

  float Kp,Ki,Kd;

  float Voltage;

  float Integral;

  float Umax; /pic/p>

  float Umin; /pic/p>

  }pid;

  void PID_Init(void)

  {

  printf("PID_Init begin! ");

  pid.SetSpeed = 0;

  pid.ActualSpeed = 0;

  pid.Err = 0;

  pid.Err_Last = 0;

  pid.Kp = 0.2;

  pid.Ki = 0.1; /pic/p>

  pid.Kd = 0.2;

  pid.Voltage = 0;

  pid.Integral = 0;

  pid.Umax = 400; /pic/p>

  pid.Umin = -200; /pic/p>

  printf("PID_Init end! ");

  }

  float PID_Cal(float Speed)

  {

  unsigned char index;

  pid.SetSpeed = Speed;

  pid.Err = pid.SetSpeed - pid.ActualSpeed;

  if(pid.ActualSpeed>pid.Umax) /pic/p>

  {

  if(abs(pid.Err)>200)

  {

  index = 0;

  }

  else

  {

  index = 1;

  if(pid.Err<0)

  {

  pid.Integral += pid.Err; /pic/p>

  }

  }

  }

  else if(pid.ActualSpeed {

  if(abs(pid.Err)>200)

  {

  index = 0;

  }

  else

  {

  index = 1;

  if(pid.Err>0)

  {

  pid.Integral += pid.Err; /pic/p>

  }

  }

  }

  else

  {

  if(abs(pid.Err)>200) /pic/p>

  {

  index = 0;

  }

  else

  {

  index = 1;

  pid.Integral += pid.Err;

  }

  }

  pid.Voltage = pid.Kp*pid.Err +index*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(void)

  {

  int count = 0 ;

  printf("SYSTEM BEGIN! ");

  PID_Init();

  while(count<1000)

  {

  float speed = PID_Cal(200.0);

  printf("-%d-%f-",count,speed);

  count++;

  }

  return 0;

  }

  最后运行结果:

  我们发现,相对以往的算法,还算法大大提高了调节的速度和稳定!

【PID算法的C语言实现】相关文章:

PID算法的C语言实现:抗积分饱和的PID优化02-20

C语言中实现KMP算法实例12-14

C语言实现魔方阵算法02-13

C语言实现归并排序算法02-04

希尔排序算法的C语言实现示例02-06

C语言实现归并排序算法实例07-13

6种常见的排序算法的C语言实现10-25

C语言基本算法12-29

c语言的排序算法01-15