PID.C 840 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "pid.h"
  2. PID pid; //存放PID算法所需要的数据
  3. void PID_Calc() //pid计算
  4. {
  5. float DelEk;
  6. float ti,ki;
  7. float td;
  8. float kd;
  9. float out;
  10. if(pid.C10ms<(pid.T)) //计算周期未到
  11. {
  12. return ;
  13. }
  14. pid.Ek=pid.Sv-pid.Pv; //得到当前的偏差值
  15. pid.Pout=pid.Kp*pid.Ek; //比例输出
  16. pid.SEk+=pid.Ek; //历史偏差总和
  17. DelEk=pid.Ek-pid.Ek_1; //最近两次偏差之差
  18. ti=pid.T/pid.Ti;
  19. ki=ti*pid.Kp;
  20. pid.Iout=ki*pid.SEk*pid.Kp; //积分输出
  21. td=pid.Td/pid.T;
  22. kd=pid.Kp*td;
  23. pid.Dout=kd*DelEk; //微分输出
  24. out= pid.Pout+ pid.Iout+ pid.Dout;
  25. //////////////////////////////////////////////////////////
  26. if(out>pid.pwmcycle)
  27. {
  28. pid.OUT=pid.pwmcycle;
  29. }
  30. else if(out<0)
  31. {
  32. pid.OUT=pid.OUT0;
  33. }
  34. else
  35. {
  36. pid.OUT=out;
  37. }
  38. //pid.OUT+=; //本次的计算结果
  39. pid.Ek_1=pid.Ek; //更新偏差
  40. pid.C10ms=0;
  41. }