switchhall.c 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180
  1. /**
  2. * @file switchhall.c
  3. * @author
  4. * @brief
  5. * @version
  6. * @date 2023.11.8
  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 "at32f421.h"//// #include "stm32f10x.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. #include "UserGpio_Config.h"
  24. #include "board_config.h"
  25. #include "emcdeal.h"
  26. #include "user.h"
  27. /******************************
  28. *
  29. * Parameter
  30. *
  31. ******************************/
  32. SWITCHHALL_CAP switchhall_stCap = SWITCHHALL_CAP_DEFAULT;
  33. SWITCHHALL_OUT switchhall_stOut = SWITCHHALL_OUT_DEFAULT;
  34. /***************************************************************
  35. Function:
  36. Description:
  37. Call by:
  38. Input Variables:
  39. Output/Return Variables:
  40. Subroutine Call:
  41. Reference:
  42. ****************************************************************/
  43. void switchhall_voInit(void)
  44. {
  45. switchhall_stOut.swLowSpdLpfPu = 0;
  46. switchhall_stOut.swLowSpdPu = 0;
  47. switchhall_stOut.swSpdCWorCCW = 0;
  48. switchhall_stOut.slInitThetaPu = 0;
  49. switchhall_stOut.uwLowThetaPu = 0;
  50. // switchhall_stOut.uwSectorNum = 0;
  51. // switchhall_stOut.uwSectorNumPre = 0;
  52. switchhall_stOut.slLowThetaPu = 0;
  53. #if((MOTOR_ID_SEL == MOTOR_LUNGU_WELLING_HAL_POLE10_750W_500Ratio) ||(MOTOR_ID_SEL ==MOTOR_LUNGU_WELLING_HAL_POLE10_500W_500Ratio)||(MOTOR_ID_SEL == MOTOR_LUNGU_WELLING_HAL_POLE10_1000W_500Ratio))
  54. switchhall_stOut.swLowThetaOffsetPu = cof_sl180DegreePu; //-683 -7 degree
  55. #else
  56. switchhall_stOut.swLowThetaOffsetPu = 0; //-683 -7 degree
  57. #endif
  58. switchhall_stCap.slCapValueDelta = HALL3_SPD_CAP_LEVEL1;
  59. switchhall_stCap.ulCapValue = 0;
  60. switchhall_stCap.ulCapValuePre = 0;
  61. switchhall_stCap.uwCaptureOverFlowCnt = 0;
  62. }
  63. /***************************************************************
  64. Function:
  65. Description:
  66. Call by:
  67. Input Variables:
  68. Output/Return Variables:
  69. Subroutine Call:
  70. Reference:
  71. ****************************************************************/
  72. static void switchhall_voSectorJudge(void)
  73. {
  74. UWORD uwsectorNum;
  75. UWORD Jcnt=0;
  76. UWORD uwHallSta;
  77. UWORD uwActtime;
  78. uwsectorNum=0;
  79. // uint32_t gpioA = DL_GPIO_getEnabledInterruptStatus(GPIOA,
  80. // HALL_HALLA_PIN | HALL_HALLB_PIN | HALL_HALLC_PIN);
  81. ////if((GPIOB->idt & GPIO_PINS_5) ==0)//(Hall_HB_PORT()== 1)//if(iGpio_Read(HW_GPIO_HALLB_PIN) == 1)
  82. // if ((gpioA & HALL_HALLA_PIN) == 0)
  83. // {
  84. // uwsectorNum |= 0x01;
  85. // }
  86. //
  87. //// if((GPIOB->idt &GPIO_PINS_0) ==0)//(Hall_HA_PORT() == 1) //if(iGpio_Read(HW_GPIO_HALLC_PIN) == 1)
  88. // if ((gpioA & HALL_HALLB_PIN) ==0 )
  89. // {
  90. // uwsectorNum |= 0x02;
  91. // }
  92. //// if((GPIOB->idt &GPIO_PINS_4) ==0)//(Hall_HC_PORT() == 1) // if(iGpio_Read(HW_GPIO_HALLA_PIN) == 1)
  93. // if ((gpioA & HALL_HALLC_PIN) == 0)
  94. // {
  95. // uwsectorNum |= 0x04;
  96. // }
  97. //
  98. // uint32_t gpioA = DL_GPIO_getEnabledInterruptStatus(GPIOA,
  99. // HALL_HALLA_PIN | HALL_HALLB_PIN | HALL_HALLC_PIN);
  100. /*
  101. * Bitwise AND the pending interrupt with the pin you want to check,
  102. * then check if it is equal to the pins. Clear the interrupt status.
  103. */
  104. if (Hall_HA_PORT() ==0)// if ((Hall_HA_PORT() & HALL_HALLA_PIN) ==0)// if ((gpioA & HALL_HALLA_PIN) == HALL_HALLA_PIN)
  105. {
  106. // HALLACnt++;
  107. uwsectorNum |= 0x02;
  108. // DL_GPIO_clearInterruptStatus(GPIOA, HALL_HALLA_PIN);
  109. }
  110. if (Hall_HB_PORT() ==0) // if ((Hall_HB_PORT() & HALL_HALLB_PIN) ==0)// if ((gpioA & HALL_HALLB_PIN) == HALL_HALLB_PIN)
  111. {
  112. uwsectorNum |= 0x01;
  113. // HALLBCnt++;
  114. // DL_GPIO_clearInterruptStatus(GPIOA, HALL_HALLB_PIN);
  115. }
  116. if (Hall_HC_PORT() ==0) //if ((Hall_HC_PORT() & HALL_HALLC_PIN) ==0)// if ((gpioA & HALL_HALLC_PIN) == HALL_HALLC_PIN)
  117. {
  118. uwsectorNum |= 0x04;
  119. // HALLCCnt++;
  120. // DL_GPIO_clearInterruptStatus(GPIOA, HALL_HALLC_PIN);
  121. }
  122. // if((GPIOB->idt & GPIO_PINS_5) !=0)//(Hall_HB_PORT()== 1)//if(iGpio_Read(HW_GPIO_HALLB_PIN) == 1)
  123. // {
  124. // uwsectorNum = 0;
  125. // }
  126. // else
  127. // {
  128. // uwsectorNum = 1;
  129. // }
  130. // if((GPIOB->idt &GPIO_PINS_0) !=0)//(Hall_HA_PORT() == 1) //if(iGpio_Read(HW_GPIO_HALLC_PIN) == 1)
  131. // {
  132. // uwsectorNum |= (0 << 1);
  133. // }
  134. // else
  135. // {
  136. // uwsectorNum |= (1 << 1);
  137. // }
  138. // if((GPIOB->idt &GPIO_PINS_4) !=0)//(Hall_HC_PORT() == 1) // if(iGpio_Read(HW_GPIO_HALLA_PIN) == 1)
  139. // {
  140. // uwsectorNum |= (0 << 2);
  141. // }
  142. // else
  143. // {
  144. // uwsectorNum |= (1 << 2);
  145. // }
  146. // uwHallSta=uwsectorNum;
  147. // for(Jcnt=0;Jcnt<=15;Jcnt++)
  148. // {
  149. //// if((GPIOB->idt & GPIO_PINS_5) ==0)//(Hall_HB_PORT()== 1)//if(iGpio_Read(HW_GPIO_HALLB_PIN) == 1)
  150. // {
  151. // uwsectorNum |= 0x01;
  152. // }
  153. //
  154. //// if((GPIOB->idt &GPIO_PINS_0) ==0)//(Hall_HA_PORT() == 1) //if(iGpio_Read(HW_GPIO_HALLC_PIN) == 1)
  155. // {
  156. // uwsectorNum |= 0x02;
  157. // }
  158. //// if((GPIOB->idt &GPIO_PINS_4) ==0)//(Hall_HC_PORT() == 1) // if(iGpio_Read(HW_GPIO_HALLA_PIN) == 1)
  159. // {
  160. // uwsectorNum |= 0x04;
  161. // }
  162. //
  163. // if(uwHallSta==uwsectorNum)
  164. // {
  165. // uwActtime++;
  166. // }
  167. // }
  168. // if(uwActtime>10)
  169. {
  170. switchhall_stOut.uwSectorNum = uwsectorNum;
  171. }
  172. }
  173. /***************************************************************
  174. Function:
  175. Description:
  176. Call by:
  177. Input Variables:
  178. Output/Return Variables:
  179. Subroutine Call:
  180. Reference:
  181. ****************************************************************/
  182. SLONG switchhall_pvt_slLowSpdLpfPu;
  183. SLONG switchhall_pvt_slHighSpdLpfPu;
  184. SLONG Speed_buffer[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  185. SQWORD Speed_fb_sum = 0;
  186. SLONG Speed_Value = 0;
  187. SLONG Speed_AvgValue = 0;
  188. SWORD Speed_sample_index = 0;
  189. SWORD tstDeltaCap;
  190. SWORD tstCap;
  191. SWORD tstFlag = 0;
  192. SLONG tmp_ValueCapDelta = 0;
  193. void switchhall_voTim3Int(void)
  194. {
  195. switchhall_stCap.ulCapValue= DL_Timer_getTimerCount(HALLTIMER_INST);
  196. DL_Timer_setTimerCount(HALLTIMER_INST,0);
  197. switchhall_stCap.uwCaptureOverFlowCnt = 0;
  198. #if(EMCDEAL_EN!=0)
  199. if(EcmDeal.EmcModeFlag==FALSE)
  200. #endif
  201. {
  202. /*Sector Judgement*/
  203. switchhall_voSectorJudge();
  204. // DL_GPIO_togglePins(LED_PORT, LED_LED1_PIN);
  205. tmp_ValueCapDelta = (SLONG)switchhall_stCap.uwCaptureOverFlowCnt * 60011 + (SLONG)switchhall_stCap.ulCapValue ; //
  206. Speed_Value = tmp_ValueCapDelta; //switchhall_stCap.slCapValueDelta;
  207. Speed_fb_sum -= Speed_buffer[Speed_sample_index];
  208. Speed_buffer[Speed_sample_index] = Speed_Value;
  209. Speed_fb_sum += (SQWORD)Speed_Value;
  210. Speed_AvgValue = (SLONG)((Speed_fb_sum * 341)>>12);
  211. Speed_sample_index++;
  212. if (Speed_sample_index >= 12)
  213. Speed_sample_index = 0;
  214. switchhall_stCap.slCapValueDelta = Speed_AvgValue;
  215. switchhall_stCap.ulCapValuePre = switchhall_stCap.ulCapValue;
  216. EcmDeal.slCapValueDelta=switchhall_stCap.slCapValueDelta;
  217. }
  218. //-------------------------------------
  219. /* Capture Value */
  220. // if ((tmr_interrupt_flag_get(TMR3, TMR_OVF_FLAG)) == SET)//((TIM_GetITStatus(TIM3, TIM_IT_Update)) == SET)
  221. // {
  222. // tstFlag = 1000;
  223. //// if(curSpeed_state.state == StartUp || curSpeed_state.state == Open2Clz || curSpeed_state.state == ClzLoop)
  224. //// {
  225. //// if (tmr_interrupt_flag_get(TMR3, TMR_C1_FLAG) == SET)// if (TIM_GetITStatus(TIM3, TIM_IT_CC1) == SET)
  226. // {
  227. // if(Hall_HC_PORT())// if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6))
  228. // {
  229. //// tmr_output_channel_polarity_set(TMR3,TMR_SELECT_CHANNEL_1,TMR_POLARITY_ACTIVE_LOW);// TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Falling);
  230. // }
  231. // else
  232. // {
  233. //// tmr_output_channel_polarity_set(TMR3,TMR_SELECT_CHANNEL_1,TMR_POLARITY_ACTIVE_HIGH);// TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Rising);
  234. // }
  235. //
  236. //
  237. // {
  238. //// switchhall_stCap.ulSTATE = tmr_channel_value_get(TMR3,TMR_SELECT_CHANNEL_1);
  239. //
  240. //// if (switchhall_stCap.ulSTATE > tmr_counter_value_get(TMR3))
  241. // {
  242. // switchhall_stCap.ulCapValue = switchhall_stCap.ulSTATE;
  243. // tmp_ValueCapDelta = (SLONG)switchhall_stCap.uwCaptureOverFlowCnt * 60000 + (SLONG)switchhall_stCap.ulCapValue - (SLONG)switchhall_stCap.ulCapValuePre; //switchhall_stCap.slCapValueDelta
  244. // switchhall_stCap.uwCaptureOverFlowCnt = 1;
  245. //
  246. // Speed_Value = tmp_ValueCapDelta; //switchhall_stCap.slCapValueDelta;
  247. // Speed_fb_sum -= Speed_buffer[Speed_sample_index];
  248. // Speed_buffer[Speed_sample_index] = Speed_Value;
  249. // Speed_fb_sum += (SQWORD)Speed_Value;
  250. // Speed_AvgValue = (SLONG)((Speed_fb_sum * 341)>>12);
  251. // Speed_sample_index++;
  252. // if (Speed_sample_index >= 12)
  253. // Speed_sample_index = 0;
  254. // switchhall_stCap.slCapValueDelta = Speed_AvgValue;
  255. // switchhall_stCap.ulCapValuePre = switchhall_stCap.ulCapValue;
  256. //
  257. // }
  258. //// else
  259. // {
  260. // switchhall_stCap.uwCaptureOverFlowCnt ++;
  261. // switchhall_stCap.ulCapValue = switchhall_stCap.ulSTATE;
  262. // tmp_ValueCapDelta = (SLONG)switchhall_stCap.uwCaptureOverFlowCnt * 60000 + (SLONG)switchhall_stCap.ulCapValue - (SLONG)switchhall_stCap.ulCapValuePre; //switchhall_stCap.slCapValueDelta
  263. // switchhall_stCap.uwCaptureOverFlowCnt = 0;
  264. //
  265. // Speed_Value = tmp_ValueCapDelta; //switchhall_stCap.slCapValueDelta;
  266. // Speed_fb_sum -= Speed_buffer[Speed_sample_index];
  267. // Speed_buffer[Speed_sample_index] = Speed_Value;
  268. // Speed_fb_sum += (SQWORD)Speed_Value;
  269. // Speed_AvgValue = (SLONG)((Speed_fb_sum * 341)>>12);
  270. // Speed_sample_index++;
  271. // if (Speed_sample_index >= 12)
  272. // Speed_sample_index = 0;
  273. // switchhall_stCap.slCapValueDelta = Speed_AvgValue;
  274. // switchhall_stCap.ulCapValuePre = switchhall_stCap.ulCapValue;
  275. // }
  276. // }
  277. //
  278. //// tmr_flag_clear(TMR3, TMR_C1_FLAG);// TIM_ClearFlag(TIM3, TIM_IT_CC1);
  279. // }
  280. //// else if (tmr_interrupt_flag_get(TMR3, TMR_C2_FLAG) == SET)
  281. // {
  282. // if(Hall_HB_PORT())
  283. // {
  284. //// tmr_output_channel_polarity_set(TMR3,TMR_SELECT_CHANNEL_2,TMR_POLARITY_ACTIVE_LOW);
  285. // }
  286. // else
  287. // {
  288. //// tmr_output_channel_polarity_set(TMR3,TMR_SELECT_CHANNEL_2,TMR_POLARITY_ACTIVE_HIGH);
  289. // }
  290. //
  291. //
  292. // {
  293. //// switchhall_stCap.ulSTATE=tmr_channel_value_get(TMR3,TMR_SELECT_CHANNEL_2);
  294. //
  295. //// if (switchhall_stCap.ulSTATE > tmr_counter_value_get(TMR3))
  296. // {
  297. // switchhall_stCap.ulCapValue = switchhall_stCap.ulSTATE;
  298. // tmp_ValueCapDelta = (SLONG)switchhall_stCap.uwCaptureOverFlowCnt * 60000 + (SLONG)switchhall_stCap.ulCapValue - (SLONG)switchhall_stCap.ulCapValuePre; //switchhall_stCap.slCapValueDelta
  299. // switchhall_stCap.uwCaptureOverFlowCnt = 1;
  300. //
  301. // Speed_Value = tmp_ValueCapDelta; //switchhall_stCap.slCapValueDelta;
  302. // Speed_fb_sum -= Speed_buffer[Speed_sample_index];
  303. // Speed_buffer[Speed_sample_index] = Speed_Value;
  304. // Speed_fb_sum += (SQWORD)Speed_Value;
  305. // Speed_AvgValue = (SLONG)((Speed_fb_sum * 341)>>12);
  306. // Speed_sample_index++;
  307. // if (Speed_sample_index >= 12)
  308. // Speed_sample_index = 0;
  309. // switchhall_stCap.slCapValueDelta = Speed_AvgValue;
  310. // switchhall_stCap.ulCapValuePre = switchhall_stCap.ulCapValue;
  311. //
  312. // }
  313. //// else
  314. // {
  315. // switchhall_stCap.uwCaptureOverFlowCnt ++;
  316. // switchhall_stCap.ulCapValue = switchhall_stCap.ulSTATE;
  317. // tmp_ValueCapDelta = (SLONG)switchhall_stCap.uwCaptureOverFlowCnt * 60000 + (SLONG)switchhall_stCap.ulCapValue - (SLONG)switchhall_stCap.ulCapValuePre; //switchhall_stCap.slCapValueDelta
  318. // switchhall_stCap.uwCaptureOverFlowCnt = 0;
  319. //
  320. // Speed_Value = tmp_ValueCapDelta; //switchhall_stCap.slCapValueDelta;
  321. // Speed_fb_sum -= Speed_buffer[Speed_sample_index];
  322. // Speed_buffer[Speed_sample_index] = Speed_Value;
  323. // Speed_fb_sum += (SQWORD)Speed_Value;
  324. // Speed_AvgValue = (SLONG)((Speed_fb_sum * 341)>>12);
  325. // Speed_sample_index++;
  326. // if (Speed_sample_index >= 12)
  327. // Speed_sample_index = 0;
  328. // switchhall_stCap.slCapValueDelta = Speed_AvgValue;
  329. // switchhall_stCap.ulCapValuePre = switchhall_stCap.ulCapValue;
  330. // }
  331. // }
  332. //
  333. //// tmr_flag_clear(TMR3, TMR_C2_FLAG);//TIM_ClearFlag(TIM3, TIM_IT_CC2);
  334. // }
  335. //// else if (tmr_interrupt_flag_get(TMR3, TMR_C3_FLAG) == SET)
  336. // {
  337. // if(Hall_HA_PORT())
  338. // {
  339. //// tmr_output_channel_polarity_set(TMR3,TMR_SELECT_CHANNEL_3,TMR_POLARITY_ACTIVE_LOW);// TIM_OC3PolarityConfig(TIM3,TIM_ICPolarity_Falling);
  340. // }
  341. // else
  342. // {
  343. //// tmr_output_channel_polarity_set(TMR3,TMR_SELECT_CHANNEL_3,TMR_POLARITY_ACTIVE_HIGH);// TIM_OC3PolarityConfig(TIM3,TIM_ICPolarity_Rising);
  344. // }
  345. //
  346. //
  347. //
  348. // {
  349. //// switchhall_stCap.ulSTATE = tmr_channel_value_get(TMR3,TMR_SELECT_CHANNEL_3);
  350. //
  351. //// if (switchhall_stCap.ulSTATE >tmr_counter_value_get(TMR3))
  352. // {
  353. // switchhall_stCap.ulCapValue = switchhall_stCap.ulSTATE;
  354. // tmp_ValueCapDelta = (SLONG)switchhall_stCap.uwCaptureOverFlowCnt * 60000 + (SLONG)switchhall_stCap.ulCapValue - (SLONG)switchhall_stCap.ulCapValuePre; //switchhall_stCap.slCapValueDelta
  355. // switchhall_stCap.uwCaptureOverFlowCnt = 1;
  356. //
  357. // Speed_Value = tmp_ValueCapDelta; //switchhall_stCap.slCapValueDelta;
  358. // Speed_fb_sum -= Speed_buffer[Speed_sample_index];
  359. // Speed_buffer[Speed_sample_index] = Speed_Value;
  360. // Speed_fb_sum += (SQWORD)Speed_Value;
  361. // Speed_AvgValue = (SLONG)((Speed_fb_sum * 341)>>12);
  362. // Speed_sample_index++;
  363. // if (Speed_sample_index >= 12)
  364. // Speed_sample_index = 0;
  365. // switchhall_stCap.slCapValueDelta = Speed_AvgValue;
  366. // switchhall_stCap.ulCapValuePre = switchhall_stCap.ulCapValue;
  367. //
  368. // }
  369. //// else
  370. // {
  371. // switchhall_stCap.uwCaptureOverFlowCnt ++;
  372. // switchhall_stCap.ulCapValue = switchhall_stCap.ulSTATE;
  373. // tmp_ValueCapDelta = (SLONG)switchhall_stCap.uwCaptureOverFlowCnt * 60000 + (SLONG)switchhall_stCap.ulCapValue - (SLONG)switchhall_stCap.ulCapValuePre; //switchhall_stCap.slCapValueDelta
  374. // switchhall_stCap.uwCaptureOverFlowCnt = 0;
  375. //
  376. // Speed_Value = tmp_ValueCapDelta; //switchhall_stCap.slCapValueDelta;
  377. // Speed_fb_sum -= Speed_buffer[Speed_sample_index];
  378. // Speed_buffer[Speed_sample_index] = Speed_Value;
  379. // Speed_fb_sum += (SQWORD)Speed_Value;
  380. // Speed_AvgValue = (SLONG)((Speed_fb_sum * 341)>>12);
  381. // Speed_sample_index++;
  382. // if (Speed_sample_index >= 12)
  383. // Speed_sample_index = 0;
  384. // switchhall_stCap.slCapValueDelta = Speed_AvgValue;
  385. // switchhall_stCap.ulCapValuePre = switchhall_stCap.ulCapValue;
  386. // }
  387. // }
  388. //
  389. //// tmr_flag_clear(TMR3, TMR_C3_FLAG);// TIM_ClearFlag(TIM3, TIM_IT_CC3);
  390. // }
  391. //// else
  392. // {
  393. // switchhall_stCap.ulSTATE=0;
  394. // switchhall_stCap.uwCaptureOverFlowCnt ++;
  395. //
  396. // if(switchhall_stCap.uwCaptureOverFlowCnt >= 5)
  397. // {
  398. // tmp_ValueCapDelta = (SLONG)(switchhall_stCap.uwCaptureOverFlowCnt+1) * 60000; //switchhall_stCap.slCapValueDelta
  399. // switchhall_stCap.slCapValueDelta = tmp_ValueCapDelta;
  400. // }
  401. // }
  402. //
  403. // if (switchhall_stCap.uwCaptureOverFlowCnt > 9) //1HZ
  404. // {
  405. // /* Linmit the max CapValueDelta */
  406. // switchhall_stCap.uwCaptureOverFlowCnt=10;
  407. // }
  408. //// }
  409. //// else
  410. //// {
  411. //// switchhall_stCap.uwCaptureOverFlowCnt = 0;
  412. //// }
  413. //// tmr_flag_clear(TMR3, TMR_OVF_FLAG);// TIM_ClearFlag(TIM3, TIM_IT_Update);
  414. //
  415. // }
  416. //// else if((tmr_interrupt_flag_get(TMR3, TMR_C1_FLAG)) == SET)
  417. // {
  418. // tstFlag = 2000;
  419. // if(Hall_HC_PORT())
  420. // {
  421. //// tmr_output_channel_polarity_set(TMR3,TMR_SELECT_CHANNEL_1,TMR_POLARITY_ACTIVE_LOW);// TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Falling);
  422. // }
  423. // else
  424. // {
  425. //// tmr_output_channel_polarity_set(TMR3,TMR_SELECT_CHANNEL_1,TMR_POLARITY_ACTIVE_HIGH);// TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Rising);
  426. // }
  427. //
  428. //
  429. // {
  430. //// switchhall_stCap.ulCapValue = tmr_channel_value_get(TMR3,TMR_SELECT_CHANNEL_1);
  431. // tmp_ValueCapDelta = (SLONG)switchhall_stCap.uwCaptureOverFlowCnt * 60000 + (SLONG)switchhall_stCap.ulCapValue - (SLONG)switchhall_stCap.ulCapValuePre; //switchhall_stCap.slCapValueDelta
  432. // switchhall_stCap.uwCaptureOverFlowCnt = 0;
  433. //
  434. // Speed_Value = tmp_ValueCapDelta; //switchhall_stCap.slCapValueDelta;
  435. // Speed_fb_sum -= Speed_buffer[Speed_sample_index];
  436. // Speed_buffer[Speed_sample_index] = Speed_Value;
  437. // Speed_fb_sum += (SQWORD)Speed_Value;
  438. // Speed_AvgValue = (SLONG)((Speed_fb_sum * 341)>>12);
  439. // Speed_sample_index++;
  440. // if (Speed_sample_index >= 12)
  441. // Speed_sample_index = 0;
  442. // switchhall_stCap.slCapValueDelta = Speed_AvgValue;
  443. // switchhall_stCap.ulCapValuePre = switchhall_stCap.ulCapValue;
  444. // }
  445. //
  446. //// tmr_flag_clear(TMR3, TMR_C1_FLAG);// TIM_ClearFlag(TIM3, TIM_IT_CC1);
  447. // }
  448. //// else if((tmr_interrupt_flag_get(TMR3, TMR_C2_FLAG) ) == SET)
  449. // {
  450. // tstFlag = 3000;
  451. // if(Hall_HB_PORT())
  452. // {
  453. //// tmr_output_channel_polarity_set(TMR3,TMR_SELECT_CHANNEL_2,TMR_POLARITY_ACTIVE_LOW);
  454. // }
  455. // else
  456. // {
  457. //// tmr_output_channel_polarity_set(TMR3,TMR_SELECT_CHANNEL_2,TMR_POLARITY_ACTIVE_HIGH);
  458. // }
  459. //
  460. //
  461. // {
  462. //// switchhall_stCap.ulCapValue =tmr_channel_value_get(TMR3,TMR_SELECT_CHANNEL_2);
  463. // tmp_ValueCapDelta = (SLONG)switchhall_stCap.uwCaptureOverFlowCnt * 60000 + (SLONG)switchhall_stCap.ulCapValue - (SLONG)switchhall_stCap.ulCapValuePre; //switchhall_stCap.slCapValueDelta
  464. // switchhall_stCap.uwCaptureOverFlowCnt = 0;
  465. //
  466. // Speed_Value = tmp_ValueCapDelta; //switchhall_stCap.slCapValueDelta;
  467. // Speed_fb_sum -= Speed_buffer[Speed_sample_index];
  468. // Speed_buffer[Speed_sample_index] = Speed_Value;
  469. // Speed_fb_sum += (SQWORD)Speed_Value;
  470. // Speed_AvgValue = (SLONG)((Speed_fb_sum * 341)>>12);
  471. // Speed_sample_index++;
  472. // if (Speed_sample_index >= 12)
  473. // Speed_sample_index = 0;
  474. // switchhall_stCap.slCapValueDelta = Speed_AvgValue;
  475. // switchhall_stCap.ulCapValuePre = switchhall_stCap.ulCapValue;
  476. // }
  477. //
  478. //// tmr_flag_clear(TMR3, TMR_C2_FLAG);
  479. // }
  480. //// else if ((tmr_interrupt_flag_get(TMR3, TMR_C3_FLAG)) == SET)
  481. // {
  482. //
  483. // tstFlag = 4000;
  484. // /* Low Speed*/
  485. // if(Hall_HA_PORT())
  486. // {
  487. //// tmr_output_channel_polarity_set(TMR3,TMR_SELECT_CHANNEL_3,TMR_POLARITY_ACTIVE_LOW);
  488. // }
  489. // else
  490. // {
  491. //// tmr_output_channel_polarity_set(TMR3,TMR_SELECT_CHANNEL_3,TMR_POLARITY_ACTIVE_HIGH);
  492. // }
  493. //
  494. //
  495. // {
  496. //// switchhall_stCap.ulCapValue = tmr_channel_value_get(TMR3,TMR_SELECT_CHANNEL_3);
  497. // tmp_ValueCapDelta = (SLONG)switchhall_stCap.uwCaptureOverFlowCnt * 60000 + (SLONG)switchhall_stCap.ulCapValue - (SLONG)switchhall_stCap.ulCapValuePre; //switchhall_stCap.slCapValueDelta
  498. // switchhall_stCap.uwCaptureOverFlowCnt = 0;
  499. // // /* High Speed*/
  500. // // switchhall_stCap.ulHighCapValue = switchhall_stCap.ulCapValue;
  501. // // switchhall_stCap.slHighCapValueDelta = (SLONG)switchhall_stCap.ulHighCapValue - switchhall_stCap.ulHighCapValuePre;
  502. // // if(switchhall_stCap.slHighCapValueDelta < 0)
  503. // // {
  504. // // switchhall_stCap.slHighCapValueDelta += 60000;
  505. // // }
  506. // /* Move Average Filter */
  507. //
  508. // Speed_Value = tmp_ValueCapDelta; //switchhall_stCap.slCapValueDelta;
  509. // Speed_fb_sum -= Speed_buffer[Speed_sample_index];
  510. // Speed_buffer[Speed_sample_index] = Speed_Value;
  511. // Speed_fb_sum += (SQWORD)Speed_Value;
  512. // Speed_AvgValue = (SLONG)((Speed_fb_sum * 341)>>12);
  513. // Speed_sample_index++;
  514. // if (Speed_sample_index >= 12)
  515. // Speed_sample_index = 0;
  516. // switchhall_stCap.slCapValueDelta = Speed_AvgValue;
  517. // switchhall_stCap.ulCapValuePre = switchhall_stCap.ulCapValue;
  518. // }
  519. //// tmr_flag_clear(TMR3, TMR_C3_FLAG);
  520. // }
  521. //// else
  522. // {
  523. // tstFlag = 5000;
  524. //// tmp_ValueCapDelta = HALL3_SPD_CAP_LEVEL1; //switchhall_stCap.slCapValueDelta
  525. // }
  526. //
  527. //
  528. //// if(curSpeed_state.state ==StartUp || curSpeed_state.state == Open2Clz || curSpeed_state.state == ClzLoop)
  529. //// {
  530. //// if ((switchhall_stOut.swLowSpdLpfPu > 1950)||(switchhall_stOut.swLowSpdLpfPu < -1950))//500rpm
  531. //// {
  532. //// switchhall_stCap.slCapValueDelta = Speed_AvgValue;
  533. //// }
  534. //// else
  535. // //{
  536. //// switchhall_stCap.slCapValueDelta = Speed_Value;
  537. //// }
  538. //
  539. //// }
  540. //// else
  541. //// {
  542. //// switchhall_stCap.slCapValueDelta = HALL3_SPD_CAL_COEF;
  543. ////
  544. //// }
  545. tstCap = switchhall_stCap.ulCapValue >> 4;
  546. tstDeltaCap = switchhall_stCap.slCapValueDelta >> 4;
  547. }
  548. /***************************************************************
  549. Function:
  550. Description:
  551. Call by:
  552. Input Variables:
  553. Output/Return Variables:
  554. Subroutine Call:
  555. Reference:
  556. ****************************************************************/
  557. //void switchhall_voCapIsr(UWORD source)
  558. //{
  559. // if(source == 0)
  560. // {
  561. // /* 鏇存柊涓柇澶勭悊 */
  562. // switchhall_stCap.uwCaptureOverFlowCnt ++;
  563. // /* 閫熷害鎻掑�硷細澶勭悊闀夸簨浠舵棤鑴夊啿鎯呭喌 */
  564. // if(switchhall_stCap.uwCaptureOverFlowCnt >= 5)
  565. // {
  566. // tmp_ValueCapDelta = (SLONG)(switchhall_stCap.uwCaptureOverFlowCnt+1) * 60000; //switchhall_stCap.slCapValueDelta
  567. // switchhall_stCap.slCapValueDelta = tmp_ValueCapDelta;
  568. // }
  569. // /* 闄愬埗鏈�澶у�� */
  570. // if (switchhall_stCap.uwCaptureOverFlowCnt > 9)
  571. // {
  572. // switchhall_stCap.uwCaptureOverFlowCnt=10;
  573. // }
  574. // }
  575. // else
  576. // {
  577. // /* 鎹曡幏涓柇澶勭悊 */
  578. // /* 鏇存敼鎹曡幏瑙﹀彂杈规部 */
  579. //// if(iGpio_Read(HW_GPIO_HALLA_PIN + source - 1) != 0)
  580. //// {
  581. //// iCap_SetEdgeType(HW_MOTOR_HALL_CAP, CAP_CH(source-1), ApiCap_FallingEdge);
  582. //// }
  583. //// else
  584. //// {
  585. //// iCap_SetEdgeType(HW_MOTOR_HALL_CAP, CAP_CH(source-1), ApiCap_RisingEdge);
  586. //// }
  587. // /* 璁$畻鎹曡幏宸�� */
  588. // switchhall_stCap.ulCapValue = iCap_GetCaptureValue(HW_MOTOR_HALL_CAP, CAP_CH(source-1));
  589. // tmp_ValueCapDelta = (SLONG)switchhall_stCap.uwCaptureOverFlowCnt * 60000 + (SLONG)switchhall_stCap.ulCapValue - (SLONG)switchhall_stCap.ulCapValuePre; //switchhall_stCap.slCapValueDelta
  590. // switchhall_stCap.uwCaptureOverFlowCnt = 0;
  591. // /* 婊戝姩骞冲潎婊ゆ尝 */
  592. // Speed_Value = tmp_ValueCapDelta;
  593. // Speed_fb_sum -= Speed_buffer[Speed_sample_index];
  594. // Speed_buffer[Speed_sample_index] = Speed_Value;
  595. // Speed_fb_sum += (SQWORD)Speed_Value;
  596. // Speed_AvgValue = (SLONG)((Speed_fb_sum * 341)>>12);
  597. // Speed_sample_index++;
  598. // if (Speed_sample_index >= 12)
  599. // Speed_sample_index = 0;
  600. // switchhall_stCap.slCapValueDelta = Speed_AvgValue;
  601. // switchhall_stCap.ulCapValuePre = switchhall_stCap.ulCapValue;
  602. // }
  603. //}
  604. /***************************************************************
  605. Function:
  606. Description:
  607. Call by:
  608. Input Variables:
  609. Output/Return Variables:
  610. Subroutine Call:
  611. Reference:
  612. ****************************************************************/
  613. void switchhall_voPosCalTbc(void)
  614. {
  615. SLONG Hall_Theta_Temp = 0;
  616. SLONG Hall_Speed_Temp = 0;
  617. /*Low Speed Theta Update*/
  618. switchhall_stOut.slLowThetaPu += (((SLONG)TBC_TM * switchhall_stOut.swLowSpdLpfPu) >> 10); // Q10+Q15-Q10=Q15
  619. //switchhall_stOut.slLowThetaPu += (((SLONG)TBC_TM * scm_stSpdFbkLpf.slY.sw.hi) >> 10); // Q10+Q15-Q10=Q15
  620. if (switchhall_stOut.slLowThetaPu >= (cof_sl360DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  621. {
  622. switchhall_stOut.slLowThetaPu -= cof_sl360DegreePu;
  623. }
  624. else if (switchhall_stOut.slLowThetaPu < 0 + switchhall_stOut.swLowThetaOffsetPu)
  625. {
  626. switchhall_stOut.slLowThetaPu += cof_sl360DegreePu;
  627. }
  628. /*High Speed Theta Update*/
  629. // switchhall_stOut.slHighThetaPu += (((SLONG)TBC_TM * switchhall_stOut.swHighSpdLpfPu) >> 10); // Q10+Q15-Q10=Q15
  630. // if (switchhall_stOut.slHighThetaPu >= cof_sl360DegreePu + switchhall_stOut.swLowThetaOffsetPu)
  631. // {
  632. // switchhall_stOut.slHighThetaPu -= cof_sl360DegreePu;
  633. // }
  634. // else if (switchhall_stOut.slHighThetaPu < switchhall_stOut.swLowThetaOffsetPu)
  635. // {
  636. // switchhall_stOut.slHighThetaPu += cof_sl360DegreePu;
  637. // }
  638. /*Sector Judgement*/
  639. #if(EMCDEAL_EN==0)
  640. switchhall_voSectorJudge();
  641. #endif
  642. /*!< Zero Correction 1*/
  643. // switch(switchhall_stOut.uwSectorNum)
  644. // {
  645. // case 1:
  646. // if(switchhall_stOut.uwSectorNumPre == 3)
  647. // {
  648. // switchhall_stOut.swSpdCWorCCW = 1;
  649. // switchhall_stOut.slLowThetaPu = cof_sl210DegreePu;
  650. // }
  651. // else if(switchhall_stOut.uwSectorNumPre == 5)
  652. // {
  653. // switchhall_stOut.swSpdCWorCCW =-1;
  654. // switchhall_stOut.slLowThetaPu = cof_sl270DegreePu;
  655. // }
  656. //
  657. // switchhall_stOut.slInitThetaPu = cof_sl240DegreePu;
  658. // if(switchhall_stOut.slLowThetaPu < cof_sl210DegreePu)
  659. // {
  660. // switchhall_stOut.slLowThetaPu = cof_sl210DegreePu;
  661. // }
  662. // else if(switchhall_stOut.slLowThetaPu > cof_sl270DegreePu)
  663. // {
  664. // switchhall_stOut.slLowThetaPu = cof_sl270DegreePu;
  665. // }
  666. // else
  667. // {
  668. // }
  669. // break;
  670. // case 2:
  671. // if(switchhall_stOut.uwSectorNumPre == 6)
  672. // {
  673. // switchhall_stOut.swSpdCWorCCW = 1;
  674. // switchhall_stOut.slLowThetaPu = cof_sl90DegreePu;
  675. // }
  676. // else if(switchhall_stOut.uwSectorNumPre == 3)
  677. // {
  678. // switchhall_stOut.swSpdCWorCCW =-1;
  679. // switchhall_stOut.slLowThetaPu = cof_sl150DegreePu;
  680. // }
  681. //
  682. // switchhall_stOut.slInitThetaPu = cof_sl120DegreePu;
  683. // if(switchhall_stOut.slLowThetaPu < cof_sl90DegreePu)
  684. // {
  685. // switchhall_stOut.slLowThetaPu = cof_sl90DegreePu;
  686. // }
  687. // else if(switchhall_stOut.slLowThetaPu > cof_sl150DegreePu)
  688. // {
  689. // switchhall_stOut.slLowThetaPu = cof_sl150DegreePu;
  690. // }
  691. // else
  692. // {
  693. // }
  694. // break;
  695. // case 3:
  696. // if(switchhall_stOut.uwSectorNumPre == 2)
  697. // {
  698. // switchhall_stOut.swSpdCWorCCW = 1;
  699. // switchhall_stOut.slLowThetaPu = cof_sl150DegreePu;
  700. // }
  701. // else if(switchhall_stOut.uwSectorNumPre == 1)
  702. // {
  703. // switchhall_stOut.swSpdCWorCCW =-1;
  704. // switchhall_stOut.slLowThetaPu = cof_sl210DegreePu;
  705. // }
  706. //
  707. // switchhall_stOut.slInitThetaPu = cof_sl180DegreePu;
  708. // if(switchhall_stOut.slLowThetaPu < cof_sl150DegreePu)
  709. // {
  710. // switchhall_stOut.slLowThetaPu = cof_sl150DegreePu;
  711. // }
  712. // else if(switchhall_stOut.slLowThetaPu > cof_sl210DegreePu)
  713. // {
  714. // switchhall_stOut.slLowThetaPu = cof_sl210DegreePu;
  715. // }
  716. // else
  717. // {
  718. // }
  719. // break;
  720. // case 4:
  721. // if(switchhall_stOut.uwSectorNumPre == 5)
  722. // {
  723. // switchhall_stOut.swSpdCWorCCW = 1;
  724. // switchhall_stOut.slLowThetaPu = cof_sl330DegreePu;
  725. // }
  726. // else if(switchhall_stOut.uwSectorNumPre == 6)
  727. // {
  728. // switchhall_stOut.swSpdCWorCCW =-1;
  729. // switchhall_stOut.slLowThetaPu = cof_sl30DegreePu;
  730. // }
  731. //
  732. // switchhall_stOut.slInitThetaPu = 0;
  733. // if((switchhall_stOut.slLowThetaPu > cof_sl30DegreePu)&&(switchhall_stOut.slLowThetaPu < cof_sl330DegreePu))
  734. // {
  735. // if(switchhall_stOut.swSpdCWorCCW == 1)
  736. // {
  737. // switchhall_stOut.slLowThetaPu = cof_sl30DegreePu;
  738. // }
  739. // else if(switchhall_stOut.swSpdCWorCCW == -1)
  740. // {
  741. // switchhall_stOut.slLowThetaPu = cof_sl330DegreePu;
  742. // }
  743. // }
  744. // break;
  745. // case 5:
  746. // if(switchhall_stOut.uwSectorNumPre == 1)
  747. // {
  748. // switchhall_stOut.swSpdCWorCCW = 1;
  749. // switchhall_stOut.slLowThetaPu = cof_sl270DegreePu;
  750. // }
  751. // else if(switchhall_stOut.uwSectorNumPre == 4)
  752. // {
  753. // switchhall_stOut.swSpdCWorCCW =-1;
  754. // switchhall_stOut.slLowThetaPu = cof_sl330DegreePu;
  755. // }
  756. //
  757. // switchhall_stOut.slInitThetaPu = cof_sl300DegreePu;
  758. // if(switchhall_stOut.slLowThetaPu < cof_sl270DegreePu)
  759. // {
  760. // switchhall_stOut.slLowThetaPu = cof_sl270DegreePu;
  761. // }
  762. // else if(switchhall_stOut.slLowThetaPu > cof_sl330DegreePu)
  763. // {
  764. // switchhall_stOut.slLowThetaPu = cof_sl330DegreePu;
  765. // }
  766. // else
  767. // {
  768. // }
  769. // break;
  770. // case 6:
  771. // if(switchhall_stOut.uwSectorNumPre == 4)
  772. // {
  773. // switchhall_stOut.swSpdCWorCCW = 1;
  774. // switchhall_stOut.slLowThetaPu = cof_sl30DegreePu;
  775. // }
  776. // else if(switchhall_stOut.uwSectorNumPre == 2)
  777. // {
  778. // switchhall_stOut.swSpdCWorCCW = -1;
  779. // switchhall_stOut.slLowThetaPu = cof_sl90DegreePu;
  780. // }
  781. //
  782. // switchhall_stOut.slInitThetaPu = cof_sl60DegreePu;
  783. // if(switchhall_stOut.slLowThetaPu < cof_sl30DegreePu)
  784. // {
  785. // switchhall_stOut.slLowThetaPu = cof_sl30DegreePu;
  786. // }
  787. // else if(switchhall_stOut.slLowThetaPu > cof_sl90DegreePu)
  788. // {
  789. // switchhall_stOut.slLowThetaPu = cof_sl90DegreePu;
  790. // }
  791. // else
  792. // {
  793. // }
  794. // break;
  795. // default:
  796. // switchhall_stOut.swSpdCWorCCW =0;
  797. // switchhall_stOut.swLowSpdPu = 0;
  798. // break;
  799. // }
  800. //
  801. //
  802. /*!< Zero Correction 2*/
  803. switch (switchhall_stOut.uwSectorNum)
  804. {
  805. case 1:
  806. if (switchhall_stOut.uwSectorNumPre == 3)
  807. {
  808. switchhall_stOut.swSpdCWorCCW = 1;
  809. switchhall_stOut.slLowThetaPu = cof_sl30DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  810. }
  811. else if (switchhall_stOut.uwSectorNumPre == 5)
  812. {
  813. switchhall_stOut.swSpdCWorCCW = -1;
  814. switchhall_stOut.slLowThetaPu = cof_sl90DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  815. }
  816. switchhall_stOut.slInitThetaPu = cof_sl60DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  817. if (switchhall_stOut.slLowThetaPu < (cof_sl30DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  818. {
  819. switchhall_stOut.slLowThetaPu = cof_sl30DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  820. }
  821. else if (switchhall_stOut.slLowThetaPu > (cof_sl90DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  822. {
  823. switchhall_stOut.slLowThetaPu = cof_sl90DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  824. }
  825. else
  826. {}
  827. break;
  828. case 2:
  829. if (switchhall_stOut.uwSectorNumPre == 6)
  830. {
  831. switchhall_stOut.swSpdCWorCCW = 1;
  832. switchhall_stOut.slLowThetaPu = cof_sl270DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  833. }
  834. else if (switchhall_stOut.uwSectorNumPre == 3)
  835. {
  836. switchhall_stOut.swSpdCWorCCW = -1;
  837. switchhall_stOut.slLowThetaPu = cof_sl330DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  838. }
  839. switchhall_stOut.slInitThetaPu = cof_sl300DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  840. if (switchhall_stOut.slLowThetaPu < (cof_sl270DegreePu+ switchhall_stOut.swLowThetaOffsetPu))
  841. {
  842. switchhall_stOut.slLowThetaPu = cof_sl270DegreePu + switchhall_stOut.swLowThetaOffsetPu ;
  843. }
  844. else if (switchhall_stOut.slLowThetaPu > (cof_sl330DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  845. {
  846. switchhall_stOut.slLowThetaPu = cof_sl330DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  847. }
  848. else
  849. {}
  850. break;
  851. case 3:
  852. if (switchhall_stOut.uwSectorNumPre == 2)
  853. {
  854. switchhall_stOut.swSpdCWorCCW = 1;
  855. switchhall_stOut.slLowThetaPu = cof_sl330DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  856. }
  857. else if (switchhall_stOut.uwSectorNumPre == 1)
  858. {
  859. switchhall_stOut.swSpdCWorCCW = -1;
  860. switchhall_stOut.slLowThetaPu = cof_sl30DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  861. }
  862. switchhall_stOut.slInitThetaPu = cof_sl360DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  863. if ((switchhall_stOut.slLowThetaPu > (cof_sl30DegreePu + switchhall_stOut.swLowThetaOffsetPu)) && (switchhall_stOut.slLowThetaPu < (cof_sl330DegreePu + switchhall_stOut.swLowThetaOffsetPu)))
  864. {
  865. if (switchhall_stOut.swSpdCWorCCW == 1)
  866. {
  867. switchhall_stOut.slLowThetaPu = cof_sl30DegreePu + switchhall_stOut.swLowThetaOffsetPu ;
  868. }
  869. else if (switchhall_stOut.swSpdCWorCCW == -1)
  870. {
  871. switchhall_stOut.slLowThetaPu = cof_sl330DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  872. }
  873. }
  874. break;
  875. case 4:
  876. if (switchhall_stOut.uwSectorNumPre == 5)
  877. {
  878. switchhall_stOut.swSpdCWorCCW = 1;
  879. switchhall_stOut.slLowThetaPu = cof_sl150DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  880. }
  881. else if (switchhall_stOut.uwSectorNumPre == 6)
  882. {
  883. switchhall_stOut.swSpdCWorCCW = -1;
  884. switchhall_stOut.slLowThetaPu = cof_sl210DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  885. }
  886. switchhall_stOut.slInitThetaPu = cof_sl180DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  887. if (switchhall_stOut.slLowThetaPu < (cof_sl150DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  888. {
  889. switchhall_stOut.slLowThetaPu = cof_sl150DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  890. }
  891. else if (switchhall_stOut.slLowThetaPu > (cof_sl210DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  892. {
  893. switchhall_stOut.slLowThetaPu = cof_sl210DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  894. }
  895. else
  896. {}
  897. break;
  898. case 5:
  899. if (switchhall_stOut.uwSectorNumPre == 1)
  900. {
  901. switchhall_stOut.swSpdCWorCCW = 1;
  902. switchhall_stOut.slLowThetaPu = cof_sl90DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  903. }
  904. else if (switchhall_stOut.uwSectorNumPre == 4)
  905. {
  906. switchhall_stOut.swSpdCWorCCW = -1;
  907. switchhall_stOut.slLowThetaPu = cof_sl150DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  908. }
  909. switchhall_stOut.slInitThetaPu = cof_sl120DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  910. if (switchhall_stOut.slLowThetaPu < (cof_sl90DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  911. {
  912. switchhall_stOut.slLowThetaPu = cof_sl90DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  913. }
  914. else if (switchhall_stOut.slLowThetaPu > (cof_sl150DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  915. {
  916. switchhall_stOut.slLowThetaPu = cof_sl150DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  917. }
  918. else
  919. {}
  920. break;
  921. case 6:
  922. if (switchhall_stOut.uwSectorNumPre == 4)
  923. {
  924. switchhall_stOut.swSpdCWorCCW = 1;
  925. switchhall_stOut.slLowThetaPu = cof_sl210DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  926. }
  927. else if (switchhall_stOut.uwSectorNumPre == 2)
  928. {
  929. switchhall_stOut.swSpdCWorCCW = -1;
  930. switchhall_stOut.slLowThetaPu = cof_sl270DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  931. }
  932. switchhall_stOut.slInitThetaPu = cof_sl240DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  933. if (switchhall_stOut.slLowThetaPu < (cof_sl210DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  934. {
  935. switchhall_stOut.slLowThetaPu = cof_sl210DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  936. }
  937. else if (switchhall_stOut.slLowThetaPu > (cof_sl270DegreePu + switchhall_stOut.swLowThetaOffsetPu))
  938. {
  939. switchhall_stOut.slLowThetaPu = cof_sl270DegreePu + switchhall_stOut.swLowThetaOffsetPu;
  940. }
  941. else
  942. {}
  943. break;
  944. default:
  945. // switchhall_stOut.swSpdCWorCCW = 0;
  946. // switchhall_stOut.swLowSpdPu = 0;
  947. break;
  948. }
  949. switchhall_stOut.uwSectorNumPre = switchhall_stOut.uwSectorNum;
  950. /* Theta Compensation */
  951. // if (switchhall_stOut.swSpdCWorCCW == -1)
  952. // {
  953. // switchhall_stOut.swLowThetaOffsetPu = switchhall_stOut.swLowThetaOffsetPu + HALL_THETEA_OFFSET_FANXIANG;
  954. // }
  955. //
  956. // /* Speed Calculation */
  957. // if (switchhall_stOut.swSpdCWorCCW == 1)
  958. // {
  959. // switchhall_stOut.swLowSpdPu = (SWORD)(HALL3_SPD_CAL_COEF / switchhall_stCap.slCapValueDelta);
  960. // }
  961. // else if (switchhall_stOut.swSpdCWorCCW == -1)
  962. // {
  963. // switchhall_stOut.swLowSpdPu = -(SWORD)(HALL3_SPD_CAL_COEF / switchhall_stCap.slCapValueDelta);
  964. // }
  965. // else
  966. // {
  967. // switchhall_stOut.swLowSpdPu = 0;
  968. // }
  969. if (switchhall_stCap.slCapValueDelta >= HALL3_SPD_CAP_LEVEL1) //lower than level1
  970. {
  971. // switchhall_stOut.swLowSpdPu = 0;
  972. // switchhall_stOut.uwLowThetaPu = switchhall_stOut.slInitThetaPu;
  973. // Hall_Theta_Temp = (UWORD)(switchhall_stOut.slInitThetaPu+switchhall_stOut.swLowThetaOffsetPu); // Q15
  974. Hall_Theta_Temp = switchhall_stOut.slInitThetaPu;
  975. // Hall_Theta_Temp = switchhall_stOut.slLowThetaPu;
  976. if (Hall_Theta_Temp >= cof_sl360DegreePu)
  977. {
  978. Hall_Theta_Temp -= cof_sl360DegreePu;
  979. }
  980. else if (Hall_Theta_Temp < 0)
  981. {
  982. Hall_Theta_Temp += cof_sl360DegreePu;
  983. }
  984. switchhall_stOut.uwLowThetaPu = (UWORD)Hall_Theta_Temp;
  985. if (switchhall_stOut.swSpdCWorCCW == 1)
  986. {
  987. switchhall_stOut.swLowSpdPu = (SWORD)(HALL3_SPD_CAL_COEF / switchhall_stCap.slCapValueDelta);
  988. switchhall_stOut.swHighSpdPu = (SWORD)(HALL1_SPD_CAL_COEF / switchhall_stCap.slHighCapValueDelta);
  989. // switchhall_stOut.swLowSpdPu = (SWORD)(HALL3_SPD_CAL_COEF / tmp_ValueCapDelta);
  990. }
  991. else if (switchhall_stOut.swSpdCWorCCW == -1)
  992. {
  993. switchhall_stOut.swLowSpdPu = -(SWORD)(HALL3_SPD_CAL_COEF / switchhall_stCap.slCapValueDelta);
  994. switchhall_stOut.swHighSpdPu = -(SWORD)(HALL1_SPD_CAL_COEF / switchhall_stCap.slHighCapValueDelta);
  995. // switchhall_stOut.swLowSpdPu = -(SWORD)(HALL3_SPD_CAL_COEF / tmp_ValueCapDelta);
  996. }
  997. else
  998. {
  999. // switchhall_stOut.swLowSpdPu = 0;
  1000. }
  1001. }
  1002. else if (switchhall_stCap.slCapValueDelta >= HALL3_SPD_CAP_LEVEL2) // lower than level2
  1003. {
  1004. /* Use fixed angle(middle of sector) at low speed*/
  1005. if (switchhall_stCap.slCapValueDelta >= HALL3_SPD_CAP_STARTUP_LEVEL) // lower than Startup level
  1006. {
  1007. // switchhall_stOut.uwLowThetaPu = switchhall_stOut.slInitThetaPu;
  1008. //Hall_Theta_Temp = (UWORD)(switchhall_stOut.slInitThetaPu+switchhall_stOut.swLowThetaOffsetPu); // Q15
  1009. // Hall_Theta_Temp = switchhall_stOut.slInitThetaPu;
  1010. Hall_Theta_Temp = switchhall_stOut.slLowThetaPu;
  1011. if (Hall_Theta_Temp >= cof_sl360DegreePu)
  1012. {
  1013. Hall_Theta_Temp -= cof_sl360DegreePu;
  1014. }
  1015. else if (Hall_Theta_Temp < 0)
  1016. {
  1017. Hall_Theta_Temp += cof_sl360DegreePu;
  1018. }
  1019. switchhall_stOut.uwLowThetaPu = (UWORD)Hall_Theta_Temp;
  1020. }
  1021. else
  1022. {
  1023. /*Low Speed Theta */
  1024. //Hall_Theta_Temp = (UWORD)(switchhall_stOut.slLowThetaPu+switchhall_stOut.swLowThetaOffsetPu); // Q15
  1025. Hall_Theta_Temp = switchhall_stOut.slLowThetaPu;
  1026. if (Hall_Theta_Temp >= cof_sl360DegreePu)
  1027. {
  1028. Hall_Theta_Temp -= cof_sl360DegreePu;
  1029. }
  1030. else if (Hall_Theta_Temp < 0)
  1031. {
  1032. Hall_Theta_Temp += cof_sl360DegreePu;
  1033. }
  1034. switchhall_stOut.uwLowThetaPu = (UWORD)Hall_Theta_Temp;
  1035. /*High Speed Theta */
  1036. // if (switchhall_stOut.slHighThetaPu >= cof_sl360DegreePu)
  1037. // {
  1038. // switchhall_stOut.slHighThetaPu -= cof_sl360DegreePu;
  1039. // }
  1040. // else if (switchhall_stOut.slHighThetaPu < 0)
  1041. // {
  1042. // switchhall_stOut.slHighThetaPu += cof_sl360DegreePu;
  1043. // }
  1044. // switchhall_stOut.uwHighThetaPu = cof_sl360DegreePu;
  1045. }
  1046. Hall_Speed_Temp = (SWORD)(HALL3_SPD_CAL_COEF / switchhall_stCap.slCapValueDelta);
  1047. // Hall_Speed_Temp = (SWORD)(HALL3_SPD_CAL_COEF / tmp_ValueCapDelta);
  1048. if (switchhall_stOut.swSpdCWorCCW == 1)
  1049. {
  1050. if(switchhall_stOut.swLowSpdPu < 0)
  1051. {
  1052. switchhall_stOut.swLowSpdPu += (_IQ15(0.0007)); //1hz
  1053. }
  1054. else
  1055. {
  1056. switchhall_stOut.swLowSpdPu = Hall_Speed_Temp;
  1057. }
  1058. switchhall_stOut.swHighSpdPu = (SWORD)(HALL1_SPD_CAL_COEF / switchhall_stCap.slHighCapValueDelta);
  1059. }
  1060. else if (switchhall_stOut.swSpdCWorCCW == -1)
  1061. {
  1062. if(switchhall_stOut.swLowSpdPu > 0)
  1063. {
  1064. switchhall_stOut.swLowSpdPu -= (_IQ15(0.0007)); //1hz
  1065. }
  1066. else
  1067. {
  1068. switchhall_stOut.swLowSpdPu = -Hall_Speed_Temp;
  1069. }
  1070. switchhall_stOut.swHighSpdPu = -(SWORD)(HALL1_SPD_CAL_COEF / switchhall_stCap.slHighCapValueDelta);
  1071. }
  1072. else
  1073. {
  1074. // switchhall_stOut.swLowSpdPu = 0;
  1075. }
  1076. }
  1077. else
  1078. {
  1079. // High speed: use single hall
  1080. }
  1081. #if(EMCDEAL_EN!=0)
  1082. // switchhall_stOut.swLowSpdPu=EcmDeal.swLowSpdPu;
  1083. #endif
  1084. /* Low Speed LPF */
  1085. switchhall_pvt_slLowSpdLpfPu =
  1086. (SLONG)203 * (switchhall_stOut.swLowSpdPu - switchhall_stOut.swLowSpdLpfPu) + switchhall_pvt_slLowSpdLpfPu; //50Hz
  1087. // switchhall_pvt_slLowSpdLpfPu =
  1088. // (SLONG)1286 * (switchhall_stOut.swLowSpdPu - switchhall_stOut.swLowSpdLpfPu) + switchhall_pvt_slLowSpdLpfPu; //50Hz
  1089. switchhall_stOut.swLowSpdLpfPu = switchhall_pvt_slLowSpdLpfPu >> 15;
  1090. /* High Speed LPF */
  1091. // switchhall_pvt_slHighSpdLpfPu =
  1092. // (SLONG)0x00CB * (switchhall_stOut.swHighSpdPu - switchhall_stOut.swHighSpdLpfPu) + switchhall_pvt_slHighSpdLpfPu;
  1093. // switchhall_stOut.swHighSpdLpfPu = switchhall_pvt_slHighSpdLpfPu >> 15;
  1094. }
  1095. UWORD Hcnt;
  1096. void HALLTIMER_INST_IRQHandler(void) //void TMR16_GLOBAL_IRQHandler(void)
  1097. {
  1098. switch (DL_Timer_getPendingInterrupt(HALLTIMER_INST))
  1099. {
  1100. case DL_TIMER_IIDX_ZERO:
  1101. #if(EMCDEAL_EN!=0)
  1102. if( EcmDeal.EmcModeFlag==TRUE)
  1103. switchhall_stCap.slCapValueDelta= EcmDeal.slCapValueDelta;
  1104. else
  1105. #endif
  1106. {
  1107. switchhall_voSectorJudge();
  1108. Hcnt++;
  1109. switchhall_stCap.uwCaptureOverFlowCnt ++;
  1110. if(switchhall_stCap.uwCaptureOverFlowCnt >= 5)
  1111. {
  1112. tmp_ValueCapDelta = (SLONG)(switchhall_stCap.uwCaptureOverFlowCnt+1) * 60011; //switchhall_stCap.slCapValueDelta
  1113. switchhall_stCap.slCapValueDelta = tmp_ValueCapDelta;
  1114. }
  1115. if (switchhall_stCap.uwCaptureOverFlowCnt > 9) //1HZ
  1116. {
  1117. /* Linmit the max CapValueDelta */
  1118. switchhall_stCap.uwCaptureOverFlowCnt=10;
  1119. }
  1120. }
  1121. break;
  1122. default:
  1123. break;
  1124. }
  1125. }
  1126. /*************************************************************************
  1127. End of this File (EOF)!
  1128. Do not put anything after this part!
  1129. *************************************************************************/