speed_pid.c 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /**********************************
  2. * 文件名称: speed_pid.c
  3. * 功能描述: 速度PID控制器模块
  4. * 功能: 实现电机速度的PID控制算法
  5. **********************************/
  6. #include "speed_pid.h"
  7. /**
  8. * @brief 速度PID控制周期
  9. * @details 设置为0.001秒(1kHz)
  10. */
  11. #define SPEED_PID_PERIOD 0.001F
  12. /**
  13. * @brief 速度PID控制器参数
  14. */
  15. real32_T SPEED_PI_I = 5.0F; // 积分系数
  16. real32_T SPEED_PI_KB = 0.015F; // 反馈系数
  17. real32_T SPEED_PI_LOW_LIMIT = -4.0F; // 输出下限
  18. real32_T SPEED_PI_P = 0.003F; // 比例系数
  19. real32_T SPEED_PI_UP_LIMIT = 4.0F; // 输出上限
  20. /**
  21. * @brief 速度控制相关变量
  22. */
  23. real32_T Speed_Ref; // 速度参考值(转/秒)
  24. real32_T Speed_Fdk; // 速度反馈值(弧度/秒)
  25. real32_T Speed_Pid_Out; // 速度PID输出,作为Q轴电流参考值
  26. /**
  27. * @brief 速度PID控制器结构体
  28. */
  29. SPEED_PID_DEF Speed_Pid;
  30. /**
  31. * @brief 速度PID计算函数
  32. * @param ref_temp 速度参考值(转/秒)
  33. * @param fdb_temp 速度反馈值(弧度/秒)
  34. * @param out_temp PID输出值(作为Q轴电流参考值)
  35. * @param current_pid_temp PID控制器结构体指针
  36. * @retval 无
  37. */
  38. void Speed_Pid_Calc(real32_T ref_temp, real32_T fdb_temp, real32_T* out_temp, SPEED_PID_DEF* current_pid_temp)
  39. {
  40. real32_T error; // 速度误差
  41. real32_T temp; // 临时变量
  42. // 计算速度误差:将参考速度(转/秒)转换为弧度/秒,减去反馈速度
  43. error = 6.28318548F * ref_temp - fdb_temp; // 2*pi 用于将转/秒转换为弧度/秒
  44. // 计算PID输出的临时值
  45. temp = (error + current_pid_temp->I_Sum) * current_pid_temp->P_Gain;
  46. // 输出限幅
  47. if (temp > current_pid_temp->Max_Output) {
  48. *out_temp = current_pid_temp->Max_Output;
  49. } else if (temp < current_pid_temp->Min_Output) {
  50. *out_temp = current_pid_temp->Min_Output;
  51. } else {
  52. *out_temp = temp;
  53. }
  54. // 更新积分项
  55. current_pid_temp->I_Sum += ((*out_temp - temp) * current_pid_temp->B_Gain + current_pid_temp->I_Gain * error) * SPEED_PID_PERIOD;
  56. }
  57. /**
  58. * @brief 速度PID控制器初始化函数
  59. * @retval 无
  60. */
  61. void speed_pid_initialize(void)
  62. {
  63. // 初始化PID控制器参数
  64. Speed_Pid.P_Gain = SPEED_PI_P; // 设置比例系数
  65. Speed_Pid.I_Gain = SPEED_PI_I; // 设置积分系数
  66. Speed_Pid.B_Gain = SPEED_PI_KB; // 设置反馈系数
  67. Speed_Pid.Max_Output = SPEED_PI_UP_LIMIT; // 设置输出上限
  68. Speed_Pid.Min_Output = SPEED_PI_LOW_LIMIT; // 设置输出下限
  69. Speed_Pid.I_Sum = 0.0f; // 重置积分和
  70. }