fluxweaken.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. ///************************************************************************
  2. // Project: Welling FAN Motor Developing platform
  3. // Filename: fluxweaken.c
  4. // Partner Filename: fluxweaken.h
  5. // Description: Partner file of fluxweaken.h
  6. // Complier: IAR Embedded Workbench for ARM 7.80, IAR Systems.
  7. // CPU TYPE : ST32F0xx
  8. //*************************************************************************
  9. // Copyright (c) 2019 Welling Motor Technology(Shanghai) Co. Ltd.
  10. // All rights reserved.
  11. //*************************************************************************
  12. //*************************************************************************
  13. // Revising History (ECL of this file):
  14. // 20191225, by cyf, create this file;
  15. //************************************************************************/
  16. //
  17. ///************************************************************************
  18. // Beginning of File, do not put anything above here except notes
  19. // Compiler Directives:
  20. //*************************************************************************/
  21. //#ifndef _FWCTRL_C_
  22. // #define _FWCTRL_C_
  23. //#endif
  24. ///************************************************************************
  25. // Included File:
  26. //*************************************************************************/
  27. //#include "fluxweaken.h"
  28. ///************************************************************************
  29. // Exported Functions:
  30. //*************************************************************************/
  31. ///***************************************************************
  32. // Function: fw_voInit;
  33. // Description: flux weakening initialization
  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 fw_voInit(void)
  41. //{
  42. // fw_stFluxWeakeningOutPu.uwUdcCnt = 0;
  43. // fw_stFluxWeakeningOutPu.uwUdcMinPu = 0;
  44. // fw_stFluxWeakeningOutPu.uwUdcPu = 0;
  45. // fw_stFluxWeakeningOutPu.swEnable = 0;
  46. //
  47. // fw_stFluxWeakeningOutPu.slIdFwoutPu = 0;
  48. // fw_stFluxWeakeningOutPu.swIdFwoutPu = 0;
  49. // fw_stFluxWeakeningOutPu.swVolErrPu = 0;
  50. // fw_stFluxWeakeningOutPu.swFwIqLimPu = cof_swIqMaxPu;
  51. //}
  52. ///***************************************************************
  53. // Function: fw_voFluxWeakeningCoef;
  54. // Description: flux weakening coefficient calculation
  55. // Call by: functions in main loop;
  56. // Input Variables: FW_COFIN
  57. // Output/Return Variables: FW_COF
  58. // Subroutine Call: N/A
  59. // Reference: N/A
  60. //****************************************************************/
  61. // void fw_voFluxWeakeningCoef(FW_COFIN *in,FW_COF *out)
  62. //{
  63. // out->uwKpPu = in->uwKpPu; //Q17
  64. // out->uwKitPu = in->uwKitPu; //Q17
  65. // out->swIdMinPu = in->swIdMinPu; //Q14
  66. // out->swIdCharacterPu = in->swIdCharacterPu; //Q14
  67. // out->swIqMinPu = in->swIqMinPu; //Q14
  68. // out->swIqMaxPu = in->swIqMaxPu; //Q14
  69. //}
  70. ///***************************************************************
  71. // Function: fw_voFluxWeakeningGen
  72. // Description: flux weakening calculation
  73. // Call by: functions in tbc;
  74. // Input Variables: FW_IN
  75. // Output/Return Variables: FW_OUT
  76. // Subroutine Call: N/A
  77. // Reference: N/A
  78. //****************************************************************/
  79. // void fw_voFluxWeakeningGen(FW_IN *in,FW_COF *coef,FW_OUT *out)
  80. //{
  81. // SWORD tmp_swDeltaVolErrPu,tmp_swVolErrPu;
  82. // SLONG tmp_slIdpPu,tmp_slIdiPu,tmp_slIdoutPu,tmp_slIdLimPu;
  83. // SWORD tmp_swThsIqlimPu,tmp_swNxtIqlimPu,tmp_swDltIqlimPu,tmp_swFwIqLimPu;
  84. // UWORD tmp_uwIqValPu,tmp_uwIdAbsPu,tmp_uwIndex;
  85. // SLONG tmp_slIdLowerLimPu;
  86. // SWORD tmp_swIdoutPu;
  87. // /*======================================================
  88. // Bus Voltage calculation because of fluctuation(100Hz)
  89. // ========================================================*/
  90. // if(out->swEnable == 0)
  91. // {
  92. // out->uwUdcPu = in->uwUdcPu;
  93. // out->uwUdcMinPu = in->uwUdcPu;
  94. // out->swEnable = 1;
  95. // }
  96. // if(out->uwUdcCnt > USER_BUS_VOL_PERIOD)
  97. // {
  98. // out->uwUdcCnt = 0;
  99. // out->uwUdcPu = out->uwUdcMinPu;
  100. // out->uwUdcMinPu = in->uwUdcPu;
  101. // }
  102. // else
  103. // {
  104. // if(in->uwUdcPu < out->uwUdcMinPu)
  105. // {
  106. // out->uwUdcMinPu = in->uwUdcPu;
  107. // }
  108. // }
  109. // out->uwUdcCnt++;
  110. // /*==========================================================================
  111. // Flux Weakening (error = k^2*Ubus^2/3 - Ualpha^2 - Ubeta^2)
  112. // ===========================================================================*/
  113. // if(abs(out->swIdFwoutPu) >= USER_FW_COEF_PU_MAX_ABSID_Q14)
  114. // {
  115. // out->uwFwCoefPu = USER_FW_COEF_PU_MAX_Q14;
  116. // }
  117. // else if(abs(out->swIdFwoutPu) > USER_FW_COEF_PU_MIN_ABSID_Q14)
  118. // {
  119. // out->uwFwCoefPu = USER_FW_COEF_PU_MIN_Q14 +
  120. // (((ULONG)abs(out->swIdFwoutPu)*(USER_FW_COEF_PU_MAX_Q14-USER_FW_COEF_PU_MIN_Q14))/(USER_FW_COEF_PU_MAX_ABSID_Q14 -
  121. // USER_FW_COEF_PU_MIN_ABSID_Q14));
  122. // }
  123. // else
  124. // {
  125. // out->uwFwCoefPu = USER_FW_COEF_PU_MIN_Q14;
  126. // }
  127. // tmp_swVolErrPu = ((((ULONG)out->uwUdcPu * out->uwUdcPu>>14)*out->uwFwCoefPu)>>14) - (((SLONG)in->swPwmalphaPu * in->swPwmalphaPu +
  128. // (SLONG)in->swPwmbetaPu * in->swPwmbetaPu)>>14); tmp_swDeltaVolErrPu = tmp_swVolErrPu - out->swVolErrPu; //Q14 out->swVolErrPu =
  129. // tmp_swVolErrPu;
  130. // /*I(k) = I(k-1) + Kp * (Err(k) - Err(k-1)) + Kit * Err(k)*/
  131. // tmp_slIdpPu = (SLONG)tmp_swDeltaVolErrPu * coef->uwKpPu; //calculate P, Q14+Q17=Q31
  132. // tmp_slIdiPu = (SLONG)tmp_swVolErrPu * coef->uwKitPu; //Q14+Q17=Q31
  133. // tmp_slIdoutPu = (out->slIdFwoutPu<<2) + tmp_slIdpPu + tmp_slIdiPu; //Q31
  134. // /*limit Id calculation between -8A~0A*/
  135. // tmp_slIdLowerLimPu = ((SLONG)coef->swIdMinPu)<<17; //Q17+Q14=Q31
  136. // if(tmp_slIdoutPu > 0)
  137. // {
  138. // tmp_slIdoutPu = 0;
  139. // }
  140. // else if(tmp_slIdoutPu < tmp_slIdLowerLimPu)
  141. // {
  142. // tmp_slIdoutPu = tmp_slIdLowerLimPu;
  143. // }
  144. // else
  145. // {
  146. // }
  147. // tmp_swIdoutPu = (SWORD)(tmp_slIdoutPu>>17);
  148. // /*Iq limit Correction when go into Field weakening Area II*/
  149. // tmp_slIdLimPu = ((SLONG)coef->swIdCharacterPu)<<17; //Q17+Q14=Q31
  150. // /*Id output less than Idlimit, limit Iq in MTPV line*/
  151. // if(tmp_swIdoutPu <= coef->swIdCharacterPu)
  152. // {
  153. // out->swFwIqLimPu = fw_swIqLimTab[FW_CNTS-1] + ((((tmp_slIdoutPu - tmp_slIdLimPu)>>17)*USER_DEEP_FW_COEF_Q10)>>10);
  154. // }
  155. // /*Id output greater than Idlimit, limit Iq inside the current circle*/
  156. // else if(tmp_swIdoutPu >= 0)
  157. // {
  158. // out->swFwIqLimPu = coef->swIqMaxPu; //Q14
  159. // }
  160. // else
  161. // {
  162. // tmp_uwIdAbsPu = abs(tmp_slIdoutPu>>17); //Q31-Q17=Q14
  163. // tmp_uwIndex = (tmp_uwIdAbsPu&0x3fff)>>7;//Q14-Q7=Q7=128=Ibase/0.025
  164. // tmp_swThsIqlimPu = fw_swIqLimTab[tmp_uwIndex];
  165. // tmp_swNxtIqlimPu = fw_swIqLimTab[tmp_uwIndex + 1];
  166. // tmp_swDltIqlimPu = tmp_swNxtIqlimPu - tmp_swThsIqlimPu;
  167. // tmp_uwIqValPu = tmp_uwIdAbsPu&0x007f; //Q14-Q7=Q7
  168. // tmp_swFwIqLimPu = (((SLONG)tmp_swDltIqlimPu*tmp_uwIqValPu)>>7) + tmp_swThsIqlimPu;
  169. // out->swFwIqLimPu = tmp_swFwIqLimPu; //Q14
  170. // }
  171. // if(out->swFwIqLimPu < coef->swIqMinPu)
  172. // {
  173. // out->swFwIqLimPu = coef->swIqMinPu;
  174. // }
  175. // /*limit Id output not less than the characteristic current*/
  176. // if(tmp_slIdoutPu < tmp_slIdLimPu)
  177. // {
  178. // tmp_slIdoutPu = tmp_slIdLimPu;
  179. // }
  180. // out->slIdFwoutPu = tmp_slIdoutPu>>2; //Q31-Q2=Q29
  181. // out->swIdFwoutPu = out->slIdFwoutPu>>15;//Q29-Q15=Q14
  182. //}
  183. ///************************************************************************
  184. // Local Functions:
  185. //*************************************************************************/
  186. //
  187. //#ifdef _FWCTRL_C_
  188. // #undef _FWCTRL_C_
  189. //#endif
  190. ///************************************************************************
  191. // Copyright (c) 2019 Welling Motor Technology(Shanghai) Co. Ltd.
  192. // All rights reserved.
  193. //*************************************************************************
  194. // End of this File (EOF)!
  195. // Do not put anything after this part!
  196. //*************************************************************************/