tbc.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. /************************************************************************
  2. Project: Welling Motor Control Paltform
  3. Filename: tbc.c
  4. Partner Filename: tbc.h
  5. Description: Time base for current loop
  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. ************************************************************************/
  15. /************************************************************************
  16. Beginning of File, do not put anything above here except notes
  17. Compiler Directives:
  18. *************************************************************************/
  19. #ifndef _TBC_C_
  20. #define _TBC_C_
  21. #endif
  22. /************************************************************************
  23. Included File
  24. *************************************************************************/
  25. #include "syspar.h"
  26. #include "user.h"
  27. #include "FSM_1st.h"
  28. #include "FSM_2nd.h"
  29. #include "spdctrmode.h"
  30. #include "queue.h"
  31. #include "canAppl.h"
  32. #include "alarm.h"
  33. /*************************************************************************
  34. Exported Functions (N/A)
  35. *************************************************************************/
  36. /***************************************************************
  37. Function: tbc_voIsr;
  38. Description: TBC interrupt service
  39. Call by:
  40. Input Variables: N/A
  41. Output/Return Variables: N/A
  42. Subroutine Call: ...;
  43. Reference: N/A
  44. ****************************************************************/
  45. void tbc_voUpIsr(void)
  46. {
  47. /* Uart Monitor */
  48. uart_voAppMonitor();
  49. if( cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER )
  50. {
  51. spi_voResolverLock();
  52. spi_voResolver(&spi_stResolverCoef, &spi_stResolverOut);
  53. }
  54. else if( cp_stFlg.ThetaGetModelSelect == ANG_SWITCHHALL )
  55. {
  56. switchhall_voPosCalTbc();
  57. }
  58. else
  59. {
  60. //do noting
  61. }
  62. /* 1st FSM */
  63. FSM1st_Sys_state.Tbcup_hook();
  64. #ifdef RUN_ARCH_SIM
  65. /* Inject */
  66. SWORD elecOmega = 0;
  67. UWORD gearstate = 0;
  68. INJ_PT(INT16, uart_slSpdRefRpm, 4);
  69. INJ_PT(INT16, spi_stResolverOut.uwSpiThetaPu, 0);
  70. INJ_PT(INT16, elecOmega, 1);
  71. INJ_PT(INT16, gearstate, 5);
  72. MC_ControlCode.GearSt =gearstate;
  73. spi_stResolverOut.swSpdFbkPu = ((SLONG)elecOmega << 15) / cof_uwWebRadps * 10;
  74. /* Watch */
  75. TEST_PT(INT, scm_uwAngParkPu, 0);
  76. TEST_PT(INT, scm_swSpdRefPu, 1);
  77. TEST_PT(INT, scm_stSpdFbkLpf.slY.sw.hi, 2);
  78. TEST_PT(INT, uart_slSpdRefRpm, 3);
  79. TEST_PT(INT, alm_unCode.all, 4);
  80. TEST_PT(INT, adc_stUpOut.uwVdcLpfPu, 5);
  81. TEST_PT(INT, scm_swIqRefPu, 6);
  82. TEST_PT(INT, scm_swIqFdbLpfPu, 7);
  83. TEST_PT(INT, adc_stDownOut.slSampIaPu, 8);
  84. TEST_PT(INT, adc_stDownOut.swIaPu, 9);
  85. TEST_PT(INT, adc_stUpOut.swCalibIaPu, 10);
  86. TEST_PT(INT, crd_stCurParkOut.swQPu, 11);
  87. #endif
  88. }
  89. /***************************************************************
  90. Function: tbc_voIsr;
  91. Description: TBC interrupt service
  92. Call by:
  93. Input Variables: N/A
  94. Output/Return Variables: N/A
  95. Subroutine Call: ...;
  96. Reference: N/A
  97. ****************************************************************/
  98. static BOOL tbc_pvt_blErrorFlag = FALSE;
  99. void tbc_voDownIsr(void)
  100. {
  101. /* ADC Sample with high priority */
  102. adc_voSampleUp_High(&adc_stCof, &adc_stUpOut);
  103. /* Alarm detect */
  104. alm_stIn.blADCInitOvrFlg = sysfsm_stFlg.blADCInitOvrFlg;
  105. alm_stIn.uwIpeakPu = adc_stDownOut.uwIpeakPu; // Q14
  106. alm_stIn.swMotorPwrInWt = scm_swMotorPwrInLpfWt; // unit: 0.1w
  107. alm_stIn.uwIaAbsPu = adc_stDownOut.uwIaAbsPu;
  108. alm_stIn.uwIbAbsPu = adc_stDownOut.uwIbAbsPu; // Q14
  109. alm_stIn.uwIcAbsPu = adc_stDownOut.uwIcAbsPu; // Q14
  110. alm_stIn.swIalhpaPu = crd_stCurClarkOut.swAlphaPu; // Q14
  111. alm_stIn.swIbetaPu = crd_stCurClarkOut.swBetaPu; // Q14
  112. alm_stIn.swIqRefPu = scm_swIqRefPu;
  113. alm_stIn.uwVdcPu = adc_stUpOut.uwVdcLpfPu; // Q14
  114. alm_stIn.uwVdcCompPu = adc_stUpOut.uwVdcLpfPu + BMS_VoltEstimat.uwVdcCompPu; // Q14
  115. alm_stIn.uwSpdFbkLpfAbsPu = scm_uwSpdFbkLpfAbsPu; // Q15
  116. if (scm_swSpdRefPu >= 0)
  117. {
  118. alm_stIn.uwSpdRefAbsPu = (UWORD)scm_swSpdRefPu;
  119. }
  120. else
  121. {
  122. alm_stIn.uwSpdRefAbsPu = (UWORD)(-scm_swSpdRefPu);
  123. }
  124. alm_stIn.uwIPMTempCe = adc_stUpOut.PCBTemp;
  125. alm_stIn.uwIdcOffset = adc_stCof.uwIdcOffset;
  126. // alm_stIn.swDrumSpdAbsNowRpm = uart_swDrumSpdAbsNowRpm;
  127. // alm_stIn.swDrumSpdAbsPreRpm = uart_swDrumSpdAbsPreRpm;
  128. alm_stIn.blSpiThetaFltFlg = spi_stResolverOut.blSpiThetaFltFlg;
  129. alm_voDetecTBC(&alm_stIn, &alm_stDetectTbcCoef);
  130. /* MCU Fault Detect */
  131. if((FALSE == UART_bInsertPendTx)&&(UART_bMonSwitch == FALSE))
  132. {
  133. stl_voTbcProc();
  134. }
  135. /* System FSM */
  136. switch_flg.SysFault_Flag = alm_blAlmOccrFlg;
  137. if (switch_flg.SysFault_Flag == TRUE && tbc_pvt_blErrorFlag == FALSE)
  138. {
  139. tbc_pvt_blErrorFlag = TRUE;
  140. que_stErrorLog.ErrorCode = alm_unCode.all;
  141. que_stErrorLog.RunTime = MC_RunInfo.Ride_Time;
  142. que_stErrorLog.RunInfo = MC_RunInfo;
  143. que_stErrorLog.IqCurrentPu = scm_swIqFdbLpfPu;
  144. que_stErrorLog.IqVoltagePu = scm_swUqRefPu;
  145. que_stErrorLog.IdCurrentPu = scm_swIdFdbLpfPu;
  146. que_stErrorLog.IdVoltagePu = scm_swUdRefPu;
  147. que_ubPushIn(&que_stFlashErrorLog, &que_stErrorLog, 1);//54
  148. }
  149. else if(switch_flg.SysFault_Flag == FALSE)
  150. {
  151. tbc_pvt_blErrorFlag = FALSE;
  152. }
  153. else
  154. {
  155. //do nothing
  156. }
  157. if (adc_stDownOut.blADCCalibFlg && adc_stUpOut.blADCCalibFlg)
  158. {
  159. sysfsm_stFlg.blADCInitOvrFlg = TRUE;
  160. }
  161. else
  162. {
  163. sysfsm_stFlg.blADCInitOvrFlg = FALSE;
  164. }
  165. /* ADC sample */
  166. adc_voSampleDown(&adc_stCof, &adc_stDownOut);
  167. /* ADC Rdson calibration with single resistance*/
  168. adc_voSRCalibration(&adc_stCof, &adc_stUpOut, &adc_stDownOut);
  169. /* System FSM */
  170. FSM1st_Sys_state.TbcDown_hook();
  171. }
  172. /*************************************************************************
  173. Local Functions (N/A)
  174. *************************************************************************/
  175. /*************************************************************************
  176. Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.
  177. All rights reserved.
  178. *************************************************************************/
  179. #ifdef _TBC_C_
  180. #undef _TBC_C_
  181. #endif
  182. /*************************************************************************
  183. End of this File (EOF)!
  184. Do not put anything after this part!
  185. *************************************************************************/