位制式PID算法

PID计算公式:

PID控制 - 图1
K:比例系数
E:为当前的偏差
T :PID的计算周期
T:积分周期
T:微分周期
E:前一次的偏差
OUT:常数

  1. #ifndef _PID_
  2. #define _PID_
  3. #include "stm32f10x_conf.h"
  4. void PID_Calc(void);
  5. // 使用结构体定义PID所需的类型
  6. typedef struct
  7. {
  8. float Sv; // 用户设定值
  9. float Pv; // 当前的值
  10. float Kp; // 比例系数
  11. float T; // 计算周期or采样周期
  12. float Ti; // 积分时间常数
  13. float Td; // 微分系数
  14. float Ek; // 本次的偏差
  15. float Ek_1; // 上次的偏差
  16. float SEk; // 前面n次历史偏差之和
  17. float OUT0; // 当计算值为0时,维持一个稳定的输出
  18. float OUT; // 输出的值
  19. unsigned int C10ms;
  20. unsigned int pwmcycle; // pwm周期
  21. }PID;
  1. // pid.c
  2. #include "pid.h"
  3. PID pid; // 存放PID算法所需的数据
  4. void PID_Calc(void) // pid计算
  5. {
  6. float DelEk;
  7. float ti, ki, td, kd;
  8. float Pout,Iout,Dout, temp;
  9. if(/*判断计算周期是否到了*/)
  10. return;
  11. pid.Ek = pid.Sv-pid.Pv; // 得到当前的偏差值
  12. pid.SEK += pid.Ek; // 历史偏差总和
  13. DelEk = pid.Ek - pid.Ek_1; // 最近两次偏差之差
  14. ti = pid.T/pid.Ti; // 积分项
  15. ki = ti*pid.Kp;
  16. td = pid.Td/pid.T; // 微分项
  17. kd = td*pid.Kp;
  18. Pout = pid.Kp*pid.Ek; // 比例输出
  19. Iout = ki*pid.SEK; // 积分输出
  20. Dout = kd*(pid.Ek - pid.Ek_1); // 微分输出
  21. temp = Pout + Iout + Dout + pid.OUT0; // 本次计算结果
  22. // pid归并到有效值内
  23. if(out>pid.pwmcycle)
  24. {
  25. pid.OUT = pid.pwmcycle;
  26. }else if
  27. {
  28. pid.OUT = 0;
  29. }else
  30. {
  31. pid.OUT = temp;
  32. }
  33. pid.Ek_1 = pid.Ek; // 本次输出后,将本次的值赋值到上一次的
  34. pid.C10ms = 0;
  35. }
  1. // main.c
  2. // 初始化PID所需的参数值(一般这些参数都是存储在可记忆存储位置)
  3. void PID_Init()
  4. {
  5. pid.Sv = 100; // 用户设定温度 从存储器获取的值
  6. pid.Kp = 20; // 从传感器获取的值
  7. pid.T = 1000; // PID计算周期 1000ms
  8. pid.Ti = 5000; // 积分时间5000ms
  9. pid.Td = 1200; // 微分时间1200ms
  10. pid.pwmcycle = 1000; // pwm周期1000;
  11. }
  12. int main()
  13. {
  14. //....
  15. PID_Init();
  16. while(1)
  17. {
  18. }
  19. }

增量式PID算法

公式:

PID控制 - 图2

参数介绍:
Ek:本次的偏差
Ek_1:上次的偏差
Ek_2:上上次的偏差
Kp:算法增益调节
Ti:积分时间
Td:微分时间常数

结论:
增量式PID的计算只需要最近3次的偏差(本次偏差,上次偏差,上上次偏差),不需要处理器存储大量的历史偏差值,计算量也相对较少,容易实现。