switchhall.c 33 KB

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