AddFunction.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #include <MyProject.h>
  2. bool isCtrlPowOn = false; ///< 开关机控制
  3. FOCCTRL xdata mcFocCtrl;
  4. MCRAMP xdata mcRefRamp;
  5. int16 refRampOut = 0;
  6. /**
  7. @brief 对变量取16位的绝对值
  8. @param[in] value
  9. @return 绝对值
  10. @date 2022-07-13
  11. */
  12. uint16 Abs_F16(int16 value)
  13. {
  14. if (value < 1)
  15. {
  16. return (-value);
  17. }
  18. else
  19. {
  20. return (value);
  21. }
  22. }
  23. /**
  24. @brief 对变量取32位的绝对值
  25. @param[in] value
  26. @return 绝对值
  27. @date 2022-07-13
  28. */
  29. uint32 Abs_F32(int32 value)
  30. {
  31. if (value < 1)
  32. {
  33. return (-value);
  34. }
  35. else
  36. {
  37. return (value);
  38. }
  39. }
  40. /**
  41. @brief 调速信号处理包含:开关机控制、将调速信号处理成控制目标给定信号
  42. @date 2022-07-14
  43. */
  44. void TargetRef_Process(void)
  45. {
  46. #if (SPEED_MODE == NONEMODE)
  47. isCtrlPowOn = true; // 开机
  48. mcFocCtrl.Ref = MOTOR_SPEED_MAX_RPM;
  49. #elif (SPEED_MODE == PWMMODE)
  50. #endif
  51. }
  52. /**
  53. @brief 外部闭环控制函数,示例代码提供 电流环,速度环,功率环,UQ控制示例代码,可根据需要自行修改
  54. 建议使用默认1ms周期运行
  55. @date 2022-07-14
  56. */
  57. void Speed_response(void)
  58. {
  59. uint16 FOC_KSLIDE_Temp = 0;
  60. uint16 FOC_EKLPFMIN_Temp = 0;
  61. if ((mcState == mcRun) || (mcState == mcStop))
  62. {
  63. switch (mcFocCtrl.CtrlMode)
  64. {
  65. case 0:
  66. {
  67. if (mcFocCtrl.SpeedFlt > MOTOR_LOOP_RPM)
  68. {
  69. mcFocCtrl.Mode0HoldCnt++;
  70. if (mcFocCtrl.Mode0HoldCnt > 5)
  71. {
  72. mcFocCtrl.CtrlMode = 1;
  73. FOC_QKP = QKP;
  74. FOC_QKI = QKI;
  75. FOC_DKP = DKP;
  76. FOC_DKI = DKI;
  77. // ClrBit(FOC_CR2,UDD);
  78. mcRefRamp.OutValue_float = S_Value(2000.0);
  79. mcFocCtrl.LoopTime = LOOP_TIME;
  80. mcFocCtrl.IqRef = FOC_IQREF;
  81. FOC_IDREF = 0;
  82. PI1_UKH = IQ_Start_CURRENT;
  83. }
  84. }
  85. else
  86. {
  87. mcFocCtrl.Mode0HoldCnt = 0;
  88. }
  89. }
  90. break;
  91. case 1:
  92. {
  93. mcFocCtrl.LoopTime++;
  94. if (mcFocCtrl.LoopTime >= LOOP_TIME)
  95. {
  96. mcFocCtrl.LoopTime = 0;
  97. refRampOut = Motor_Ramp(mcFocCtrl.Ref);
  98. FOC_IQREF = HW_Zero_Calc(refRampOut - mcFocCtrl.SpeedFlt);
  99. FOC_IDREF = 0;
  100. }
  101. }
  102. break;
  103. }
  104. }
  105. }
  106. /**
  107. @brief 控制给定爬坡函数
  108. 以浮点进行计算,解决整数爬坡由于精度的影响,导致爬坡结果阶梯变化
  109. 函数控制周期默认为闭环控制周期,建议使用默认1ms周期运行
  110. @param[in] ref 给定目标值
  111. @return 爬坡结果(int16)
  112. @date 2022-07-14
  113. */
  114. int16 Motor_Ramp(int16 ref)
  115. {
  116. mcRefRamp.RefValue = ref;
  117. if (mcRefRamp.OutValue_float < mcRefRamp.RefValue)
  118. {
  119. if (mcRefRamp.OutValue_float + mcRefRamp.IncValue < mcRefRamp.RefValue)
  120. {
  121. mcRefRamp.OutValue_float += mcRefRamp.IncValue;
  122. }
  123. else
  124. {
  125. mcRefRamp.OutValue_float = mcRefRamp.RefValue;
  126. }
  127. }
  128. else if (mcRefRamp.OutValue_float > mcRefRamp.RefValue)
  129. {
  130. if (mcRefRamp.OutValue_float - mcRefRamp.DecValue > mcRefRamp.RefValue)
  131. {
  132. mcRefRamp.OutValue_float -= mcRefRamp.DecValue;
  133. }
  134. else
  135. {
  136. mcRefRamp.OutValue_float = mcRefRamp.RefValue;
  137. }
  138. }
  139. else
  140. {
  141. mcRefRamp.OutValue_float = mcRefRamp.RefValue;
  142. }
  143. return (int16)mcRefRamp.OutValue_float; // 输出浮点数取整
  144. }
  145. /**
  146. @brief 启动ATO爬坡函数,用于静止启动时候对ATO进行爬坡,提高启动可靠性
  147. @date 2022-07-14
  148. */
  149. void ATORamp(void)
  150. {
  151. if (mcState == mcRun)
  152. {
  153. if (mcFocCtrl.State_Count == (ATO_RAMP_PERIOD << 2))
  154. {
  155. FOC_EKP = OBSW_KP_GAIN_RUN1; // 估算器里的PI的KP
  156. FOC_EKI = OBSW_KI_GAIN_RUN1; // 估算器里的PI的KI
  157. }
  158. else if (mcFocCtrl.State_Count == ((ATO_RAMP_PERIOD << 1) + ATO_RAMP_PERIOD))
  159. {
  160. FOC_EKP = OBSW_KP_GAIN_RUN2; // 估算器里的PI的KP
  161. FOC_EKI = OBSW_KI_GAIN_RUN2; // 估算器里的PI的KI
  162. }
  163. else if (mcFocCtrl.State_Count == (ATO_RAMP_PERIOD << 1))
  164. {
  165. FOC_EKP = OBSW_KP_GAIN_RUN3; // 估算器里的PI的KP
  166. FOC_EKI = OBSW_KI_GAIN_RUN3; // 估算器里的PI的KI
  167. }
  168. else if (mcFocCtrl.State_Count <= ATO_RAMP_PERIOD && mcFocCtrl.Flg_ATORampEnd == 0)
  169. {
  170. FOC_EKP = OBSW_KP_GAIN_RUN4; // 估算器里的PI的KP
  171. FOC_EKI = OBSW_KI_GAIN_RUN4; // 估算器里的PI的KI
  172. mcFocCtrl.Flg_ATORampEnd = 1; // ATO 爬坡结束
  173. }
  174. }
  175. }
  176. void TickCycle_1ms(void)
  177. {
  178. }