Cadence.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. /**
  2. * @file Cadence.c
  3. * @author Wang, Zhiyu(wangzy49@midea.com)
  4. * @brief Cadence of ebike
  5. * @version 0.1
  6. * @date 2021-09-29
  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 "syspar.h"
  16. #include "typedefine.h"
  17. #include "mathtool.h"
  18. //#include "cadence.h"
  19. #include "CodePara.h"
  20. #include "AssistCurve.h"
  21. #include "CadAssist.h"
  22. #include "bikeinformation.h"
  23. //#include "api.h"
  24. #include "board_config.h"
  25. #include "UserGpio_Config.h"
  26. /******************************
  27. *
  28. * Parameter
  29. *
  30. ******************************/
  31. CADENCE_COF cadence_stFreGetCof = CADENCE_COF_DEFAULT;
  32. CADENCE_OUT cadence_stFreGetOut = CADENCE_OUT_DEFAULT;
  33. extern BIKESPEED_OUT bikespeed_stFreGetOut;
  34. CADDIR_STRUCT Cad_Dir={0,0,2};
  35. /***************************************************************
  36. Function: cadence_voCadenceCof;
  37. Description: cadence function coef cal
  38. Call by: functions in main loop;
  39. Input Variables: N/A
  40. Output/Return Variables: N/A
  41. Subroutine Call: N/A;
  42. Reference: N/A
  43. ****************************************************************/
  44. void cadence_voCadenceCof(void)
  45. {
  46. // cadence_stFreGetCof.uwNumbersPulses = CADENCE_NUMBERS_PULSES;
  47. if(cp_stFlg.RunModelSelect==TorqAssist)
  48. {
  49. cadence_stFreGetCof.uwSartIntervalTimeCnt = ((ULONG)TORQUE_START_INTERVALTIME_MS * 1000) / TORQUE_TIM_TIMERUNIT_US;
  50. cadence_stFreGetCof.uwNumbersValidPulse2Start = TORQUE_NUMBERS_VALIDPULSE2START;
  51. cadence_stFreGetCof.uwLfRecordTimeCnt = ((ULONG)TORQUE_LF_RECORDTIME_MS * 1000) / TORQUE_TIM_TIMERUNIT_US;
  52. cadence_stFreGetCof.uwLfMinFrePu = ((((ULONG)TORQUE_LF_MINFRE << 10) / 100) << 10) / FBASE; // Q20
  53. if(cadence_stFreGetCof.uwTorque_NumbersPulses <= 36)
  54. {
  55. cadence_stFreGetCof.uwHfMaxTimeCnt = ((ULONG)((800L*12)/cadence_stFreGetCof.uwTorque_NumbersPulses)*1000) / TORQUE_TIM_TIMERUNIT_US;
  56. }
  57. else
  58. {
  59. cadence_stFreGetCof.uwHfMaxTimeCnt = ((ULONG)((800L*12)/36)*1000) / TORQUE_TIM_TIMERUNIT_US;
  60. }
  61. cadence_stFreGetCof.uwErrorResetCnt = ((ULONG)TORQUE_ERROR_RESETTIME_MS*1000) / TORQUE_TIM_TIMERUNIT_US;
  62. cadence_stFreGetCof.uwTimerUnit = TORQUE_TIM_TIMERUNIT_US;
  63. cadence_stFreGetCof.uwCadenceLPFgain = TORQUE_LPF_GAIN;
  64. cadence_stFreGetCof.uwMaxCadenceFre = ((ULONG)TORQUE_MAX_FREQUENCY << 20) / FBASE; // Q20
  65. }
  66. else
  67. {
  68. cadence_stFreGetCof.uwSartIntervalTimeCnt = ((ULONG)CADENCE_START_INTERVALTIME_MS * 1000) / CADENCE_TIM_TIMERUNIT_US;
  69. cadence_stFreGetCof.uwNumbersValidPulse2Start = CADENCE_NUMBERS_VALIDPULSE2START;
  70. cadence_stFreGetCof.uwLfRecordTimeCnt = ((ULONG)CADENCE_LF_RECORDTIME_MS * 1000) / CADENCE_TIM_TIMERUNIT_US;
  71. cadence_stFreGetCof.uwLfMinFrePu = ((((ULONG)CADENCE_LF_MINFRE << 10) / 100) << 10) / FBASE; // Q20
  72. if(cadence_stFreGetCof.uwCad_NumbersPulses <= 36)
  73. {
  74. cadence_stFreGetCof.uwHfMaxTimeCnt = ((ULONG)((800L*12)/cadence_stFreGetCof.uwCad_NumbersPulses)*1000) / CADENCE_TIM_TIMERUNIT_US;
  75. }
  76. else
  77. {
  78. cadence_stFreGetCof.uwHfMaxTimeCnt = ((ULONG)((800L*12)/36)*1000) / CADENCE_TIM_TIMERUNIT_US;
  79. }
  80. cadence_stFreGetCof.uwErrorResetCnt = ((ULONG)CADENCE_ERROR_RESETTIME_MS*1000) / CADENCE_TIM_TIMERUNIT_US;
  81. cadence_stFreGetCof.uwTimerUnit = CADENCE_TIM_TIMERUNIT_US;
  82. cadence_stFreGetCof.uwCadenceLPFgain = CADENCE_LPF_GAIN;
  83. cadence_stFreGetCof.uwMaxCadenceFre = ((ULONG)CADENCE_MAX_FREQUENCY << 20) / FBASE; // Q20
  84. }
  85. }
  86. /***************************************************************
  87. Function: cadence_voFreGet;
  88. Description: cadence frequency get
  89. Call by: functions in main loop;
  90. Input Variables: N/A
  91. Output/Return Variables: N/A
  92. Subroutine Call: N/A;
  93. Reference: N/A
  94. ****************************************************************/
  95. static void cadence_voCadenceIdle(UWORD source)
  96. {
  97. if (source == 1)
  98. {
  99. // cadence_stFreGetOut.uwCaputureOverflowCnt++;
  100. if (cadence_stFreGetOut.uwCaputureOverflowCnt > cadence_stFreGetCof.uwSartIntervalTimeCnt) //torque-1s;Cad-5S
  101. {
  102. cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
  103. cadence_stFreGetOut.uwCaputureNumCnt = 0;
  104. }
  105. }
  106. else
  107. {
  108. if (cadence_stFreGetOut.cadence_dir == CADENCE_DIR_BACKWARD) // 0.25s
  109. {
  110. cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
  111. cadence_stFreGetOut.uwCaputureNumCnt = 0;
  112. }
  113. if (cadence_stFreGetOut.cadence_dir == CADENCE_DIR_FORWARD)
  114. {
  115. cadence_stFreGetOut.uwCaputureNumCnt++;
  116. cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
  117. }
  118. if (cadence_stFreGetOut.uwCaputureNumCnt >= cadence_stFreGetCof.uwNumbersValidPulse2Start) //1
  119. {
  120. cadence_stFreGetOut.blCadenceCalStartState = TRUE;
  121. cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
  122. cadence_stFreGetOut.uwCaputureNumCnt = 0;
  123. cadence_stFreGetOut.cadence_fsm = CADENCE_HFreWork;
  124. cadence_stFreGetOut.uwForwardCnt = 0;
  125. }
  126. }
  127. }
  128. /***************************************************************
  129. Function: cadence_voFreGet;
  130. Description: cadence frequency get
  131. Call by: functions in main loop;
  132. Input Variables: N/A
  133. Output/Return Variables: N/A
  134. Subroutine Call: N/A;
  135. Reference: N/A
  136. ****************************************************************/
  137. static void cadence_voCadenceLowFrequencyWork(UWORD source)
  138. {
  139. if (source == 1)
  140. {
  141. // cadence_stFreGetOut.uwCaputureOverflowCnt++;
  142. if (cadence_stFreGetOut.uwCaputureOverflowCnt == cadence_stFreGetCof.uwLfRecordTimeCnt)
  143. {
  144. cadence_stFreGetOut.uwFrequencyPu = ((SQWORD)cadence_stFreGetOut.uwCaputureNumCnt << 20) * 1000 /
  145. (cadence_stFreGetCof.uwLfRecordTimeCnt * cadence_stFreGetCof.uwTimerUnit) /
  146. cadence_stFreGetCof.uwNumbersPulses /1000 /FBASE;
  147. cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
  148. cadence_stFreGetOut.uwCaputureNumCnt = 0;
  149. if (cadence_stFreGetOut.uwFrequencyPu < (cadence_stFreGetCof.uwLfMinFrePu))
  150. {
  151. cadence_stFreGetOut.uwFrequencyPu = 0;
  152. cadence_stFreGetOut.uwLPFFrequencyPu = 0;
  153. cadence_stFreGetOut.blCadenceCalStartState = FALSE;
  154. cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
  155. cadence_stFreGetOut.uwCaputureNumCnt = 0;
  156. cadence_stFreGetOut.cadence_fsm = CADENCE_IDLE;
  157. }
  158. }
  159. }
  160. else
  161. {
  162. cadence_stFreGetOut.uwCaputureNumCnt++;
  163. }
  164. if (cadence_stFreGetOut.uwFrequencyPu > cadence_stFreGetCof.uwMaxCadenceFre)
  165. {
  166. cadence_stFreGetOut.uwFrequencyPu = 0;
  167. cadence_stFreGetOut.blCadenceCalStartState = FALSE;
  168. cadence_stFreGetOut.blCadenceSensorErrorFlg = TRUE;
  169. cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
  170. cadence_stFreGetOut.uwCaputureNumCnt = 0;
  171. cadence_stFreGetOut.uwCaputure2Cnt = 0;
  172. cadence_stFreGetOut.uwCaputure1Cnt = 0;
  173. cadence_stFreGetOut.cadence_fsm = CADENCE_ERROR;
  174. }
  175. }
  176. /***************************************************************
  177. Function: cadence_voFreGet;
  178. Description: cadence frequency get
  179. Call by: functions in main loop;
  180. Input Variables: N/A
  181. Output/Return Variables: N/A
  182. Subroutine Call: N/A;
  183. Reference: N/A
  184. ****************************************************************/
  185. ULONG ulCaputureCntErr = 0;
  186. UWORD test_stoptime1 = 0;
  187. UWORD Cad_startdeccnt=6;
  188. static void cadence_voCadenceHighFrequencyWork(UWORD source)
  189. {
  190. UWORD tmp_uwFrequencyPu = 0;
  191. ULONG tmp_ulStopTime = 0;
  192. ULONG tmp_ulBikeSpd = 0;
  193. if (source == 1)
  194. {
  195. // cadence_stFreGetOut.uwCaputureOverflowCnt++;
  196. // if(cadence_stFreGetOut.uwCaputureOverflowCnt > (cadence_stFreGetCof.uwHfMaxTimeCnt + 1))
  197. // {
  198. // cadence_stFreGetOut.uwCaputureOverflowCnt = (cadence_stFreGetCof.uwHfMaxTimeCnt + 1);
  199. // }
  200. if(cadence_stFreGetOut.uwCaputureNumCnt == 1)
  201. {
  202. if(cadence_stFreGetOut.uwCaputureOverflowCnt > (cadence_stFreGetOut.uwCntErrLast + 1))//1
  203. {
  204. ulCaputureCntErr = ((ULONG)cadence_stFreGetOut.uwCaputureOverflowCnt * (72L * cadence_stFreGetCof.uwTimerUnit))>>8;
  205. cadence_stFreGetOut.ulCaputureCntErr = ulCaputureCntErr;
  206. tmp_uwFrequencyPu = (UWORD)(((SQWORD)72000000 << 12) / (((SQWORD)cadence_stFreGetOut.ulCaputureCntErr) * cadence_stFreGetCof.uwNumbersPulses * FBASE));
  207. cadence_stFreGetOut.uwFrequencyPu = tmp_uwFrequencyPu;
  208. }
  209. }
  210. }
  211. else if (source == 2)
  212. {
  213. cadence_stFreGetOut.uwForwardCnt++;
  214. if(cadence_stFreGetOut.uwForwardCnt >= 24000)
  215. {
  216. cadence_stFreGetOut.uwForwardCnt = 24000;
  217. }
  218. if (cadence_stFreGetOut.uwCaputureNumCnt == 0)
  219. {
  220. cadence_stFreGetOut.uwCaputureNumCnt = 1;
  221. // cadence_stFreGetOut.uwCaputure1Cnt = (UWORD)CapValutCadence_CCRx();//(UWORD)iCap_GetCaptureValue(HW_BIKESPD_CAD_CAP, CAP_CH(2));
  222. ulCaputureCntErr = ((ULONG)cadence_stFreGetOut.uwCaputureOverflowCnt * (72L * cadence_stFreGetCof.uwTimerUnit))>>8;
  223. cadence_stFreGetOut.ulCaputureCntErr = ulCaputureCntErr;
  224. tmp_uwFrequencyPu = (UWORD)(((SQWORD)72000000 << 12) / (((SQWORD)cadence_stFreGetOut.ulCaputureCntErr) * cadence_stFreGetCof.uwNumbersPulses * FBASE));
  225. cadence_stFreGetOut.uwFrequencyPu = tmp_uwFrequencyPu;
  226. cadence_stFreGetOut.uwFrequencyLastPu = tmp_uwFrequencyPu;
  227. cadence_stFreGetOut.uwCntErrLast = cadence_stFreGetOut.uwCaputureOverflowCnt;
  228. cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
  229. }
  230. else if (cadence_stFreGetOut.uwCaputureNumCnt == 1)
  231. {
  232. cadence_stFreGetOut.uwCaputureNumCnt = 2;
  233. // cadence_stFreGetOut.uwCaputure2Cnt = (UWORD)CapValutCadence_CCRx();//(UWORD)iCap_GetCaptureValue(HW_BIKESPD_CAD_CAP, CAP_CH(2));
  234. ulCaputureCntErr = (((ULONG)cadence_stFreGetOut.uwCaputureOverflowCnt * (72 * cadence_stFreGetCof.uwTimerUnit)) )>>8;
  235. cadence_stFreGetOut.ulCaputureCntErr = ulCaputureCntErr;
  236. if (cadence_stFreGetOut.ulCaputureCntErr > 2000)//1000
  237. {
  238. tmp_uwFrequencyPu = (UWORD)(((SQWORD)72000000 << 12) / (((SQWORD)cadence_stFreGetOut.ulCaputureCntErr + cadence_stFreGetOut.ulTimer2CntErr) * cadence_stFreGetCof.uwNumbersPulses * FBASE));
  239. cadence_stFreGetOut.uwCntErrLast = cadence_stFreGetOut.uwCaputureOverflowCnt;
  240. cadence_stFreGetOut.uwFrequencyLastPu = cadence_stFreGetOut.uwFrequencyPu;
  241. cadence_stFreGetOut.uwFrequencyPu = tmp_uwFrequencyPu;
  242. cadence_stFreGetOut.ulTimer2CntErr = 0;
  243. }
  244. else
  245. {
  246. cadence_stFreGetOut.ulTimer2CntErr += ulCaputureCntErr;
  247. }
  248. // cadence_stFreGetOut.uwCaputure1Cnt = cadence_stFreGetOut.uwCaputure2Cnt;
  249. cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
  250. cadence_stFreGetOut.uwCaputureNumCnt = 1;
  251. }
  252. }
  253. if (cadence_stFreGetOut.cadence_dir == CADENCE_DIR_BACKWARD) // 100ms
  254. {
  255. cadence_stFreGetOut.cadence_fsm = CADENCE_BACKWOR;
  256. }
  257. if(cp_stFlg.RunModelSelect == CadAssist)
  258. {
  259. if(cadence_stFreGetCof.uwTorque_NumbersPulses <= 12)
  260. {
  261. Cad_startdeccnt=6;
  262. }
  263. else
  264. {
  265. Cad_startdeccnt=10;
  266. }
  267. if(cadence_stFreGetOut.uwForwardCnt <= Cad_startdeccnt)
  268. {
  269. tmp_ulStopTime = ((ULONG)(Cad_startdeccnt+2 - cadence_stFreGetOut.uwForwardCnt)*cadence_stFreGetCof.uwHfMaxTimeCnt>>3)+(cadence_stFreGetCof.uwHfMaxTimeCnt>>3);
  270. }
  271. else
  272. {
  273. tmp_ulStopTime = (cadence_stFreGetCof.uwHfMaxTimeCnt>>2)+(cadence_stFreGetCof.uwHfMaxTimeCnt>>3);
  274. }
  275. }
  276. else
  277. {
  278. if(cadence_stFreGetOut.uwForwardCnt <= 16)
  279. {
  280. tmp_ulStopTime = ((ULONG)(32L - cadence_stFreGetOut.uwForwardCnt)*cadence_stFreGetCof.uwHfMaxTimeCnt>>4);
  281. if(tmp_ulStopTime>cadence_stFreGetCof.uwHfMaxTimeCnt)
  282. tmp_ulStopTime=cadence_stFreGetCof.uwHfMaxTimeCnt;
  283. }
  284. else
  285. {
  286. tmp_ulStopTime = cadence_stFreGetCof.uwHfMaxTimeCnt;//>>1;
  287. }
  288. }
  289. tmp_ulBikeSpd = (bikespeed_stFreGetOut.uwLPFFrequencyPu>>6);
  290. if((tmp_ulBikeSpd) > 12) // 1hz
  291. {
  292. if(tmp_ulBikeSpd > 42) //3hz
  293. {
  294. tmp_ulBikeSpd = 30L;
  295. }
  296. else
  297. {
  298. tmp_ulBikeSpd = (tmp_ulBikeSpd - 12L);
  299. }
  300. }
  301. else
  302. {
  303. tmp_ulBikeSpd = 0;
  304. }
  305. tmp_ulBikeSpd = tmp_ulBikeSpd * ((1L<<19)/(30L)); //Q20
  306. #if(INTELLIGENCADGEAR_EN==0)
  307. tmp_ulStopTime = ((UQWORD)tmp_ulStopTime * ((1L<<20) - (tmp_ulBikeSpd)))>>20;
  308. #endif
  309. test_stoptime1 = tmp_ulStopTime;
  310. if (cadence_stFreGetOut.uwCaputureOverflowCnt >= tmp_ulStopTime) // 150ms--600ms
  311. {
  312. cadence_stFreGetOut.ulTimer2CntErr = 0;
  313. cadence_stFreGetOut.ulCaputureCntErr = 100000;
  314. cadence_stFreGetOut.uwFrequencyPu = 0;
  315. cadence_stFreGetOut.uwCntErrLast = 0;
  316. cadence_stFreGetOut.uwFrequencyLastPu = 0;
  317. cadence_stFreGetOut.uwLPFFrequencyPu = 0;
  318. cadence_stFreGetOut.blCadenceCalStartState = FALSE;
  319. cadence_stFreGetOut.blCadenceSensorErrorFlg = FALSE;
  320. cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
  321. cadence_stFreGetOut.uwCaputureNumCnt = 0;
  322. cadence_stFreGetOut.uwCaputure2Cnt = 0;
  323. cadence_stFreGetOut.uwCaputure1Cnt = 0;
  324. cadence_stFreGetOut.cadence_dir = CADENCE_DIR_IDLE;
  325. cadence_stFreGetOut.cadence_fsm = CADENCE_IDLE;
  326. cadence_stFreGetOut.uwFreqPercent = 0;
  327. cadence_stFreGetOut.uwForwardCnt = 0;
  328. }
  329. if (cadence_stFreGetOut.uwLPFFrequencyPu > cadence_stFreGetCof.uwMaxCadenceFre)
  330. {
  331. cadence_stFreGetOut.ulTimer2CntErr = 0;
  332. cadence_stFreGetOut.uwFrequencyPu = 0;
  333. cadence_stFreGetOut.ulCaputureCntErr = 100000;
  334. cadence_stFreGetOut.uwCntErrLast = 0;
  335. cadence_stFreGetOut.uwFrequencyLastPu = 0;
  336. cadence_stFreGetOut.uwLPFFrequencyPu = 0;
  337. cadence_stFreGetOut.blCadenceCalStartState = FALSE;
  338. cadence_stFreGetOut.blCadenceSensorErrorFlg = TRUE;
  339. cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
  340. cadence_stFreGetOut.uwCaputureNumCnt = 0;
  341. cadence_stFreGetOut.uwCaputure2Cnt = 0;
  342. cadence_stFreGetOut.uwCaputure1Cnt = 0;
  343. cadence_stFreGetOut.cadence_dir = CADENCE_DIR_ERROR;
  344. cadence_stFreGetOut.cadence_fsm = CADENCE_ERROR;
  345. cadence_stFreGetOut.uwFreqPercent = 0;
  346. cadence_stFreGetOut.uwForwardCnt = 0;
  347. cp_stHistoryPara.uwCadSensorAlamTimes++;
  348. }
  349. }
  350. /***************************************************************
  351. Function: cadence_voFreGet;
  352. Description: cadence frequency get
  353. Call by: functions in main loop;
  354. Input Variables: N/A
  355. Output/Return Variables: N/A
  356. Subroutine Call: N/A;
  357. Reference: N/A
  358. ****************************************************************/
  359. static void cadence_voCadenceBackword(UWORD source)
  360. {
  361. // if (source == 1)
  362. // {
  363. // cadence_stFreGetOut.uwCaputureOverflowCnt++;
  364. // }
  365. cadence_stFreGetOut.ulTimer2CntErr = 0;
  366. cadence_stFreGetOut.uwFrequencyPu = 0;
  367. cadence_stFreGetOut.ulCaputureCntErr = 100000;
  368. cadence_stFreGetOut.uwCntErrLast = 0;
  369. cadence_stFreGetOut.uwFrequencyLastPu = 0;
  370. cadence_stFreGetOut.uwLPFFrequencyPu = 0;
  371. cadence_stFreGetOut.uwFreqPercent = 0;
  372. if (cadence_stFreGetOut.cadence_dir == CADENCE_DIR_FORWARD)
  373. {
  374. cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
  375. cadence_stFreGetOut.uwCaputureNumCnt = 0;
  376. cadence_stFreGetOut.uwCaputure2Cnt = 0;
  377. cadence_stFreGetOut.uwCaputure1Cnt = 0;
  378. cadence_stFreGetOut.uwFreqPercent = 0;
  379. cadence_stFreGetOut.cadence_fsm = CADENCE_HFreWork;
  380. }
  381. // if (cadence_stFreGetOut.uwCaputureOverflowCnt >= cadence_stFreGetCof.uwHfMaxTimeCnt) // 100ms
  382. // {
  383. // cadence_stFreGetOut.uwFrequencyPu = 0;
  384. // cadence_stFreGetOut.uwCntErrLast = 0;
  385. // cadence_stFreGetOut.uwFrequencyLastPu = 0;
  386. // cadence_stFreGetOut.uwLPFFrequencyPu = 0;
  387. // cadence_stFreGetOut.blCadenceCalStartState = FALSE;
  388. // cadence_stFreGetOut.blCadenceSensorErrorFlg = FALSE;
  389. // cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
  390. // cadence_stFreGetOut.uwCaputureNumCnt = 0;
  391. // cadence_stFreGetOut.uwCaputure2Cnt = 0;
  392. // cadence_stFreGetOut.uwCaputure1Cnt = 0;
  393. // cadence_stFreGetOut.cadence_dir = CADENCE_DIR_IDLE;
  394. // cadence_stFreGetOut.cadence_fsm = CADENCE_IDLE;
  395. // cadence_stFreGetOut.uwFreqPercent = 0;
  396. // }
  397. }
  398. /***************************************************************
  399. Function: cadence_voFreGet;
  400. Description: cadence frequency get
  401. Call by: functions in main loop;
  402. Input Variables: N/A
  403. Output/Return Variables: N/A
  404. Subroutine Call: N/A;
  405. Reference: N/A
  406. ****************************************************************/
  407. static void cadence_voCadenceDir(void)
  408. {
  409. /* 踏频方向端口 */
  410. // if(Get_CAD_PORT() == RESET)
  411. // {
  412. // if(Cad_Dir.uwPortSta!=0)
  413. // {
  414. // Cad_Dir.uwPortSta=0;
  415. // if(Cad_Dir.uwPortLowcnt>( Cad_Dir.uwPortHightcnt+Cad_Dir.uwPortHightcnt>>2))
  416. // {
  417. // cadence_stFreGetOut.cadence_dir= CADENCE_DIR_BACKWARD;
  418. // cadence_voCadenceInit();
  419. // cadence_stFreGetOut.cadence_fsm = CADENCE_IDLE;
  420. // }
  421. // }
  422. // if(Cad_Dir.uwPortLowcnt<60000)
  423. // Cad_Dir.uwPortLowcnt++;
  424. // }
  425. // else
  426. // {
  427. // if(Cad_Dir.uwPortSta==0)
  428. // {
  429. // Cad_Dir.uwPortSta=1;
  430. // if(Cad_Dir.uwPortHightcnt>(Cad_Dir.uwPortLowcnt+4))
  431. // {
  432. // cadence_stFreGetOut.cadence_dir = CADENCE_DIR_FORWARD;
  433. // }
  434. // else if(Cad_Dir.uwPortLowcnt>( Cad_Dir.uwPortHightcnt+Cad_Dir.uwPortHightcnt>>2))
  435. // {
  436. // cadence_stFreGetOut.cadence_dir= CADENCE_DIR_BACKWARD;
  437. // cadence_voCadenceInit();
  438. // cadence_stFreGetOut.cadence_fsm = CADENCE_IDLE;
  439. // }
  440. // Cad_Dir.uwPortLowcnt=0;
  441. // Cad_Dir.uwPortHightcnt=0;
  442. // }
  443. // if(Cad_Dir.uwPortHightcnt<60000)
  444. // Cad_Dir.uwPortHightcnt++;
  445. // }
  446. cadence_stFreGetOut.cadence_dir = CADENCE_DIR_FORWARD;
  447. }
  448. /***************************************************************
  449. Function: cadence_voFreGet;
  450. Description: cadence frequency get
  451. Call by: functions in main loop;
  452. Input Variables: N/A
  453. Output/Return Variables: N/A
  454. Subroutine Call: N/A;
  455. Reference: N/A
  456. ****************************************************************/
  457. static void cadence_voCadenceError(UWORD source)
  458. {
  459. if (source == 1)
  460. {
  461. cadence_stFreGetOut.uwCaputureErrorCnt++;
  462. }
  463. if (cadence_stFreGetOut.uwCaputureErrorCnt == cadence_stFreGetCof.uwErrorResetCnt)
  464. {
  465. cadence_voCadenceInit();
  466. cadence_stFreGetOut.cadence_fsm = CADENCE_IDLE;
  467. }
  468. }
  469. /***************************************************************
  470. Function: cadence_voFreGetInit;
  471. Description: cadence frequency get initialization
  472. Call by: functions in main loop;
  473. Input Variables: N/A
  474. Output/Return Variables: N/A
  475. Subroutine Call: N/A;
  476. Reference: N/A
  477. ****************************************************************/
  478. void cadence_voCadenceInit(void)
  479. {
  480. cadence_stFreGetOut.ulTimer2CntErr = 0;
  481. cadence_stFreGetOut.uwFrequencyPu = 0;
  482. cadence_stFreGetOut.ulCaputureCntErr = 100000;
  483. cadence_stFreGetOut.uwCntErrLast = 0;
  484. cadence_stFreGetOut.uwFrequencyLastPu = 0;
  485. cadence_stFreGetOut.uwLPFFrequencyPu = 0;
  486. cadence_stFreGetOut.uwCaputure1Cnt = 0;
  487. cadence_stFreGetOut.uwCaputure2Cnt = 0;
  488. cadence_stFreGetOut.uwCaputureNumCnt = 0;
  489. cadence_stFreGetOut.uwCaputureErrorCnt = 0;
  490. cadence_stFreGetOut.uwCaputureOverflowCnt = 0;
  491. cadence_stFreGetOut.uwForwardCnt = 0;
  492. cadence_stFreGetOut.blCadenceSensorErrorFlg = FALSE;
  493. cadence_stFreGetOut.blCadenceCalStartState = FALSE;
  494. cadence_stFreGetOut.cadence_fsm = CADENCE_IDLE;
  495. cadence_stFreGetOut.cadence_dir = CADENCE_DIR_IDLE;
  496. }
  497. /***************************************************************
  498. Function: cadence_voFreGet;
  499. Description: cadence frequency get
  500. Call by: functions in main loop;
  501. Input Variables: N/A
  502. Output/Return Variables: N/A
  503. Subroutine Call: N/A;
  504. Reference: N/A
  505. ****************************************************************/
  506. void cadence_voCadenceCal(UWORD source)
  507. {
  508. cadence_voCadenceDir();
  509. switch (cadence_stFreGetOut.cadence_fsm)
  510. {
  511. case CADENCE_IDLE:
  512. cadence_voCadenceIdle(source);
  513. break;
  514. case CADENCE_LFreWork:
  515. cadence_voCadenceLowFrequencyWork(source);
  516. break;
  517. case CADENCE_HFreWork:
  518. cadence_voCadenceHighFrequencyWork(source);
  519. break;
  520. case CADENCE_BACKWOR:
  521. cadence_voCadenceBackword(source);
  522. break;
  523. case CADENCE_ERROR:
  524. cadence_voCadenceError(source);
  525. break;
  526. default:
  527. break;
  528. }
  529. }
  530. /*************************************************************************
  531. End of this File (EOF)!
  532. Do not put anything after this part!
  533. *************************************************************************/