pid.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include "pid.h"
  2. //用于初始化pid参数的函数
  3. void PID_Init(PID *pid, float p, float i, float d, float maxI, float maxOut)
  4. {
  5. pid->kp = p;
  6. pid->ki = i;
  7. pid->kd = d;
  8. pid->maxIntegral = maxI;
  9. pid->maxOutput = maxOut;
  10. pid->error = 0;
  11. pid->lastError = 0;
  12. pid->integral = 0;
  13. pid->output = 0;
  14. }
  15. //进行一次pid计算
  16. //参数为(pid结构体,目标值,反馈值),计算结果放在pid结构体的output成员中
  17. void PID_Calc(PID *pid, float reference, float feedback)
  18. {
  19. //更新数据
  20. pid->lastError = pid->error; //将旧error存起来
  21. pid->error = reference - feedback; //计算新error
  22. //计算微分
  23. float dout = (pid->error - pid->lastError) * pid->kd;
  24. //计算比例
  25. float pout = pid->error * pid->kp;
  26. //计算积分
  27. pid->integral += pid->error * pid->ki;
  28. //积分限幅
  29. if(pid->integral > pid->maxIntegral)
  30. pid->integral = pid->maxIntegral;
  31. else if(pid->integral < -pid->maxIntegral)
  32. pid->integral = -pid->maxIntegral;
  33. //计算输出
  34. pid->output = pout+dout + pid->integral;
  35. //输出限幅
  36. if(pid->output > pid->maxOutput)
  37. pid->output = pid->maxOutput;
  38. else if(pid->output < -pid->maxOutput)
  39. pid->output = -pid->maxOutput;
  40. }