spdctrFSM.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. /************************************************************************
  2. Project: Welling Motor Control Paltform
  3. Filename: sysfsm.c
  4. Partner Filename: sysfsm.h
  5. Description: System finite state machine
  6. Complier: IAR Embedded Workbench for ARM 7.80.4
  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 _STARTFSM_C_
  20. #define _STARTFSM_C_
  21. #endif
  22. /************************************************************************
  23. Include File
  24. ************************************************************************/
  25. #include "syspar.h"
  26. #include "user.h"
  27. #include "FSM_1st.h"
  28. #include "FSM_2nd.h"
  29. #include "spdctrFSM.h"
  30. #include "switchhall.h"
  31. #include "spi_master.h"
  32. #include "cmdgennew.h"
  33. #include "power.h"
  34. #include "sys_ctrl.h"
  35. #include "can.h"
  36. #include "canAppl.h"
  37. #include "string.h"
  38. /************************************************************************
  39. Constant Table:
  40. ************************************************************************/
  41. UWORD T_rotate_count = 0;
  42. UWORD T_rotateDelay_count = 0;
  43. UWORD T_rotateCoef = 0;
  44. UWORD T_rotateDelayCoef = 0;
  45. UWORD uwAngle = 0;
  46. UWORD uwAngle_sector = 0;
  47. UWORD Angle[44] = {0};//0-SpiThetaOrigin;1-SpiThetaNow;2-44:Angle
  48. UWORD AngleGet_count = 2;
  49. /************************************************************************
  50. Exported Functions:
  51. ************************************************************************/
  52. void InitPosDet_TbcupHook(void)
  53. {
  54. scm_ulStatCt++;
  55. align_stIn.ulStatCt = scm_ulStatCt;
  56. align_voInitPos(&align_stIn, &align_stCoef, &align_stOut);
  57. scm_slIdRefPu = align_stOut.slIdRefPu; // Q29
  58. scm_swIdRefPu = align_stOut.swIdRefPu; // Q14
  59. scm_swIqRefPu = align_stOut.swIqRefPu; // Q14
  60. scm_uwAngRefPu = align_stOut.uwAngRefPu; // Q15
  61. }
  62. void ParDet_TbcupHook(void)
  63. {}
  64. void StartUp_TbcupHook(void)
  65. {
  66. flx_stCtrlOut.swIqLimPu = (SWORD)cof_uwCurMaxPu;
  67. scm_ulStatCt++;
  68. align_stIn.ulStatCt = scm_ulStatCt;
  69. align_stIn.swRotateDir = scm_swRotateDir;
  70. align_voStartUp(&align_stIn, &align_stCoef, &align_stOut);
  71. scm_slDragSpdRefPu = align_stOut.slDragSpdRefPu;
  72. scm_slDragSpdPu = align_stOut.slDragSpdPu;
  73. scm_swIdRefPu = align_stOut.swIdRefPu;
  74. scm_swIqRefPu = align_stOut.swIqRefPu;
  75. scm_slAngManuPu = align_stOut.slAngManuPu;
  76. // scm_uwAngRefPu = align_stOut.uwAngRefPu;
  77. scm_StartUpOvrFlg = align_stOut.blStartUpOvrFlg;
  78. if(AngleTest == TRUE)
  79. {
  80. scm_swIdRefPu = align_stCoef.uwDragCurPu;
  81. scm_swIqRefPu = 0;
  82. scm_uwAngRefPu = StartUp_SpiSensorTest();
  83. }
  84. else
  85. {
  86. scm_uwAngRefPu = align_stOut.uwAngRefPu;
  87. }
  88. }
  89. void Open2Clz_TbcupHook(void)
  90. {
  91. flx_stCtrlOut.swIqLimPu = (SWORD)cof_uwCurMaxPu;
  92. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  93. {
  94. align_stIn.uwObsElecThetaPu = obs_stObsOutPu.uwElecThetaPu;
  95. }
  96. else if(cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER)
  97. {
  98. align_stIn.uwObsElecThetaPu = spi_stResolverOut.uwSpiThetaPu;
  99. }
  100. else if(cp_stFlg.ThetaGetModelSelect == ANG_SWITCHHALL)
  101. {
  102. align_stIn.uwObsElecThetaPu = switchhall_stOut.uwLowThetaPu;
  103. }
  104. else
  105. {
  106. //do nothing
  107. }
  108. align_stIn.swCurRefrompu = swCurRefrompu; // swCurRefrompu;
  109. align_voOpen2Clz(&align_stIn, &align_stCoef, &align_stOut);
  110. scm_swIdRefPu = align_stOut.swIdRefPu;
  111. scm_swIqRefPu = align_stOut.swIqRefPu;
  112. scm_blCurSwitchOvrFlg = align_stOut.blCurSwitchOvrFlg;
  113. scm_blAngSwitchOvrFlg = align_stOut.blAngSwitchOvrFlg;
  114. scm_slAngManuPu = align_stOut.slAngManuPu;
  115. scm_uwAngManuPu = align_stOut.uwAngManuPu;
  116. scm_uwAngRefPu = align_stOut.uwAngRefPu;
  117. }
  118. void ClzLoop_TbcupHook(void)
  119. {
  120. /*=======================================================================
  121. Flux weakening
  122. =======================================================================*/
  123. flx_stCtrlIn.swUalphaPu = crd_stVltIParkOut.swAlphaPu; // Q14
  124. flx_stCtrlIn.swUbetaPu = crd_stVltIParkOut.swBetaPu; // Q14
  125. flx_stCtrlIn.uwVdcPu = adc_stUpOut.uwVdcLpfPu; // Q14
  126. flx_stCtrlIn.swIqRefPu = swCurRefrompu; // Q14
  127. flx_stCtrlIn.swUqRefPu = scm_swUqRefPu; // Q14
  128. flx_voCtrl(&flx_stCtrlIn, &flx_stCtrlCoef, &flx_stCtrlOut);
  129. /*=======================================================================
  130. Power Limit
  131. =======================================================================*/
  132. mth_voLPFilter(adc_stUpOut.PCBTemp, &scm_stPCBTempLpf);
  133. pwr_stPwrLimIn.swMotorPwrPu = scm_stMotoPwrInLpf.slY.sw.hi; // Q15
  134. pwr_stPwrLimIn.swPCBTemp = scm_stPCBTempLpf.slY.sw.hi;
  135. pwr_voPwrLimPI(&pwr_stPwrLimIn, &pwr_stPwrLimCof, &pwr_stPwrLimOut2); // Q14
  136. /*=======================================================================
  137. Set Iq and Id reference for Constant Voltage Break
  138. =======================================================================*/
  139. cvb_stBrakeIn.uwVdcLpfPu = adc_stUpOut.uwVdcLpfPu;
  140. cvb_stBrakeIn.swIdRefPu = scm_swIdRefPu;
  141. cvb_stBrakeIn.swIqRefPu = swCurRefrompu;
  142. cvb_stBrakeIn.swSpdPu = scm_stSpdFbkLpf.slY.sw.hi;
  143. cvb_stBrakeIn.uwAngelPu = scm_uwAngRefPu;
  144. cvb_stBrakeIn.uwSpdLpfAbsPu = scm_uwSpdFbkLpfAbsPu;
  145. cvb_voBrake(&cvb_stBrakeIn,&cvb_stBrakeCoef,&cvb_stBrakeOut);
  146. /** Idref可变范围-3A~0A且未弱磁,暂不做过多处理;Angle在down中更新,暂不改为改为恒压制动角度 **/
  147. if(cvb_stBrakeIn.uwVdcLpfPu >= cvb_stBrakeCoef.uwVdcStartCvbPu)
  148. {
  149. scm_swIdRefPu = cvb_stBrakeOut.swIdRefPu;
  150. }
  151. else
  152. {
  153. scm_swIdRefPu = flx_stCtrlOut.swIdRefPu; //0; //
  154. }
  155. scm_swIqRefPu = cvb_stBrakeOut.swIqRefPu;
  156. }
  157. void Stop_TbcupHook(void)
  158. {}
  159. void InitPosDet_TbcdownHook(void)
  160. {
  161. /* Get angle for park transformation */
  162. scm_uwAngParkPu = scm_uwAngRefPu; // Q15
  163. scm_uwAngIParkPu = scm_uwAngParkPu;
  164. /*=======================================================================
  165. Current decoupling
  166. =======================================================================*/
  167. acr_stUdqDcpOut.swUdPu = 0;
  168. acr_stUdqDcpOut.swUqPu = 0;
  169. }
  170. void ParDet_TbcdownHook(void)
  171. {
  172. /* Get angle for park transformation */
  173. scm_uwAngParkPu = scm_uwAngRefPu; // Q15
  174. scm_uwAngIParkPu = scm_uwAngParkPu;
  175. /*=======================================================================
  176. Current decoupling
  177. =======================================================================*/
  178. acr_stUdqDcpOut.swUdPu = 0;
  179. acr_stUdqDcpOut.swUqPu = 0;
  180. }
  181. void StartUp_TbcdownHook(void)
  182. {
  183. /* Speed feedback LPF */
  184. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  185. {
  186. mth_voLPFilter(obs_stObsOutPu.swElecFreqPu, &scm_stSpdFbkLpf);
  187. obs_stObsCalcIn.swUalphaPu = scm_swUalphaPu; // Q14
  188. obs_stObsCalcIn.swUbetaPu = scm_swUbetaPu; // Q14
  189. obs_stObsCalcIn.swIalphaPu = crd_stCurClarkOut.swAlphaPu; // Q14
  190. obs_stObsCalcIn.swIbetaPu = crd_stCurClarkOut.swBetaPu; // Q14
  191. obs_stObsCalcIn.uwVdcPu = adc_stUpOut.uwVdcLpfPu;
  192. obs_voObsCalc(&obs_stObsCalcIn, &obs_stObsCoefPu, &obs_stObsOutPu);
  193. }
  194. else if(cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER)
  195. {
  196. mth_voLPFilter(spi_stResolverOut.swSpdFbkPu, &scm_stSpdFbkLpf);
  197. }
  198. else if(cp_stFlg.ThetaGetModelSelect == ANG_SWITCHHALL)
  199. {
  200. scm_stSpdFbkLpf.slY.sw.hi = switchhall_stOut.swLowSpdLpfPu;
  201. }
  202. else
  203. {
  204. //do nothing
  205. }
  206. /* Speed feedback Absolute */
  207. scm_uwSpdFbkLpfAbsPu = (UWORD)ABS(scm_stSpdFbkLpf.slY.sw.hi); // Q15
  208. /* Get angle for park transformation */
  209. scm_uwAngParkPu = scm_uwAngRefPu; // Q15
  210. scm_uwAngIParkPu = scm_uwAngParkPu;
  211. /*=======================================================================
  212. Current decoupling
  213. =======================================================================*/
  214. acr_stUdqDcpOut.swUdPu = 0;
  215. acr_stUdqDcpOut.swUqPu = 0;
  216. }
  217. void Open2Clz_TbcdownHook(void)
  218. {
  219. /* Speed feedback LPF */
  220. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  221. {
  222. obs_stObsCalcIn.swUalphaPu = scm_swUalphaPu; // Q14
  223. obs_stObsCalcIn.swUbetaPu = scm_swUbetaPu; // Q14
  224. obs_stObsCalcIn.swIalphaPu = crd_stCurClarkOut.swAlphaPu; // Q14
  225. obs_stObsCalcIn.swIbetaPu = crd_stCurClarkOut.swBetaPu; // Q14
  226. obs_stObsCalcIn.uwVdcPu = adc_stUpOut.uwVdcLpfPu;
  227. obs_voObsCalc(&obs_stObsCalcIn, &obs_stObsCoefPu, &obs_stObsOutPu);
  228. mth_voLPFilter(obs_stObsOutPu.swElecFreqPu, &scm_stSpdFbkLpf);
  229. }
  230. else if(cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER)
  231. {
  232. mth_voLPFilter(spi_stResolverOut.swSpdFbkPu, &scm_stSpdFbkLpf);
  233. }
  234. else if(cp_stFlg.ThetaGetModelSelect == ANG_SWITCHHALL)
  235. {
  236. scm_stSpdFbkLpf.slY.sw.hi = switchhall_stOut.swLowSpdLpfPu;
  237. }
  238. else
  239. {
  240. //do nothing
  241. }
  242. /* Speed feedback Absolute */
  243. scm_uwSpdFbkLpfAbsPu = (UWORD)ABS(scm_stSpdFbkLpf.slY.sw.hi); // Q15
  244. /* Get angle for park transformation */
  245. scm_uwAngParkPu = scm_uwAngRefPu; // Q15
  246. scm_uwAngIParkPu = scm_uwAngParkPu;
  247. /*=======================================================================
  248. Current decoupling
  249. =======================================================================*/
  250. acr_stUdqDcpOut.swUdPu = 0;
  251. acr_stUdqDcpOut.swUqPu = 0;
  252. }
  253. void ClzLoop_TbcdownHook(void)
  254. {
  255. ULONG ulTmp1;
  256. SWORD swAngCompPu = 0; // Q15
  257. /* Speed feedback LPF */
  258. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  259. {
  260. obs_stObsCalcIn.swUalphaPu = scm_swUalphaPu; // Q14
  261. obs_stObsCalcIn.swUbetaPu = scm_swUbetaPu; // Q14
  262. obs_stObsCalcIn.swIalphaPu = crd_stCurClarkOut.swAlphaPu; // Q14
  263. obs_stObsCalcIn.swIbetaPu = crd_stCurClarkOut.swBetaPu; // Q14
  264. obs_stObsCalcIn.uwVdcPu = adc_stUpOut.uwVdcLpfPu;
  265. obs_voObsCalc(&obs_stObsCalcIn, &obs_stObsCoefPu, &obs_stObsOutPu);
  266. mth_voLPFilter(obs_stObsOutPu.swElecFreqPu, &scm_stSpdFbkLpf);
  267. scm_uwAngRefPu = obs_stObsOutPu.uwElecThetaPu;
  268. }
  269. else if(cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER)
  270. {
  271. mth_voLPFilter(spi_stResolverOut.swSpdFbkPu, &scm_stSpdFbkLpf);
  272. scm_uwAngRefPu = spi_stResolverOut.uwSpiThetaPu;
  273. }
  274. else if(cp_stFlg.ThetaGetModelSelect == ANG_SWITCHHALL)
  275. {
  276. mth_voLPFilter(switchhall_stOut.swLowSpdPu, &scm_stSpdFbkLpf);
  277. scm_uwAngRefPu = switchhall_stOut.uwLowThetaPu;
  278. }
  279. else
  280. {
  281. //do nothing
  282. }
  283. /* Speed feedback Absolute */
  284. scm_uwSpdFbkLpfAbsPu = (UWORD)ABS(scm_stSpdFbkLpf.slY.sw.hi); // Q15
  285. /* Get angle for park transformation */
  286. scm_uwAngParkPu = scm_uwAngRefPu; // Q15
  287. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  288. {
  289. swAngCompPu = (SWORD)(((SLONG)obs_stObsOutPu.swElecFreqPu * TBC_TM) >> 10); // Q15
  290. }
  291. else if(cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER)
  292. {
  293. swAngCompPu = (SWORD)(((SLONG)spi_stResolverOut.swSpdFbkPu * TBC_TM) >> 10); // Q15
  294. }
  295. else if(cp_stFlg.ThetaGetModelSelect == ANG_SWITCHHALL)
  296. {
  297. swAngCompPu = (SWORD)(((SLONG)switchhall_stOut.swLowSpdPu * TBC_TM) >> 10); // Q15
  298. }
  299. else
  300. {
  301. //do nothing
  302. }
  303. ulTmp1 = scm_uwAngParkPu + ((swAngCompPu * 3) >> 1) + cof_sl720DegreePu;
  304. scm_uwAngIParkPu = (UWORD)(ulTmp1 & 0x7FFF);
  305. /*=======================================================================
  306. Current decoupling
  307. =======================================================================*/
  308. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  309. {
  310. acr_stUdqDcpIn.swWsPu = scm_stSpdFbkLpf.slY.sw.hi; // Q15
  311. }
  312. else if(cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER)
  313. {
  314. acr_stUdqDcpIn.swWsPu = spi_stResolverOut.swSpdFbkPu; // Q15 swSpdFbkLpfPu spi_stResolverOut.swSpdFbkPu
  315. }
  316. else
  317. {
  318. //do nothing
  319. }
  320. acr_stUdqDcpIn.swIdRefPu = scm_swIdFdbLpfPu;//scm_swIdRefPu scm_swIdFdbLpfPu // Q14
  321. acr_stUdqDcpIn.swIqRefPu = scm_swIqFdbLpfPu; //scm_swIqRefPu scm_swIqFdbLpfPu // Q14
  322. acr_stUdqDcpIn.swUdqLimPu = scm_swVsDcpLimPu; // Q14
  323. acr_voUdqDcp(&acr_stUdqDcpIn, &acr_stUdqDcpCoef, &acr_stUdqDcpOut);
  324. }
  325. void Stop_TbcdownHook(void)
  326. {
  327. scm_swIdRefPu = 0;
  328. scm_swIqRefPu = 0;
  329. sysctrl_voPwmInit();
  330. cmfsm_stFlg.blMotorStopFlg = TRUE;
  331. }
  332. void InitPosDet_TbsHook(void)
  333. {}
  334. void ParDet_TbsHook(void)
  335. {}
  336. void StartUp_TbsHook(void)
  337. {
  338. /*=======================================================================
  339. Speed PI output limit in "OpenDrg"
  340. =======================================================================*/
  341. if ((curSpeed_state.state == StartUp) && (scm_uwStartMd == START_ALIGN))
  342. {
  343. if (scm_swRotateDir * asr_stSpdPIOut.slIqRefPu < 0)
  344. {
  345. asr_stSpdPIOut.slIqRefPu = 0; // Q30
  346. asr_stSpdPIOut.slIqSumPu = 0; // Q30
  347. asr_stSpdPIOut.slIqiPu = 0;
  348. }
  349. else
  350. {
  351. if (scm_swRotateDir * asr_stSpdPIOut.slIqRefPu > ((SLONG)mn_uwDragCurPu << 16)) // Q30
  352. {
  353. asr_stSpdPIOut.slIqRefPu = scm_swRotateDir * ((SLONG)mn_uwDragCurPu << 16); // Q30
  354. asr_stSpdPIOut.slIqiPu = scm_swRotateDir * ((SLONG)mn_uwDragCurPu << 16); // Q14+Q16=Q30
  355. }
  356. }
  357. }
  358. }
  359. void Open2Clz_TbsHook(void)
  360. {}
  361. void ClzLoop_TbsHook(void)
  362. {}
  363. void Stop_TbsHook(void)
  364. {}
  365. void scm_voSpdCtrMdFSM(void) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
  366. {
  367. switch (curSpeed_state.state)
  368. {
  369. case Charge:
  370. break;
  371. case InitPosDet:
  372. /* Command run disable */
  373. /* Motor run flag set */
  374. cmfsm_stFlg.blMotorStopFlg = FALSE;
  375. if (!switch_flg.SysRun_Flag || switch_flg.SysFault_Flag || power_stPowStateOut.powerstate == POWER_OFF)
  376. {
  377. Switch_speed_FSM(&Stop_state);
  378. }
  379. if (scm_ulStatCt < mn_ulAlignRampTbcCt)
  380. {}
  381. else if (scm_ulStatCt >= (mn_ulAlignRampTbcCt + mn_ulAlignHoldTbcCt + 10))
  382. {
  383. if(cp_stFlg.SpiOffsetFirstSetFlg == 0)
  384. {
  385. cp_stFlg.SpiOffsetFirstSetFinishFlg = 1;
  386. }
  387. else
  388. {
  389. if(cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER)
  390. {
  391. align_stCoef.uwSPIreadOnceCt = 0;
  392. }
  393. else
  394. {}
  395. if(cp_stFlg.RunModelSelect == InitPos)
  396. {
  397. }
  398. else if(cp_stFlg.RunModelSelect == ClZLOOP)
  399. {
  400. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  401. {
  402. Switch_speed_FSM(&StartUp_state);
  403. }
  404. else
  405. {
  406. Switch_speed_FSM(&ClzLoop_state);
  407. }
  408. }
  409. else
  410. {
  411. Switch_speed_FSM(&StartUp_state);
  412. }
  413. }
  414. }
  415. else
  416. {
  417. //do nothing
  418. }
  419. break;
  420. case StartUp:
  421. if (!switch_flg.SysRun_Flag || switch_flg.SysFault_Flag || power_stPowStateOut.powerstate == POWER_OFF)
  422. {
  423. Switch_speed_FSM(&Stop_state);
  424. }
  425. if (scm_StartUpOvrFlg == TRUE)
  426. {
  427. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  428. {
  429. if(cp_stFlg.RunModelSelect == ClZLOOP || cp_stFlg.RunModelSelect == CityBIKE || cp_stFlg.RunModelSelect == MountainBIKE)
  430. {
  431. if (FSM2nd_Run_state.state == Boost)
  432. {
  433. cmd_stCmdOut.slIntRefPu = ((SLONG)scm_stSpdFbkLpf.slY.sw.hi * 5) << 12; // Q29 5/4
  434. }
  435. else if (FSM2nd_Run_state.state == Assistance)
  436. {
  437. //do nothing
  438. }
  439. else
  440. {
  441. //do nothing
  442. }
  443. Switch_speed_FSM(&Open2Clz_state);
  444. }
  445. }
  446. else
  447. {
  448. }
  449. }
  450. /* Command run disable */
  451. break;
  452. case Open2Clz:
  453. /* Command run disable */
  454. if (!switch_flg.SysRun_Flag || switch_flg.SysFault_Flag || power_stPowStateOut.powerstate == POWER_OFF)
  455. {
  456. Switch_speed_FSM(&Stop_state);
  457. }
  458. /* Switch over */
  459. if (scm_blCurSwitchOvrFlg && scm_blAngSwitchOvrFlg)
  460. {
  461. Switch_speed_FSM(&ClzLoop_state);
  462. }
  463. break;
  464. case ClzLoop:
  465. /* Go to stop */
  466. cmfsm_stFlg.blMotorStopFlg = FALSE;
  467. if (switch_flg.SysFault_Flag == 1 || power_stPowStateOut.powerstate == POWER_OFF)
  468. {
  469. Switch_speed_FSM(&Stop_state);
  470. }
  471. if (!switch_flg.SysRun_Flag)
  472. {
  473. /* Go to stop */
  474. if ((ABS(scm_swSpdRefPu) < mn_swStopSpdRefPu) && (scm_uwSpdFbkLpfAbsPu < mn_swStopSpdRefPu))
  475. {
  476. scm_swIdRefPu = 0;
  477. scm_swIqRefPu = 0;
  478. Switch_speed_FSM(&Stop_state);
  479. }
  480. if (uart_swTorqRefNm == 0)
  481. {
  482. scm_swIdRefPu = 0;
  483. scm_swIqRefPu = 0;
  484. Switch_speed_FSM(&Stop_state);
  485. }
  486. }
  487. else
  488. {}
  489. break;
  490. case Stop:
  491. if (switch_flg.SysRun_Flag == TRUE && switch_flg.SysFault_Flag == FALSE) //&& power_stPowStateOut.powerstate == POWER_ON_END
  492. {
  493. scm_voSpdCtrMdInit();
  494. if(cp_stFlg.SpiOffsetFirstSetFlg == 0)
  495. {
  496. Switch_speed_FSM(&InitPosDet_state);
  497. }
  498. else
  499. {
  500. if(cp_stFlg.RunModelSelect == CityBIKE || cp_stFlg.RunModelSelect == MountainBIKE)
  501. {
  502. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  503. {
  504. Switch_speed_FSM(&InitPosDet_state);
  505. }
  506. else
  507. {
  508. Switch_speed_FSM(&ClzLoop_state);
  509. }
  510. }
  511. else
  512. {
  513. #ifdef RUN_ARCH_SIM
  514. Switch_speed_FSM(&ClzLoop_state);
  515. #else
  516. Switch_speed_FSM(&InitPosDet_state);
  517. #endif
  518. }
  519. }
  520. }
  521. break;
  522. default:
  523. break;
  524. }
  525. }
  526. void Switch_speed_FSM(const SPD_STATE_HOOK *in)
  527. {
  528. scm_ulStatCt = 0;
  529. curSpeed_state = *in;
  530. }
  531. void Switch_speed_FSMInit(void)
  532. {
  533. scm_ulStatCt = 0;
  534. curSpeed_state = Stop_state;
  535. }
  536. UWORD StartUp_SpiSensorTest(void)
  537. {
  538. T_rotateCoef = 8*1000/cp_stControlPara.swDragSpdHz/6;
  539. T_rotateDelayCoef = T_rotateCoef*50;
  540. if(T_rotate_count > 0)
  541. {
  542. T_rotateDelay_count++;
  543. if(T_rotateDelay_count == T_rotateDelayCoef)
  544. {
  545. Angle[AngleGet_count] = spi_stResolverOut.uwSpiThetaPu;
  546. AngleGet_count++;
  547. if(AngleGet_count >= 44)
  548. {
  549. AngleTest = FALSE;
  550. Switch_speed_FSM(&Stop_state);
  551. AngleGet_count = 2;
  552. MC_MotorSPD_rpm_Percent = 0;
  553. cp_stFlg.RunModelSelect = MC_UpcInfo.stTestParaInfo.RunModelSelect;
  554. memcpy((UBYTE*)(Angle), (UBYTE*)(&spi_stResolverOut.swSpiThetaOffsetOrignPu), (uint32_t)2);
  555. memcpy((UBYTE*)(Angle+1), (UBYTE*)(&spi_stResolverOut.swSpiThetaOffsetPu), (uint32_t)2);
  556. SendData(ID_MC_TO_CDL, MODE_REPORT, 0xBF58, (UBYTE *)&Angle[0]);
  557. }
  558. T_rotate_count = 0;
  559. T_rotateDelay_count = 0;
  560. uwAngle_sector++;
  561. if(uwAngle_sector==6)
  562. {
  563. uwAngle_sector = 0;
  564. }
  565. }
  566. }
  567. else
  568. {
  569. if(uwAngle < ((uwAngle_sector+1)*cof_sl60DegreePu - (scm_slDragSpdPu * TBC_TM >> 10)))
  570. {
  571. uwAngle += ((SQWORD)scm_slDragSpdPu * TBC_TM >> 10);
  572. }
  573. else
  574. {
  575. T_rotate_count++;
  576. uwAngle = (uwAngle_sector+1)*cof_sl60DegreePu;
  577. if (uwAngle >= cof_sl360DegreePu)
  578. {
  579. uwAngle -= cof_sl360DegreePu;
  580. }
  581. }
  582. }
  583. return uwAngle;
  584. }
  585. /************************************************************************
  586. Function: void RUN_FSM_Main(void)
  587. Description:
  588. Call by:
  589. Input Variables:
  590. Output/Return Variables:
  591. Subroutine Call:
  592. Reference:
  593. ************************************************************************/
  594. /************************************************************************
  595. Local Functions: N/A
  596. ************************************************************************/
  597. /************************************************************************
  598. Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.
  599. All rights reserved.
  600. ************************************************************************/
  601. #ifdef _STARTFSM_C_
  602. #undef _STARTFSM_C_ /* parasoft-suppress MISRA2004-19_6 "本项目中无法更改,后续避免使用" */
  603. #endif
  604. /************************************************************************
  605. End of this File (EOF)!
  606. Do not put anything after this part!
  607. ************************************************************************/