switchhall.c 46 KB

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