switchhall.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933
  1. /**
  2. * @file switchhall.c
  3. * @author
  4. * @brief
  5. * @version
  6. * @date 2021-11-22
  7. *
  8. * @copyright Copyright (c) 2021
  9. *
  10. */
  11. /************************************************************************
  12. Beginning of File, do not put anything above here except notes
  13. Compiler Directives:
  14. *************************************************************************/
  15. #ifdef RUN_ARCH_SIM
  16. #include "switchhall.h"
  17. void switchhall_voInit(void)
  18. {}
  19. void switchhall_voTim3Int(void)
  20. {}
  21. void switchhall_voPosCalTbc(void)
  22. {}
  23. #else
  24. #include "gd32f30x.h"
  25. #include "typedefine.h"
  26. #include "syspar.h"
  27. #include "hwsetup.h"
  28. #include "glbcof.h"
  29. #include "switchhall.h"
  30. #include "spdctrFSM.h"
  31. #include "spdctrmode.h"
  32. /******************************
  33. *
  34. * Parameter
  35. *
  36. ******************************/
  37. static SWITCHHALL_CAP switchhall_stCap = SWITCHHALL_CAP_DEFAULT;
  38. SWITCHHALL_OUT switchhall_stOut = SWITCHHALL_OUT_DEFAULT;
  39. /***************************************************************
  40. Function:
  41. Description:
  42. Call by:
  43. Input Variables:
  44. Output/Return Variables:
  45. Subroutine Call:
  46. Reference:
  47. ****************************************************************/
  48. void switchhall_voInit(void)
  49. {
  50. switchhall_stOut.swLowSpdLpfPu = 0;
  51. switchhall_stOut.swLowSpdPu = 0;
  52. switchhall_stOut.swSpdCWorCCW = 0;
  53. switchhall_stOut.slInitThetaPu = 0;
  54. switchhall_stOut.uwLowThetaPu = 0;
  55. switchhall_stOut.uwSectorNum = 0;
  56. switchhall_stOut.uwSectorNumPre = 0;
  57. switchhall_stOut.slLowThetaPu = 0;
  58. switchhall_stOut.swLowThetaOffsetPu =-15000;
  59. switchhall_stCap.slCapValueDelta = HALL3_SPD_CAP_LEVEL1;
  60. switchhall_stCap.ulCapValue = 0;
  61. switchhall_stCap.ulCapValuePre = 0;
  62. switchhall_stCap.uwCaptureOverFlowCnt = 0;
  63. }
  64. /***************************************************************
  65. Function:
  66. Description:
  67. Call by:
  68. Input Variables:
  69. Output/Return Variables:
  70. Subroutine Call:
  71. Reference:
  72. ****************************************************************/
  73. static void switchhall_voSectorJudge(void)
  74. {
  75. /* HALLA(PC8), HALLB(PC7), PHALLC(PC6), wzy */
  76. if(gpio_input_bit_get(GPIOC,GPIO_PIN_6) != 0)
  77. {
  78. switchhall_stOut.uwSectorNum = 0;
  79. }
  80. else
  81. {
  82. switchhall_stOut.uwSectorNum = 1;
  83. }
  84. if(gpio_input_bit_get(GPIOC,GPIO_PIN_8) != 0)
  85. {
  86. switchhall_stOut.uwSectorNum |= 0<<1;
  87. }
  88. else
  89. {
  90. switchhall_stOut.uwSectorNum |= 1<<1;
  91. }
  92. if(gpio_input_bit_get(GPIOC,GPIO_PIN_7) != 0)
  93. {
  94. switchhall_stOut.uwSectorNum |= 0<<2;
  95. }
  96. else
  97. {
  98. switchhall_stOut.uwSectorNum |= 1<<2;
  99. }
  100. // switchhall_stOut.uwSectorNum = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6);
  101. // switchhall_stOut.uwSectorNum |= (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7) << 1);
  102. // switchhall_stOut.uwSectorNum |= (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8) << 2);
  103. }
  104. /***************************************************************
  105. Function:
  106. Description:
  107. Call by:
  108. Input Variables:
  109. Output/Return Variables:
  110. Subroutine Call:
  111. Reference:
  112. ****************************************************************/
  113. static SLONG switchhall_pvt_slLowSpdLpfPu;
  114. static SLONG switchhall_pvt_slHighSpdLpfPu;
  115. static SLONG Speed_buffer[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  116. static SQWORD Speed_fb_sum = 0;
  117. static SLONG Speed_Value = 0;
  118. static SLONG Speed_AvgValue = 0;
  119. static SWORD Speed_sample_index = 0;
  120. static SWORD HallFltFlg;
  121. void switchhall_voTim3Int(void)
  122. {
  123. /*Sector Judgement*/
  124. switchhall_voSectorJudge();
  125. /* Capture Value */
  126. if (timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_UP) == SET)
  127. {
  128. if(curSpeed_state.state == StartUp || curSpeed_state.state == Open2Clz || curSpeed_state.state == ClzLoop)
  129. {
  130. if (timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_CH0) == SET)
  131. {
  132. switchhall_stCap.uwState = (UWORD)timer_channel_capture_value_register_read(TIMER2, TIMER_INT_FLAG_CH0);
  133. timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_CH0);
  134. }
  135. else if (timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_CH1) == SET)
  136. {
  137. switchhall_stCap.uwState = (UWORD)timer_channel_capture_value_register_read(TIMER2, TIMER_INT_FLAG_CH1);
  138. timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_CH1);
  139. }
  140. else if (timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_CH2) == SET)
  141. {
  142. switchhall_stCap.uwState = (UWORD)timer_channel_capture_value_register_read(TIMER2, TIMER_INT_FLAG_CH2);
  143. timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_CH2);
  144. }
  145. else
  146. {
  147. switchhall_stCap.uwState=0;
  148. }
  149. if (switchhall_stCap.uwState > timer_counter_read(TIMER2))
  150. {
  151. switchhall_stCap.ulCapValue = switchhall_stCap.uwState;
  152. switchhall_stCap.slCapValueDelta = (SLONG)switchhall_stCap.uwCaptureOverFlowCnt * 60000 + (SLONG)switchhall_stCap.ulCapValue - (SLONG)switchhall_stCap.ulCapValuePre;
  153. switchhall_stCap.uwCaptureOverFlowCnt ++;
  154. }
  155. else
  156. {
  157. switchhall_stCap.uwCaptureOverFlowCnt ++;
  158. }
  159. if (switchhall_stCap.uwCaptureOverFlowCnt > 3000)
  160. {
  161. switchhall_stCap.uwCaptureOverFlowCnt=0;
  162. }
  163. }
  164. else
  165. {
  166. switchhall_stCap.uwCaptureOverFlowCnt = 0;
  167. }
  168. timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);
  169. }
  170. else if (timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_CH0)== SET)
  171. {
  172. switchhall_stCap.ulCapValue = timer_channel_capture_value_register_read(TIMER2, TIMER_INT_FLAG_CH0);
  173. switchhall_stCap.slCapValueDelta = (SLONG)switchhall_stCap.uwCaptureOverFlowCnt * 60000 + (SLONG)switchhall_stCap.ulCapValue - (SLONG)switchhall_stCap.ulCapValuePre;
  174. switchhall_stCap.uwCaptureOverFlowCnt = 0;
  175. timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_CH0);
  176. }
  177. else if (timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_CH1) == SET)
  178. {
  179. switchhall_stCap.ulCapValue = timer_channel_capture_value_register_read(TIMER2, TIMER_INT_FLAG_CH1);
  180. switchhall_stCap.slCapValueDelta = (SLONG)switchhall_stCap.uwCaptureOverFlowCnt * 60000 + (SLONG)switchhall_stCap.ulCapValue - (SLONG)switchhall_stCap.ulCapValuePre;
  181. switchhall_stCap.uwCaptureOverFlowCnt = 0;
  182. timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_CH1);
  183. }
  184. else if (timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_CH2) == SET)
  185. {
  186. /* Low Speed*/
  187. switchhall_stCap.ulCapValue = timer_channel_capture_value_register_read(TIMER2, TIMER_INT_FLAG_CH2);
  188. switchhall_stCap.slCapValueDelta = (SLONG)switchhall_stCap.uwCaptureOverFlowCnt * 60000 + (SLONG)switchhall_stCap.ulCapValue - (SLONG)switchhall_stCap.ulCapValuePre;
  189. switchhall_stCap.uwCaptureOverFlowCnt = 0;
  190. // /* High Speed*/
  191. // switchhall_stCap.ulHighCapValue = switchhall_stCap.ulCapValue;
  192. // switchhall_stCap.slHighCapValueDelta = (SLONG)switchhall_stCap.ulHighCapValue - switchhall_stCap.ulHighCapValuePre;
  193. // if(switchhall_stCap.slHighCapValueDelta < 0)
  194. // {
  195. // switchhall_stCap.slHighCapValueDelta += 60000;
  196. // }
  197. timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_CH2);
  198. }
  199. else
  200. {
  201. // switchhall_stCap.slCapValueDelta = HALL3_SPD_CAP_LEVEL1;
  202. }
  203. /* Move Average Filter */
  204. Speed_Value = switchhall_stCap.slCapValueDelta;
  205. Speed_fb_sum -= Speed_buffer[Speed_sample_index];
  206. Speed_buffer[Speed_sample_index] = Speed_Value;
  207. Speed_fb_sum += (SQWORD)Speed_Value;
  208. Speed_AvgValue = (SLONG)(Speed_fb_sum >> 4) ;
  209. Speed_sample_index++;
  210. if (Speed_sample_index >= 16)
  211. {
  212. Speed_sample_index = 0;
  213. }
  214. if(curSpeed_state.state ==StartUp || curSpeed_state.state == Open2Clz || curSpeed_state.state == ClzLoop)
  215. {
  216. // if ((switchhall_stOut.swLowSpdLpfPu > 1950)||(switchhall_stOut.swLowSpdLpfPu < -1950))//500rpm
  217. // {
  218. // switchhall_stCap.slCapValueDelta = Speed_AvgValue;
  219. // }
  220. // else
  221. //{
  222. // switchhall_stCap.slCapValueDelta = Speed_Value;
  223. // }
  224. switchhall_stCap.slCapValueDelta = Speed_AvgValue;
  225. }
  226. else
  227. {
  228. switchhall_stCap.slCapValueDelta = HALL3_SPD_CAL_COEF;
  229. }
  230. switchhall_stCap.ulCapValuePre = switchhall_stCap.ulCapValue;
  231. }
  232. /***************************************************************
  233. Function:
  234. Description:
  235. Call by:
  236. Input Variables:
  237. Output/Return Variables:
  238. Subroutine Call:
  239. Reference:
  240. ****************************************************************/
  241. void switchhall_voPosCalTbc(void) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
  242. {
  243. SLONG Hall_Theta_Temp = 0;
  244. /*Low Speed Theta Update*/
  245. switchhall_stOut.slLowThetaPu += ((SLONG)TBC_TM * switchhall_stOut.swLowSpdLpfPu) >> 10; // Q10+Q15-Q10=Q15
  246. //switchhall_stOut.slLowThetaPu += (((SLONG)TBC_TM * scm_stSpdFbkLpf.slY.sw.hi) >> 10); // Q10+Q15-Q10=Q15
  247. if (switchhall_stOut.slLowThetaPu >= (cof_sl360DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  248. {
  249. switchhall_stOut.slLowThetaPu -= cof_sl360DegreePu;
  250. }
  251. else if (switchhall_stOut.slLowThetaPu < 0 + switchhall_stOut.swLowThetaOffsetPu)
  252. {
  253. switchhall_stOut.slLowThetaPu += cof_sl360DegreePu;
  254. }
  255. else
  256. {
  257. //do noting
  258. }
  259. /*High Speed Theta Update*/
  260. // switchhall_stOut.slHighThetaPu += (((SLONG)TBC_TM * switchhall_stOut.swHighSpdLpfPu) >> 10); // Q10+Q15-Q10=Q15
  261. // if (switchhall_stOut.slHighThetaPu >= cof_sl360DegreePu + switchhall_stOut.swLowThetaOffsetPu)
  262. // {
  263. // switchhall_stOut.slHighThetaPu -= cof_sl360DegreePu;
  264. // }
  265. // else if (switchhall_stOut.slHighThetaPu < switchhall_stOut.swLowThetaOffsetPu)
  266. // {
  267. // switchhall_stOut.slHighThetaPu += cof_sl360DegreePu;
  268. // }
  269. /*Sector Judgement*/
  270. switchhall_voSectorJudge();
  271. /*!< Zero Correction 1*/
  272. // switch(switchhall_stOut.uwSectorNum)
  273. // {
  274. // case 1:
  275. // if(switchhall_stOut.uwSectorNumPre == 3)
  276. // {
  277. // switchhall_stOut.swSpdCWorCCW = 1;
  278. // switchhall_stOut.slLowThetaPu = cof_sl210DegreePu;
  279. // }
  280. // else if(switchhall_stOut.uwSectorNumPre == 5)
  281. // {
  282. // switchhall_stOut.swSpdCWorCCW =-1;
  283. // switchhall_stOut.slLowThetaPu = cof_sl270DegreePu;
  284. // }
  285. //
  286. // switchhall_stOut.slInitThetaPu = cof_sl240DegreePu;
  287. // if(switchhall_stOut.slLowThetaPu < cof_sl210DegreePu)
  288. // {
  289. // switchhall_stOut.slLowThetaPu = cof_sl210DegreePu;
  290. // }
  291. // else if(switchhall_stOut.slLowThetaPu > cof_sl270DegreePu)
  292. // {
  293. // switchhall_stOut.slLowThetaPu = cof_sl270DegreePu;
  294. // }
  295. // else
  296. // {
  297. // }
  298. // break;
  299. // case 2:
  300. // if(switchhall_stOut.uwSectorNumPre == 6)
  301. // {
  302. // switchhall_stOut.swSpdCWorCCW = 1;
  303. // switchhall_stOut.slLowThetaPu = cof_sl90DegreePu;
  304. // }
  305. // else if(switchhall_stOut.uwSectorNumPre == 3)
  306. // {
  307. // switchhall_stOut.swSpdCWorCCW =-1;
  308. // switchhall_stOut.slLowThetaPu = cof_sl150DegreePu;
  309. // }
  310. //
  311. // switchhall_stOut.slInitThetaPu = cof_sl120DegreePu;
  312. // if(switchhall_stOut.slLowThetaPu < cof_sl90DegreePu)
  313. // {
  314. // switchhall_stOut.slLowThetaPu = cof_sl90DegreePu;
  315. // }
  316. // else if(switchhall_stOut.slLowThetaPu > cof_sl150DegreePu)
  317. // {
  318. // switchhall_stOut.slLowThetaPu = cof_sl150DegreePu;
  319. // }
  320. // else
  321. // {
  322. // }
  323. // break;
  324. // case 3:
  325. // if(switchhall_stOut.uwSectorNumPre == 2)
  326. // {
  327. // switchhall_stOut.swSpdCWorCCW = 1;
  328. // switchhall_stOut.slLowThetaPu = cof_sl150DegreePu;
  329. // }
  330. // else if(switchhall_stOut.uwSectorNumPre == 1)
  331. // {
  332. // switchhall_stOut.swSpdCWorCCW =-1;
  333. // switchhall_stOut.slLowThetaPu = cof_sl210DegreePu;
  334. // }
  335. //
  336. // switchhall_stOut.slInitThetaPu = cof_sl180DegreePu;
  337. // if(switchhall_stOut.slLowThetaPu < cof_sl150DegreePu)
  338. // {
  339. // switchhall_stOut.slLowThetaPu = cof_sl150DegreePu;
  340. // }
  341. // else if(switchhall_stOut.slLowThetaPu > cof_sl210DegreePu)
  342. // {
  343. // switchhall_stOut.slLowThetaPu = cof_sl210DegreePu;
  344. // }
  345. // else
  346. // {
  347. // }
  348. // break;
  349. // case 4:
  350. // if(switchhall_stOut.uwSectorNumPre == 5)
  351. // {
  352. // switchhall_stOut.swSpdCWorCCW = 1;
  353. // switchhall_stOut.slLowThetaPu = cof_sl330DegreePu;
  354. // }
  355. // else if(switchhall_stOut.uwSectorNumPre == 6)
  356. // {
  357. // switchhall_stOut.swSpdCWorCCW =-1;
  358. // switchhall_stOut.slLowThetaPu = cof_sl30DegreePu;
  359. // }
  360. //
  361. // switchhall_stOut.slInitThetaPu = 0;
  362. // if((switchhall_stOut.slLowThetaPu > cof_sl30DegreePu)&&(switchhall_stOut.slLowThetaPu < cof_sl330DegreePu))
  363. // {
  364. // if(switchhall_stOut.swSpdCWorCCW == 1)
  365. // {
  366. // switchhall_stOut.slLowThetaPu = cof_sl30DegreePu;
  367. // }
  368. // else if(switchhall_stOut.swSpdCWorCCW == -1)
  369. // {
  370. // switchhall_stOut.slLowThetaPu = cof_sl330DegreePu;
  371. // }
  372. // }
  373. // break;
  374. // case 5:
  375. // if(switchhall_stOut.uwSectorNumPre == 1)
  376. // {
  377. // switchhall_stOut.swSpdCWorCCW = 1;
  378. // switchhall_stOut.slLowThetaPu = cof_sl270DegreePu;
  379. // }
  380. // else if(switchhall_stOut.uwSectorNumPre == 4)
  381. // {
  382. // switchhall_stOut.swSpdCWorCCW =-1;
  383. // switchhall_stOut.slLowThetaPu = cof_sl330DegreePu;
  384. // }
  385. //
  386. // switchhall_stOut.slInitThetaPu = cof_sl300DegreePu;
  387. // if(switchhall_stOut.slLowThetaPu < cof_sl270DegreePu)
  388. // {
  389. // switchhall_stOut.slLowThetaPu = cof_sl270DegreePu;
  390. // }
  391. // else if(switchhall_stOut.slLowThetaPu > cof_sl330DegreePu)
  392. // {
  393. // switchhall_stOut.slLowThetaPu = cof_sl330DegreePu;
  394. // }
  395. // else
  396. // {
  397. // }
  398. // break;
  399. // case 6:
  400. // if(switchhall_stOut.uwSectorNumPre == 4)
  401. // {
  402. // switchhall_stOut.swSpdCWorCCW = 1;
  403. // switchhall_stOut.slLowThetaPu = cof_sl30DegreePu;
  404. // }
  405. // else if(switchhall_stOut.uwSectorNumPre == 2)
  406. // {
  407. // switchhall_stOut.swSpdCWorCCW = -1;
  408. // switchhall_stOut.slLowThetaPu = cof_sl90DegreePu;
  409. // }
  410. //
  411. // switchhall_stOut.slInitThetaPu = cof_sl60DegreePu;
  412. // if(switchhall_stOut.slLowThetaPu < cof_sl30DegreePu)
  413. // {
  414. // switchhall_stOut.slLowThetaPu = cof_sl30DegreePu;
  415. // }
  416. // else if(switchhall_stOut.slLowThetaPu > cof_sl90DegreePu)
  417. // {
  418. // switchhall_stOut.slLowThetaPu = cof_sl90DegreePu;
  419. // }
  420. // else
  421. // {
  422. // }
  423. // break;
  424. // default:
  425. // switchhall_stOut.swSpdCWorCCW =0;
  426. // switchhall_stOut.swLowSpdPu = 0;
  427. // break;
  428. // }
  429. //
  430. //
  431. /*!< Zero Correction 2*/
  432. switch (switchhall_stOut.uwSectorNum)
  433. {
  434. case 1:
  435. if (switchhall_stOut.uwSectorNumPre == 3)
  436. {
  437. switchhall_stOut.swSpdCWorCCW = 1;
  438. switchhall_stOut.slLowThetaPu = cof_sl30DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  439. }
  440. else if (switchhall_stOut.uwSectorNumPre == 5)
  441. {
  442. switchhall_stOut.swSpdCWorCCW = -1;
  443. switchhall_stOut.slLowThetaPu = cof_sl90DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  444. }
  445. else
  446. {
  447. //do noting
  448. }
  449. switchhall_stOut.slInitThetaPu = cof_sl60DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  450. if (switchhall_stOut.slLowThetaPu < (cof_sl30DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  451. {
  452. switchhall_stOut.slLowThetaPu = cof_sl30DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  453. }
  454. else if (switchhall_stOut.slLowThetaPu > (cof_sl90DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  455. {
  456. switchhall_stOut.slLowThetaPu = cof_sl90DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  457. }
  458. else
  459. {
  460. //do noting
  461. }
  462. break;
  463. case 2:
  464. if (switchhall_stOut.uwSectorNumPre == 6)
  465. {
  466. switchhall_stOut.swSpdCWorCCW = 1;
  467. switchhall_stOut.slLowThetaPu = cof_sl270DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  468. }
  469. else if (switchhall_stOut.uwSectorNumPre == 3)
  470. {
  471. switchhall_stOut.swSpdCWorCCW = -1;
  472. switchhall_stOut.slLowThetaPu = cof_sl330DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  473. }
  474. else
  475. {
  476. //do noting
  477. }
  478. switchhall_stOut.slInitThetaPu = cof_sl300DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  479. if (switchhall_stOut.slLowThetaPu < (cof_sl270DegreePu+ switchhall_stOut.swLowThetaOffsetPu))
  480. {
  481. switchhall_stOut.slLowThetaPu = cof_sl270DegreePu + switchhall_stOut.swLowThetaOffsetPu ;
  482. }
  483. else if (switchhall_stOut.slLowThetaPu > (cof_sl330DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  484. {
  485. switchhall_stOut.slLowThetaPu = cof_sl330DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  486. }
  487. else
  488. {
  489. //do noting
  490. }
  491. break;
  492. case 3:
  493. if (switchhall_stOut.uwSectorNumPre == 2)
  494. {
  495. switchhall_stOut.swSpdCWorCCW = 1;
  496. switchhall_stOut.slLowThetaPu = cof_sl330DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  497. }
  498. else if (switchhall_stOut.uwSectorNumPre == 1)
  499. {
  500. switchhall_stOut.swSpdCWorCCW = -1;
  501. switchhall_stOut.slLowThetaPu = cof_sl30DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  502. }
  503. else
  504. {
  505. //do noting
  506. }
  507. switchhall_stOut.slInitThetaPu = cof_sl360DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  508. if ((switchhall_stOut.slLowThetaPu > (cof_sl30DegreePu + switchhall_stOut.swLowThetaOffsetPu)) && (switchhall_stOut.slLowThetaPu < (cof_sl330DegreePu + switchhall_stOut.swLowThetaOffsetPu)))
  509. {
  510. if (switchhall_stOut.swSpdCWorCCW == 1)
  511. {
  512. switchhall_stOut.slLowThetaPu = cof_sl30DegreePu + switchhall_stOut.swLowThetaOffsetPu ;
  513. }
  514. else if (switchhall_stOut.swSpdCWorCCW == -1)
  515. {
  516. switchhall_stOut.slLowThetaPu = cof_sl330DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  517. }
  518. else
  519. {
  520. //do noting
  521. }
  522. }
  523. break;
  524. case 4:
  525. if (switchhall_stOut.uwSectorNumPre == 5)
  526. {
  527. switchhall_stOut.swSpdCWorCCW = 1;
  528. switchhall_stOut.slLowThetaPu = cof_sl150DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  529. }
  530. else if (switchhall_stOut.uwSectorNumPre == 6)
  531. {
  532. switchhall_stOut.swSpdCWorCCW = -1;
  533. switchhall_stOut.slLowThetaPu = cof_sl210DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  534. }
  535. else
  536. {
  537. //do noting
  538. }
  539. switchhall_stOut.slInitThetaPu = cof_sl180DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  540. if (switchhall_stOut.slLowThetaPu < (cof_sl150DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  541. {
  542. switchhall_stOut.slLowThetaPu = cof_sl150DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  543. }
  544. else if (switchhall_stOut.slLowThetaPu > (cof_sl210DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  545. {
  546. switchhall_stOut.slLowThetaPu = cof_sl210DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  547. }
  548. else
  549. {
  550. //do noting
  551. }
  552. break;
  553. case 5:
  554. if (switchhall_stOut.uwSectorNumPre == 1)
  555. {
  556. switchhall_stOut.swSpdCWorCCW = 1;
  557. switchhall_stOut.slLowThetaPu = cof_sl90DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  558. }
  559. else if (switchhall_stOut.uwSectorNumPre == 4)
  560. {
  561. switchhall_stOut.swSpdCWorCCW = -1;
  562. switchhall_stOut.slLowThetaPu = cof_sl150DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  563. }
  564. else
  565. {
  566. //do noting
  567. }
  568. switchhall_stOut.slInitThetaPu = cof_sl120DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  569. if (switchhall_stOut.slLowThetaPu < (cof_sl90DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  570. {
  571. switchhall_stOut.slLowThetaPu = cof_sl90DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  572. }
  573. else if (switchhall_stOut.slLowThetaPu > (cof_sl150DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  574. {
  575. switchhall_stOut.slLowThetaPu = cof_sl150DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  576. }
  577. else
  578. {
  579. //do noting
  580. }
  581. break;
  582. case 6:
  583. if (switchhall_stOut.uwSectorNumPre == 4)
  584. {
  585. switchhall_stOut.swSpdCWorCCW = 1;
  586. switchhall_stOut.slLowThetaPu = cof_sl210DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  587. }
  588. else if (switchhall_stOut.uwSectorNumPre == 2)
  589. {
  590. switchhall_stOut.swSpdCWorCCW = -1;
  591. switchhall_stOut.slLowThetaPu = cof_sl270DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  592. }
  593. else
  594. {
  595. //do noting
  596. }
  597. switchhall_stOut.slInitThetaPu = cof_sl240DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  598. if (switchhall_stOut.slLowThetaPu < (cof_sl210DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  599. {
  600. switchhall_stOut.slLowThetaPu = cof_sl210DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  601. }
  602. else if (switchhall_stOut.slLowThetaPu > (cof_sl270DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  603. {
  604. switchhall_stOut.slLowThetaPu = cof_sl270DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  605. }
  606. else
  607. {
  608. //do noting
  609. }
  610. break;
  611. default:
  612. switchhall_stOut.swSpdCWorCCW = 0;
  613. switchhall_stOut.swLowSpdPu = 0;
  614. break;
  615. }
  616. // /*!< Zero Correction 3*/
  617. // switch (switchhall_stOut.uwSectorNum)
  618. // {
  619. // case 1:
  620. // if (switchhall_stOut.uwSectorNumPre == 3)
  621. // {
  622. // switchhall_stOut.swSpdCWorCCW = 1;
  623. // switchhall_stOut.slLowThetaPu = cof_sl30DegreePu;
  624. // }
  625. // else if (switchhall_stOut.uwSectorNumPre == 5)
  626. // {
  627. // switchhall_stOut.swSpdCWorCCW = -1;
  628. // switchhall_stOut.slLowThetaPu = cof_sl90DegreePu;
  629. // }
  630. //
  631. // switchhall_stOut.slInitThetaPu = cof_sl60DegreePu;
  632. //
  633. // if (switchhall_stOut.slLowThetaPu < cof_sl30DegreePu)
  634. // {
  635. // switchhall_stOut.slLowThetaPu = cof_sl30DegreePu;
  636. // }
  637. // else if (switchhall_stOut.slLowThetaPu > cof_sl90DegreePu )
  638. // {
  639. // switchhall_stOut.slLowThetaPu = cof_sl90DegreePu;
  640. // }
  641. // else
  642. // {}
  643. // break;
  644. // case 2:
  645. // if (switchhall_stOut.uwSectorNumPre == 6)
  646. // {
  647. // switchhall_stOut.swSpdCWorCCW = 1;
  648. // switchhall_stOut.slLowThetaPu = cof_sl270DegreePu;
  649. // }
  650. // else if (switchhall_stOut.uwSectorNumPre == 3)
  651. // {
  652. // switchhall_stOut.swSpdCWorCCW = -1;
  653. // switchhall_stOut.slLowThetaPu = cof_sl330DegreePu;
  654. // }
  655. //
  656. // switchhall_stOut.slInitThetaPu = cof_sl300DegreePu;
  657. // if (switchhall_stOut.slLowThetaPu < cof_sl270DegreePu)
  658. // {
  659. // switchhall_stOut.slLowThetaPu = cof_sl270DegreePu;
  660. // }
  661. // else if (switchhall_stOut.slLowThetaPu > cof_sl330DegreePu)
  662. // {
  663. // switchhall_stOut.slLowThetaPu = cof_sl330DegreePu;
  664. // }
  665. // else
  666. // {}
  667. // break;
  668. // case 3:
  669. // if (switchhall_stOut.uwSectorNumPre == 2)
  670. // {
  671. // switchhall_stOut.swSpdCWorCCW = 1;
  672. // switchhall_stOut.slLowThetaPu = cof_sl330DegreePu;
  673. // }
  674. // else if (switchhall_stOut.uwSectorNumPre == 1)
  675. // {
  676. // switchhall_stOut.swSpdCWorCCW = -1;
  677. // switchhall_stOut.slLowThetaPu = cof_sl30DegreePu;
  678. // }
  679. //
  680. // switchhall_stOut.slInitThetaPu = cof_sl360DegreePu;
  681. // if ((switchhall_stOut.slLowThetaPu > cof_sl30DegreePu) && (switchhall_stOut.slLowThetaPu < cof_sl330DegreePu ))
  682. // {
  683. // if (switchhall_stOut.swSpdCWorCCW == 1)
  684. // {
  685. // switchhall_stOut.slLowThetaPu = cof_sl30DegreePu;
  686. // }
  687. // else if (switchhall_stOut.swSpdCWorCCW == -1)
  688. // {
  689. // switchhall_stOut.slLowThetaPu = cof_sl330DegreePu;
  690. // }
  691. // }
  692. //
  693. // break;
  694. // case 4:
  695. // if (switchhall_stOut.uwSectorNumPre == 5)
  696. // {
  697. // switchhall_stOut.swSpdCWorCCW = 1;
  698. // switchhall_stOut.slLowThetaPu = cof_sl150DegreePu;
  699. // }
  700. // else if (switchhall_stOut.uwSectorNumPre == 6)
  701. // {
  702. // switchhall_stOut.swSpdCWorCCW = -1;
  703. // switchhall_stOut.slLowThetaPu = cof_sl210DegreePu;
  704. // }
  705. //
  706. // switchhall_stOut.slInitThetaPu = cof_sl180DegreePu ;
  707. // if (switchhall_stOut.slLowThetaPu < cof_sl150DegreePu)
  708. // {
  709. // switchhall_stOut.slLowThetaPu = cof_sl150DegreePu;
  710. // }
  711. // else if (switchhall_stOut.slLowThetaPu > cof_sl210DegreePu)
  712. // {
  713. // switchhall_stOut.slLowThetaPu = cof_sl210DegreePu;
  714. // }
  715. // else
  716. // {}
  717. // break;
  718. // case 5:
  719. // if (switchhall_stOut.uwSectorNumPre == 1)
  720. // {
  721. // switchhall_stOut.swSpdCWorCCW = 1;
  722. // switchhall_stOut.slLowThetaPu = cof_sl90DegreePu;
  723. // }
  724. // else if (switchhall_stOut.uwSectorNumPre == 4)
  725. // {
  726. // switchhall_stOut.swSpdCWorCCW = -1;
  727. // switchhall_stOut.slLowThetaPu = cof_sl150DegreePu;
  728. // }
  729. //
  730. // switchhall_stOut.slInitThetaPu = cof_sl120DegreePu;
  731. // if (switchhall_stOut.slLowThetaPu < cof_sl90DegreePu)
  732. // {
  733. // switchhall_stOut.slLowThetaPu = cof_sl90DegreePu;
  734. // }
  735. // else if (switchhall_stOut.slLowThetaPu > cof_sl150DegreePu)
  736. // {
  737. // switchhall_stOut.slLowThetaPu = cof_sl150DegreePu;
  738. // }
  739. // else
  740. // {}
  741. // break;
  742. // case 6:
  743. // if (switchhall_stOut.uwSectorNumPre == 4)
  744. // {
  745. // switchhall_stOut.swSpdCWorCCW = 1;
  746. // switchhall_stOut.slLowThetaPu = cof_sl210DegreePu;
  747. // }
  748. // else if (switchhall_stOut.uwSectorNumPre == 2)
  749. // {
  750. // switchhall_stOut.swSpdCWorCCW = -1;
  751. // switchhall_stOut.slLowThetaPu = cof_sl270DegreePu;
  752. // }
  753. //
  754. // switchhall_stOut.slInitThetaPu = cof_sl240DegreePu;
  755. // if (switchhall_stOut.slLowThetaPu < cof_sl210DegreePu )
  756. // {
  757. // switchhall_stOut.slLowThetaPu = cof_sl210DegreePu;
  758. // }
  759. // else if (switchhall_stOut.slLowThetaPu > cof_sl270DegreePu )
  760. // {
  761. // switchhall_stOut.slLowThetaPu = cof_sl270DegreePu;
  762. // }
  763. // else
  764. // {}
  765. // break;
  766. // default:
  767. // switchhall_stOut.swSpdCWorCCW = 0;
  768. // switchhall_stOut.swLowSpdPu = 0;
  769. // break;
  770. // }
  771. switchhall_stOut.uwSectorNumPre = switchhall_stOut.uwSectorNum;
  772. /* Theta Compensation */
  773. // if (switchhall_stOut.swSpdCWorCCW == -1)
  774. // {
  775. // switchhall_stOut.swLowThetaOffsetPu = switchhall_stOut.swLowThetaOffsetPu + HALL_THETEA_OFFSET_FANXIANG;
  776. // }
  777. //
  778. // /* Speed Calculation */
  779. // if (switchhall_stOut.swSpdCWorCCW == 1)
  780. // {
  781. // switchhall_stOut.swLowSpdPu = (SWORD)(HALL3_SPD_CAL_COEF / switchhall_stCap.slCapValueDelta);
  782. // }
  783. // else if (switchhall_stOut.swSpdCWorCCW == -1)
  784. // {
  785. // switchhall_stOut.swLowSpdPu = -(SWORD)(HALL3_SPD_CAL_COEF / switchhall_stCap.slCapValueDelta);
  786. // }
  787. // else
  788. // {
  789. // switchhall_stOut.swLowSpdPu = 0;
  790. // }
  791. if (switchhall_stCap.slCapValueDelta >= HALL3_SPD_CAP_LEVEL1) //lower than level1
  792. {
  793. // switchhall_stOut.swLowSpdPu = 0;
  794. // switchhall_stOut.uwLowThetaPu = switchhall_stOut.slInitThetaPu;
  795. // Hall_Theta_Temp = (UWORD)(switchhall_stOut.slInitThetaPu+switchhall_stOut.swLowThetaOffsetPu); // Q15
  796. Hall_Theta_Temp = switchhall_stOut.slInitThetaPu;
  797. if (Hall_Theta_Temp >= cof_sl360DegreePu)
  798. {
  799. Hall_Theta_Temp -= cof_sl360DegreePu;
  800. }
  801. else if (Hall_Theta_Temp < 0)
  802. {
  803. Hall_Theta_Temp += cof_sl360DegreePu;
  804. }
  805. else
  806. {
  807. //do noting
  808. }
  809. switchhall_stOut.uwLowThetaPu = (UWORD)Hall_Theta_Temp;
  810. }
  811. else if (switchhall_stCap.slCapValueDelta >= HALL3_SPD_CAP_LEVEL2) // lower than level2
  812. {
  813. /* Use fixed angle(middle of sector) at low speed*/
  814. if (switchhall_stCap.slCapValueDelta >= HALL3_SPD_CAP_STARTUP_LEVEL) // lower than Startup level
  815. {
  816. // switchhall_stOut.uwLowThetaPu = switchhall_stOut.slInitThetaPu;
  817. //Hall_Theta_Temp = (UWORD)(switchhall_stOut.slInitThetaPu+switchhall_stOut.swLowThetaOffsetPu); // Q15
  818. Hall_Theta_Temp = switchhall_stOut.slInitThetaPu;
  819. if (Hall_Theta_Temp >= cof_sl360DegreePu)
  820. {
  821. Hall_Theta_Temp -= cof_sl360DegreePu;
  822. }
  823. else if (Hall_Theta_Temp < 0)
  824. {
  825. Hall_Theta_Temp += cof_sl360DegreePu;
  826. }
  827. else
  828. {
  829. //do noting
  830. }
  831. switchhall_stOut.uwLowThetaPu = (UWORD)Hall_Theta_Temp;
  832. }
  833. else
  834. {
  835. /*Low Speed Theta */
  836. //Hall_Theta_Temp = (UWORD)(switchhall_stOut.slLowThetaPu+switchhall_stOut.swLowThetaOffsetPu); // Q15
  837. Hall_Theta_Temp = switchhall_stOut.slLowThetaPu;
  838. if (Hall_Theta_Temp >= cof_sl360DegreePu)
  839. {
  840. Hall_Theta_Temp -= cof_sl360DegreePu;
  841. }
  842. else if (Hall_Theta_Temp < 0)
  843. {
  844. Hall_Theta_Temp += cof_sl360DegreePu;
  845. }
  846. else
  847. {
  848. //do noting
  849. }
  850. switchhall_stOut.uwLowThetaPu = (UWORD)Hall_Theta_Temp;
  851. /*High Speed Theta */
  852. // if (switchhall_stOut.slHighThetaPu >= cof_sl360DegreePu)
  853. // {
  854. // switchhall_stOut.slHighThetaPu -= cof_sl360DegreePu;
  855. // }
  856. // else if (switchhall_stOut.slHighThetaPu < 0)
  857. // {
  858. // switchhall_stOut.slHighThetaPu += cof_sl360DegreePu;
  859. // }
  860. // switchhall_stOut.uwHighThetaPu = cof_sl360DegreePu;
  861. }
  862. if (switchhall_stOut.swSpdCWorCCW == 1)
  863. {
  864. switchhall_stOut.swLowSpdPu = (SWORD)(HALL3_SPD_CAL_COEF / switchhall_stCap.slCapValueDelta);
  865. switchhall_stOut.swHighSpdPu = (SWORD)(HALL1_SPD_CAL_COEF / switchhall_stCap.slHighCapValueDelta);
  866. }
  867. else if (switchhall_stOut.swSpdCWorCCW == -1)
  868. {
  869. switchhall_stOut.swLowSpdPu = -(SWORD)(HALL3_SPD_CAL_COEF / switchhall_stCap.slCapValueDelta);
  870. switchhall_stOut.swHighSpdPu = -(SWORD)(HALL1_SPD_CAL_COEF / switchhall_stCap.slHighCapValueDelta);
  871. }
  872. else
  873. {
  874. // switchhall_stOut.swLowSpdPu = 0;
  875. }
  876. }
  877. else
  878. {
  879. // High speed: use single hall
  880. }
  881. /* Low Speed LPF */
  882. switchhall_pvt_slLowSpdLpfPu =
  883. (SLONG)0x00CB * (switchhall_stOut.swLowSpdPu - switchhall_stOut.swLowSpdLpfPu) + switchhall_pvt_slLowSpdLpfPu; //50Hz
  884. switchhall_stOut.swLowSpdLpfPu = (SWORD)(switchhall_pvt_slLowSpdLpfPu >> 15);
  885. /* High Speed LPF */
  886. // switchhall_pvt_slHighSpdLpfPu =
  887. // (SLONG)0x00CB * (switchhall_stOut.swHighSpdPu - switchhall_stOut.swHighSpdLpfPu) + switchhall_pvt_slHighSpdLpfPu;
  888. // switchhall_stOut.swHighSpdLpfPu = switchhall_pvt_slHighSpdLpfPu >> 15;
  889. }
  890. #endif
  891. /*************************************************************************
  892. End of this File (EOF)!
  893. Do not put anything after this part!
  894. *************************************************************************/