pid_c.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #ifndef PID_C_H
  2. #define PID_C_H
  3. #include <stdint.h>
  4. // PID控制器结构体
  5. typedef struct
  6. {
  7. double initval; // 初始值
  8. double goal; // 目标值
  9. double error; // 当前误差
  10. uint32_t pid_step; // 步数计数器
  11. double Kp; // 比例常数
  12. double Ki; // 积分常数
  13. double Kd; // 微分常数
  14. double prev_error; // 前一个误差
  15. double inte_error; // 积分误差
  16. double dif_error; // 微分误差
  17. } studio_pid;
  18. // 初始化PID控制器
  19. void studio_pid_init(studio_pid *pid, double init_v, double goal_v, double p, double i, double d)
  20. {
  21. pid->initval = init_v;
  22. pid->goal = goal_v;
  23. pid->Kp = p;
  24. pid->Ki = i;
  25. pid->Kd = d;
  26. pid->error = goal_v - init_v;
  27. pid->pid_step = 1;
  28. pid->prev_error = 0;
  29. pid->inte_error = 0;
  30. pid->dif_error = 0;
  31. }
  32. // 计算PID输出
  33. double studio_pid_compute(studio_pid *pid, double current_value)
  34. {
  35. // 计算当前误差
  36. double cte = pid->goal - current_value;
  37. // 更新误差项
  38. if (pid->pid_step == 1)
  39. {
  40. pid->prev_error = cte;
  41. }
  42. pid->inte_error += cte;
  43. pid->dif_error = cte - pid->prev_error;
  44. pid->prev_error = cte;
  45. ++pid->pid_step;
  46. // 计算并返回PID输出
  47. return pid->Kp * cte + pid->Ki * pid->inte_error + pid->Kd * pid->dif_error;
  48. }
  49. // 获取目标值
  50. double studio_pid_get_goal(const studio_pid *pid)
  51. {
  52. return pid->goal;
  53. }
  54. // 设置目标值
  55. void studio_pid_set_goal(studio_pid *pid, double goal_v)
  56. {
  57. pid->goal = goal_v;
  58. }
  59. // 设置PID参数
  60. void studio_pid_set_params(studio_pid *pid, double p, double i, double d)
  61. {
  62. pid->Kp = p;
  63. pid->Ki = i;
  64. pid->Kd = d;
  65. }
  66. #endif