PID调节例程 参考c语言代码(PID难点在参数,推荐ZN整定法)

[复制链接]
查看9 | 回复0 | 2021-6-5 01:12:39 | 显示全部楼层 |阅读模式
  1. #include "pid.h"

  2. PID pid; //存放PID算法所需要的数据

  3. //          pid.Sv=120;        //用户设定温度
  4. //        pid.Kp=30;         //比例系数
  5. //        pid.T=500;         //PID计算周期
  6. //          pid.Ti=5000000;         //积分时间
  7. //        pid.Td=1000;         //微分时间
  8. //        pid.pwmcycle=200;        //pwm周期1000
  9. //        pid.OUT0=1;
  10. void PID_Calc()  //pid计算
  11. {
  12.         float DelEk;
  13.         float ti,ki;
  14.         float td;
  15.         float kd;
  16.         float out;
  17. if(pid.C10ms<(pid.T))  //计算周期未到
  18. {
  19.     return ;
  20. }

  21. pid.Ek=pid.Sv-pid.Pv;   //当前的偏差值 = 设定值 - 返回值
  22. pid.Pout=pid.Kp*pid.Ek; //比例输出 = 比例系数*偏差

  23. pid.SEk+=pid.Ek;        //历史偏差总和

  24. DelEk=pid.Ek-pid.Ek_1;  //最近两次偏差之差

  25. ti=pid.T/pid.Ti;  //系数1

  26. ki=ti*pid.Kp;     // 系数2

  27.   pid.Iout=ki*pid.SEk*pid.Kp;  //积分输出 = 系数2 * 偏差和 * 比例系数

  28. td=pid.Td/pid.T;   //系数3

  29. kd=pid.Kp*td;      //系数4

  30. pid.Dout=kd*DelEk; //微分输出 = 系数4 * 最近两次偏差和

  31. out= pid.Pout+ pid.Iout+ pid.Dout; //PID输出 = 比例输出 + 积分输出 + 微分输出

  32. ///////////////////////////输出保护///////////////////////////////
  33. if(out>pid.pwmcycle)
  34. {
  35.   pid.OUT=pid.pwmcycle;
  36. }
  37. else if(out<0)
  38. {
  39.   pid.OUT=pid.OUT0;
  40. }
  41. else
  42. {
  43.   pid.OUT=out;
  44. }
  45. //pid.OUT+=; //本次的计算结果
  46. pid.Ek_1=pid.Ek;  //更新偏差

  47. pid.C10ms=0;
  48. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则