fuzzy_PID.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #ifndef _FUZZY_PID_H_
  2. #define _FUZZY_PID_H_
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. #include "PikaObj.h"
  7. #include "math.h"
  8. #include "stdio.h"
  9. #include "stdlib.h"
  10. // Fuzzy quantity fields
  11. enum quantity_fields { qf_small = 5, qf_middle = 7, qf_large = 8 };
  12. #define qf_default qf_middle
  13. struct fuzzy {
  14. unsigned int input_num;
  15. unsigned int output_num;
  16. unsigned int fo_type;
  17. unsigned int* mf_type;
  18. int* mf_params;
  19. unsigned int df_type;
  20. int* rule_base;
  21. float* output;
  22. };
  23. struct PID {
  24. float kp;
  25. float ki;
  26. float kd;
  27. float delta_kp_max;
  28. float delta_ki_max;
  29. float delta_kd_max;
  30. float delta_kp;
  31. float delta_ki;
  32. float delta_kd;
  33. float error_max;
  34. float delta_error_max;
  35. float last_error;
  36. float current_error;
  37. float intergral;
  38. float intergral_limit;
  39. float dead_zone;
  40. float feed_forward;
  41. float output;
  42. int output_min_value;
  43. int output_middle_value;
  44. int output_max_value;
  45. float linear_adaptive_kp;
  46. struct fuzzy* fuzzy_struct;
  47. };
  48. #define NB -3
  49. #define NM -2
  50. #define NS -1
  51. #define ZO 0
  52. #define PS 1
  53. #define PM 2
  54. #define PB 3
  55. // #define pid_debug_print
  56. // #define pid_dead_zone
  57. // #define pid_integral_limit
  58. // #define fuzzy_pid_debug_print
  59. // #define fuzzy_pid_dead_zone
  60. // #define fuzzy_pid_integral_limit
  61. // #define fuzzy_pid_rule_base_deep_copy
  62. #define pid_params_count 7
  63. #define torque_mode 1
  64. #define position_mode 2
  65. #define control_mode position_mode
  66. #if control_mode == position_mode
  67. #define max_error 100.0f
  68. #define max_delta_error 100.0f
  69. #else
  70. #define max_error 12.0f
  71. #define max_delta_error 12.0f
  72. #endif
  73. #define min_pwm_output 0
  74. #define middle_pwm_output 500
  75. #define max_pwm_output 1000
  76. struct fuzzy* fuzzy_init(unsigned int input_num, unsigned int output_num);
  77. void fuzzy_params_init(struct fuzzy* fuzzy_struct,
  78. unsigned int mf_type,
  79. unsigned int fo_type,
  80. unsigned int df_type,
  81. int mf_params[],
  82. int rule_base[][qf_default]);
  83. void fuzzy_control(float e, float de, struct fuzzy* fuzzy_struct);
  84. struct PID* raw_pid_init(float kp,
  85. float ki,
  86. float kd,
  87. float integral_limit,
  88. float dead_zone,
  89. float feed_forward,
  90. float linear_adaptive_kp,
  91. float error_max,
  92. float delta_error_max,
  93. int output_min_value,
  94. int output_middle_value,
  95. int output_max_value);
  96. struct PID* raw_fuzzy_pid_init(float kp,
  97. float ki,
  98. float kd,
  99. float integral_limit,
  100. float dead_zone,
  101. float feed_forward,
  102. float error_max,
  103. float delta_error_max,
  104. float delta_kp_max,
  105. float delta_ki_max,
  106. float delta_kd_max,
  107. unsigned int mf_type,
  108. unsigned int fo_type,
  109. unsigned int df_type,
  110. int* mf_params,
  111. int rule_base[][qf_default],
  112. int output_min_value,
  113. int output_middle_value,
  114. int output_max_value);
  115. // float params[pid_params_count] = {kp, ki, kd, integral_limit,
  116. // dead_zonefeed_forward, linear_adaptive_kp};
  117. struct PID* pid_init(float* params);
  118. struct PID* fuzzy_pid_init(float* params,
  119. float delta_k,
  120. unsigned int mf_type,
  121. unsigned int fo_type,
  122. unsigned int df_type,
  123. int mf_params[],
  124. int rule_base[][qf_default]);
  125. struct PID** pid_vector_init(float params[][pid_params_count],
  126. unsigned int count);
  127. struct PID** fuzzy_pid_vector_init(float params[][pid_params_count],
  128. float delta_k,
  129. unsigned int mf_type,
  130. unsigned int fo_type,
  131. unsigned int df_type,
  132. int* mf_params,
  133. int rule_base[][qf_default],
  134. unsigned int count);
  135. float pid_control(float real, float idea, struct PID* pid);
  136. float fuzzy_pid_control(float real, float idea, struct PID* pid);
  137. int direct_control(int zero_value, int offset_value, pika_bool direct);
  138. int pid_motor_pwd_output(float real,
  139. float idea,
  140. pika_bool direct,
  141. struct PID* pid);
  142. int fuzzy_pid_motor_pwd_output(float real,
  143. float idea,
  144. pika_bool direct,
  145. struct PID* pid);
  146. void delete_pid(struct PID* pid);
  147. void delete_pid_vector(struct PID** pid_vector, unsigned int count);
  148. #ifdef __cplusplus
  149. }
  150. #endif
  151. #endif //_FUZZY_PID_H_