brake.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. /************************************************************************
  2. Project: Welling Motor Control Paltform
  3. Filename: brake.c
  4. Partner Filename: brake.h
  5. Description: The brake process
  6. Complier: IAR Embedded Workbench for ARM 7.80, IAR Systems.
  7. CPU TYPE : GD32F3x0
  8. *************************************************************************
  9. Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.
  10. All rights reserved.
  11. *************************************************************************
  12. *************************************************************************
  13. Revising History (ECL of this file):
  14. WLBDM_M4_SR_20180831-new FSM1.1, by mz, create this file;
  15. ************************************************************************/
  16. /************************************************************************
  17. Beginning of File, do not put anything above here except notes
  18. Compiler Directives:
  19. *************************************************************************/
  20. #ifndef _BRAKE_C_
  21. #define _BRAKE_C_
  22. #endif
  23. /************************************************************************
  24. Included File:
  25. *************************************************************************/
  26. #include "brake.h"
  27. #include "glbcof.h"
  28. /************************************************************************
  29. Exported Functions:
  30. *************************************************************************/
  31. /***************************************************************
  32. Function: cvb_voBrakeInit;
  33. Description: constant voltage brake initial;
  34. Call by: functions in main loop;
  35. Input Variables: N/A;
  36. Output/Return Variables: N/A;
  37. Subroutine Call: N/A;
  38. Reference: N/A;
  39. ****************************************************************/
  40. void cvb_voBrakeInit(void)
  41. {
  42. cvb_stBrakeOut.swIqRefPu = 0;
  43. cvb_stBrakeOut.swIqLimPu = 0;
  44. cvb_stBrakeOut.swIdRefPu = 0;
  45. cvb_stBrakeOut.uwAngelPu = 0;
  46. cvb_stBrakeOut.blCvbFlg = FALSE;
  47. }
  48. /***************************************************************
  49. Function: cvb_voBrakeCoef;
  50. Description: constant voltage brake coefficient initial;
  51. Call by: functions in main loop;
  52. Input Variables: BRAKE_COFIN;
  53. Output/Return Variables: BRAKE_COF;
  54. Subroutine Call: N/A;
  55. Reference: N/A;
  56. ****************************************************************/
  57. void cvb_voBrakeCoef(BRAKE_COFIN *in, BRAKE_COF *coef)
  58. {
  59. UWORD uwDeltaLagVdcPu;
  60. if (in->uwVdcCvbVt > 6000)
  61. {
  62. in->uwVdcCvbVt = 6000;
  63. }
  64. else if (in->uwVdcCvbVt < 100)
  65. {
  66. in->uwVdcCvbVt = 100;
  67. }
  68. if (in->swIqRefMaxAp < 0)
  69. {
  70. in->swIqRefMaxAp = 0;
  71. }
  72. if (in->swIdRefMaxAp > 0)
  73. {
  74. in->swIdRefMaxAp = 0;
  75. }
  76. if (in->swIdRefMinAp > 0)
  77. {
  78. in->swIdRefMinAp = 0;
  79. }
  80. if (in->swIdRefMinAp > in->swIdRefMaxAp)
  81. {
  82. in->swIdRefMinAp = in->swIdRefMaxAp;
  83. }
  84. if (in->uwVBaseVt < 10)
  85. {
  86. in->uwVBaseVt = 10;
  87. }
  88. if (in->uwIBaseAp < 10)
  89. {
  90. in->uwIBaseAp = 10;
  91. }
  92. coef->uwVdcCvbPu = ((ULONG)in->uwVdcCvbVt << 14) / in->uwVBaseVt; // Q14
  93. coef->uwVdcLagAngelPu = ((ULONG)(in->uwVdcCvbVt + 10) << 14) / in->uwVBaseVt;
  94. coef->uwVdcStartCvbPu = ((ULONG)(in->uwVdcCvbVt - 10) << 14) / in->uwVBaseVt;
  95. uwDeltaLagVdcPu = coef->uwVdcLagAngelPu - coef->uwVdcCvbPu; // Q14
  96. coef->swIqLimMaxPu = ((SLONG)in->swIqRefMaxAp << 14) / in->uwIBaseAp; // Q14
  97. coef->swIdRefMaxPu = ((SLONG)in->swIdRefMaxAp << 14) / in->uwIBaseAp; // Q14
  98. coef->swIdRefMinPu = ((SLONG)in->swIdRefMinAp << 14) / in->uwIBaseAp; // Q14
  99. coef->uwKAnglePu = ((((SLONG)5 << 15) / 360) << 7) / uwDeltaLagVdcPu; // Q8
  100. coef->uwLowSpdPu = ((SLONG)(in->uwLowSpdRpm) << 15) / 60 * in->uwMotorPairs / in->uwFBaseHz;
  101. coef->swKcvb = 17 << 9;
  102. coef->swIdDrpPu = 8;
  103. coef->swIdRcyPu = 8;
  104. }
  105. /***************************************************************
  106. Function: cvb_voBrake;
  107. Description: constant voltage brake
  108. Call by: functions in TBC;
  109. Input Variables: BRAKE_IN, BRAKE_COF;
  110. Output/Return Variables: BRAKE_OUT;
  111. Subroutine Call: N/A;
  112. Reference: N/A;
  113. ****************************************************************/
  114. void cvb_voBrake(BRAKE_IN *in, BRAKE_COF *coef, BRAKE_OUT *out)
  115. {
  116. SWORD swDelta;
  117. /*set Iq output limit for Constant Voltage Break*/
  118. if (in->uwVdcLpfPu >= coef->uwVdcStartCvbPu)
  119. {
  120. out->swIqLimPu = (SWORD)in->uwVdcLpfPu - coef->uwVdcCvbPu;
  121. out->swIqLimPu = ((SLONG)out->swIqLimPu * coef->swKcvb) >> 9; // Q14+Q9-Q9=Q14
  122. }
  123. else
  124. {
  125. out->swIqLimPu = -coef->swIqLimMaxPu;
  126. }
  127. if (out->swIqLimPu > 0)
  128. {
  129. out->swIqLimPu = 0;
  130. }
  131. out->swIqLimPu = -out->swIqLimPu;
  132. if (out->swIqLimPu > coef->swIqLimMaxPu)
  133. {
  134. out->swIqLimPu = coef->swIqLimMaxPu;
  135. }
  136. if ((in->uwVdcLpfPu < coef->uwVdcCvbPu) && (coef->swKcvb > 16384) && (out->swIqLimPu == 0)) // avoid overflow
  137. {
  138. out->swIqLimPu = coef->swIqLimMaxPu;
  139. }
  140. /*set Id output for Constant Voltage Break*/
  141. if (in->uwSpdLpfAbsPu < coef->uwLowSpdPu)
  142. {
  143. out->swIdRefPu = in->swIdRefPu;
  144. out->swIdRefPu += coef->swIdRcyPu;
  145. }
  146. else
  147. {
  148. out->swIdRefPu = in->swIdRefPu;
  149. out->swIdRefPu -= coef->swIdDrpPu;
  150. }
  151. /*set Angle output for Constant Voltage Break*/
  152. if (in->uwVdcLpfPu < coef->uwVdcCvbPu)
  153. {
  154. out->uwAngelPu = in->uwAngelPu;
  155. swDelta = 0;
  156. }
  157. else if (in->uwVdcLpfPu < coef->uwVdcLagAngelPu)
  158. {
  159. swDelta = ((SLONG)(in->uwVdcLpfPu - coef->uwVdcCvbPu) * coef->uwKAnglePu) >> 7; // Q15
  160. }
  161. else
  162. {
  163. swDelta = ((SLONG)(coef->uwVdcLagAngelPu - coef->uwVdcCvbPu) * coef->uwKAnglePu) >> 7; // Q15
  164. }
  165. /*Id limit*/
  166. if (out->swIdRefPu > coef->swIdRefMaxPu)
  167. {
  168. out->swIdRefPu = coef->swIdRefMaxPu;
  169. }
  170. else if (out->swIdRefPu < coef->swIdRefMinPu)
  171. {
  172. out->swIdRefPu = coef->swIdRefMinPu;
  173. }
  174. else
  175. {
  176. out->swIdRefPu = out->swIdRefPu;
  177. }
  178. /*Iq limit*/
  179. if (in->swSpdPu > 0)
  180. {
  181. out->swIqLimPu = -out->swIqLimPu;
  182. if (in->swIqRefPu < out->swIqLimPu)
  183. {
  184. out->swIqRefPu = out->swIqLimPu;
  185. }
  186. else
  187. {
  188. out->swIqRefPu = in->swIqRefPu;
  189. }
  190. out->uwAngelPu = in->uwAngelPu - swDelta + cof_sl720DegreePu;
  191. }
  192. else
  193. {
  194. out->swIqLimPu = out->swIqLimPu;
  195. if (in->swIqRefPu > out->swIqLimPu)
  196. {
  197. out->swIqRefPu = out->swIqLimPu;
  198. }
  199. else
  200. {
  201. out->swIqRefPu = in->swIqRefPu;
  202. }
  203. out->uwAngelPu = in->uwAngelPu + swDelta + cof_sl720DegreePu;
  204. }
  205. }
  206. /************************************************************************
  207. Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.
  208. All rights reserved.
  209. *************************************************************************/
  210. #ifdef _BRAKE_C_
  211. #undef _BRAKE_C_
  212. #endif
  213. /*************************************************************************
  214. End of this File (EOF):
  215. !!!!!!Do not put anything after this part!!!!!!!!!!!
  216. *************************************************************************/