hpm_over_zero.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /*
  2. * Copyright (c) 2023 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef HPM_OVER_ZERO_H
  8. #define HPM_OVER_ZERO_H
  9. #include "hpm_common.h"
  10. #if defined(__cplusplus)
  11. extern "C" {
  12. #endif /* __cplusplus */
  13. /**
  14. * @brief Over-zero method fsm
  15. *
  16. */
  17. typedef enum {
  18. hpm_mcl_over_zero_fsm_init = 0, /**< Initialization data */
  19. hpm_mcl_over_zero_fsm_location = 1, /**< Initial phase positioning */
  20. hpm_mcl_over_zero_fsm_running = 2 /**< Normal run */
  21. } hpm_mcl_over_zero_fsm_t;
  22. /**
  23. * @brief Motor Direction
  24. *
  25. */
  26. typedef enum {
  27. hpm_motor_dir_forward = 0, /**< forward */
  28. hpm_motor_dir_reverse = 3 /**< reverse */
  29. } hpm_mcl_dir_t;
  30. typedef enum {
  31. hpm_mcl_interval_init = 0, /**< Initialization */
  32. hpm_mcl_interval_w_down = 1, /**< w down */
  33. hpm_mcl_interval_v_up = 2, /**< v up */
  34. hpm_mcl_interval_u_down = 3, /**< u down */
  35. hpm_mcl_interval_w_up = 4, /**< w up */
  36. hpm_mcl_interval_v_down = 5, /**< v down */
  37. hpm_mcl_interval_u_up = 6, /**< u up */
  38. } hpm_mcl_over_zero_interval_t;
  39. /**
  40. * @brief Over-zero method configuration data
  41. *
  42. */
  43. typedef struct hpm_mcl_over_zero_cfg {
  44. int32_t adc_u; /**< adc u value */
  45. int32_t adc_v; /**< adc v value */
  46. int32_t adc_w; /**< adc w value */
  47. uint32_t number_consecutive_zeros; /**< Number of consecutive zero passes any phase */
  48. uint32_t number_consecutive_zeros_w; /**< Number of consecutive zero passes w phase */
  49. uint32_t delay_degree_30; /**< Thirty-degree delay value */
  50. uint32_t last_interval_tick; /**< The cycle interval of the last commutation is used to deduce the moment of the next commutation of 30 degrees */
  51. uint32_t interval_tick; /**< interval ticks */
  52. hpm_mcl_dir_t motor_dir; /**< Motor Direction forward: Positive(1-6), reverse Reverse(6-1) */
  53. uint8_t adc_zero_ph; /**< Phase of adc over zero 1: u, 2: v, 3: w*/
  54. hpm_mcl_over_zero_interval_t last_interval; /**< last interval */
  55. hpm_mcl_over_zero_interval_t next_interval; /**< next interval */
  56. uint32_t speed_tick; /**< Speed count, unit cycle */
  57. hpm_mcl_over_zero_interval_t interval; /**< The phase sequence number corresponding to the passing zero point */
  58. uint8_t pole_num; /**< Number of motor pole pairs */
  59. float loop_time_in_sec; /*< Time interval to get the position, unit: s*/
  60. hpm_mcl_over_zero_fsm_t fsm;
  61. } hpm_mcl_over_zero_cfg_t;
  62. /**
  63. * @brief Filtering and phase-locked loop parameters
  64. *
  65. */
  66. typedef struct hpm_mcl_over_zero_spd_par {
  67. float speed; /**< speed */
  68. float err; /**< speed error */
  69. float err_last; /**< Last error */
  70. float filter_coef; /**< Low-pass filter, filter coefficient */
  71. float speedout; /**< Post-processing speed */
  72. float kp; /**< pi kp */
  73. float ki; /**< pi ki */
  74. float mem; /**< integral storage space */
  75. float integral_max; /**< integral max */
  76. float integral_min; /**< integral min */
  77. float output_max; /**< output max */
  78. float output_min; /**< output min*/
  79. void (*func_getspd)(void *str);
  80. } hpm_mcl_over_zero_spd_para_t;
  81. /**
  82. * @brief Speed PID control
  83. *
  84. */
  85. typedef struct hpm_mcl_over_zero_pi_par {
  86. float kp; /**< Kp */
  87. float ki; /**< Ki */
  88. float kd; /**< Kd */
  89. float integral_max; /**< integral max */
  90. float integral_min; /**< integral min */
  91. float output_max; /**< output max */
  92. float output_min; /**< output min */
  93. float target; /**< Target parameters */
  94. float mem; /**< integral Data */
  95. float cur; /**< Sampling data */
  96. float outval; /**< Output Data */
  97. void (*func_pid)(void *str); /**< Pid function */
  98. } hpm_mcl_over_zero_pi_para_t;
  99. /**
  100. * @brief Get commutation position
  101. *
  102. * @param[inout] cfg @ref hpm_mcl_over_zero_cfg_t
  103. * @return Current commutation interval
  104. */
  105. int8_t hpm_mcl_over_zero_step_get(hpm_mcl_over_zero_cfg_t *cfg);
  106. /**
  107. * @brief Speed filter
  108. *
  109. * @param[inout] par @ref hpm_mcl_over_zero_spd_para_t
  110. * @return speed value
  111. */
  112. float hpm_mcl_over_zero_speed_filter(hpm_mcl_over_zero_spd_para_t *par);
  113. /**
  114. * @brief pwm output for different angle intervals
  115. *
  116. * @param[in] motorindex motor index
  117. * @param[in] step angle intervals
  118. */
  119. void hpm_mcl_over_zero_pwm_ctrl(uint8_t motorindex, uint8_t step);
  120. /**
  121. * @brief alculating speed by clock cycles
  122. *
  123. * @param[inout] cfg @ref hpm_mcl_over_zero_cfg_t
  124. * @return speed raw value
  125. */
  126. float hpm_mcl_over_zero_cal_speed(hpm_mcl_over_zero_cfg_t *cfg);
  127. /**
  128. * @brief Speed pi control
  129. *
  130. * @param[in] par @ref hpm_mcl_over_zero_pi_para_t
  131. * @return pwm duty cycle
  132. */
  133. float hpm_mcl_over_zero_pi_contrl(hpm_mcl_over_zero_pi_para_t *par);
  134. #if defined(__cplusplus)
  135. }
  136. #endif /* __cplusplus */
  137. #endif