CadAssist.c 71 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848
  1. /**
  2. * @file CadAssist.c
  3. * @author xu, haifeng(xuhf58@midea.com)
  4. * @brief
  5. * @version 0.1
  6. * @date 2023-05-10
  7. *
  8. * @copyright Copyright (c) 2023
  9. *
  10. */
  11. #include "CadAssist.h"
  12. #include "bikeinformation.h"
  13. #include "Cadence.h"
  14. #include "FSM_1st.h"
  15. #include "Syspar.h"
  16. #include "flash_master.h"
  17. #include "string.h"
  18. #include "typedefine.h"
  19. #include "user.h"
  20. #include "hwsetup.h"
  21. #include "bikethrottle.h"
  22. #include "bikebrake.h"
  23. #include "AssistCurve.h"
  24. #include "FuncLayerAPI.h"
  25. #include "MosResCalib.h"
  26. #include "usart.h"
  27. /******************************
  28. *
  29. * constant Parameter
  30. *
  31. ******************************/
  32. /******************************
  33. *
  34. * Variable Define and Initial
  35. *
  36. ******************************/
  37. CAD_ASS_FSM_STATUS ass_enCadAssStatus = {CadAssStop};
  38. UWORD ass_uwCadAssVoltSatCnt = 0;
  39. UWORD ass_uwCadAssStartCnt = 0;
  40. CADASS_PID ass_stCadAssSpdCtl = {0};
  41. CADASS_COEF ass_stCadAssCoef = {0};
  42. CADASS_PER_IN ass_stCadAssParaIn = {0};
  43. CADASS_PER_PRO ass_stCadAssParaPro = {0};
  44. CADASS_PER_OUT ass_stCadAssCalOut = {FALSE,FALSE,0,0};
  45. LPF_OUT ass_lpf_SpeedCmd = {0};
  46. GEAR_COEF ass_MaxSpeed;
  47. GEAR_COEF CadAssistSped;
  48. CADPOWER_STRUCT CadSpdPower;
  49. GEAR_CUR_TRUCT GearCur;
  50. /******************************
  51. *
  52. * Function Statement
  53. *
  54. ******************************/
  55. void ass_voSpdPidCoefInit(CADASS_PID *spdpid);
  56. void ass_voSpdPidInit(CADASS_PID *spdpid);
  57. void ass_voSpdPidCtrl(CADASS_PID *spdpid);
  58. void ass_voParameterInit(void);
  59. void ass_voAssistCoefCal(void);
  60. void ass_voAssistCmdDeal(void);
  61. void ass_voParameterInput(void);
  62. void ass_voAssMaxCurCal(void);
  63. void ass_voAssInitVoltageCal(void);
  64. void ass_voAssCurCalFunc(void);
  65. void ass_voAssistFunc(void);
  66. void CadSpedLinitPowerInit(void);
  67. void CadSpeedLimitPower(void);
  68. void GearLimitCurInit(void);
  69. UBYTE SetZeroRunMode=0;
  70. /**
  71. * @brief Cad Assist Module Pid Init
  72. *
  73. * @param void
  74. * @return void
  75. */
  76. extern ASS_PARA_SET ass_ParaSet; /**< For Debug */
  77. void ass_voSpdPidCoefInit(CADASS_PID *spdpid)
  78. {
  79. spdpid->uwPidKp = ASS_PID_KP; /**< Pid Kp Initial */
  80. spdpid->uwACTPidKp=ASS_PID_KP;
  81. spdpid->swPidLimMax = ASS_VOL_STEP_MAX; /**< Pid Limit */
  82. spdpid->swPidVolDec = ASS_VOL_DEC_STEP; /**< Pid Voltage Dec */
  83. }
  84. /**
  85. * @brief Cad Assist Module Speed Control Pid Init
  86. *
  87. * @param void
  88. * @return void
  89. */
  90. void ass_voSpdPidInit(CADASS_PID *spdpid)
  91. {
  92. spdpid->swPidRef = 0;
  93. spdpid->swPidFbk = 0;
  94. spdpid->swIqRef = 0;
  95. spdpid->swIqFbk = 0;
  96. spdpid->swDirection = -1;
  97. spdpid->slPidErr = 0;
  98. spdpid->slPidP = 0;
  99. spdpid->swPidOut = 0;
  100. }
  101. /**
  102. * @brief Cad Assist Module Pid Control
  103. *
  104. * @param void
  105. * @return void
  106. */
  107. SWORD test_value1;
  108. SWORD test_value2;
  109. SWORD test_value3;
  110. SWORD test_value4;
  111. SWORD test_value5;
  112. void ass_voSpdPidCtrl(CADASS_PID *spdpid)
  113. {
  114. SLONG tmp_slSpdErr = 0;
  115. SLONG tmp_slCurErr = 0;
  116. tmp_slSpdErr = (SLONG)spdpid->swPidRef - (SLONG)spdpid->swPidFbk; //Q15 - Q15 = Q15
  117. if(spdpid->swDirection == 1)
  118. {
  119. if(tmp_slSpdErr > 0)
  120. {
  121. if(tmp_slSpdErr > ASS_PID_ERR_MIN)
  122. {
  123. tmp_slSpdErr -= ASS_PID_ERR_MIN;
  124. }
  125. else
  126. {
  127. tmp_slSpdErr = 0;
  128. }
  129. spdpid->slPidErr = tmp_slSpdErr;
  130. }
  131. else
  132. {
  133. spdpid->slPidErr = (tmp_slSpdErr<<1);
  134. }
  135. }
  136. else if(spdpid->swDirection == -1)
  137. {
  138. if(tmp_slSpdErr > 0)
  139. {
  140. spdpid->slPidErr = (tmp_slSpdErr<<1);
  141. }
  142. else
  143. {
  144. if(tmp_slSpdErr < -ASS_PID_ERR_MIN)
  145. {
  146. tmp_slSpdErr += ASS_PID_ERR_MIN;
  147. }
  148. else
  149. {
  150. tmp_slSpdErr = 0;
  151. }
  152. spdpid->slPidErr = tmp_slSpdErr;
  153. }
  154. }
  155. else
  156. {
  157. }
  158. // spdpid->slPidP = (SLONG)spdpid->uwPidKp * spdpid->slPidErr >> 15; //Q8 * Q15 / Q15 = Q8
  159. spdpid->slPidP = (SLONG)spdpid->uwACTPidKp * spdpid->slPidErr >> 15; //Q8 * Q15 / Q15 = Q8
  160. if(spdpid->slPidP > (SLONG)spdpid->swPidLimMax) //Q8
  161. {
  162. spdpid->slPidP = (SLONG)spdpid->swPidLimMax;
  163. }
  164. else if(spdpid->slPidP < -((SLONG)spdpid->swPidLimMax)) //Q8
  165. {
  166. spdpid->slPidP = -((SLONG)spdpid->swPidLimMax);
  167. }
  168. else
  169. {
  170. }
  171. tmp_slCurErr = (SLONG)spdpid->swIqRef - (SLONG)spdpid->swIqFbk; //Q14
  172. if(spdpid->swDirection == 1)
  173. {
  174. if(tmp_slCurErr < ASS_PID_IERR_MIN)
  175. {
  176. if(spdpid->swIqRef < (ASS_PID_IERR_MIN<<1))
  177. {
  178. spdpid->swPidOut = 0;
  179. }
  180. else
  181. {
  182. spdpid->swPidOut = -spdpid->swPidVolDec;
  183. }
  184. }
  185. else
  186. {
  187. spdpid->swPidOut = spdpid->slPidP;
  188. }
  189. if((spdpid->swIqFbk < 0) && (spdpid->slPidP < 0))
  190. {
  191. spdpid->swPidOut = 0;
  192. }
  193. }
  194. else if(spdpid->swDirection == -1)
  195. {
  196. if(tmp_slCurErr > -ASS_PID_IERR_MIN)
  197. {
  198. if(spdpid->swIqRef > (-ASS_PID_IERR_MIN<<1))
  199. {
  200. spdpid->swPidOut = 0;
  201. }
  202. else
  203. {
  204. spdpid->swPidOut = spdpid->swPidVolDec;
  205. }
  206. }
  207. else
  208. {
  209. spdpid->swPidOut = spdpid->slPidP;
  210. }
  211. if((spdpid->swIqFbk > 0) && (spdpid->slPidP > 0))
  212. {
  213. spdpid->swPidOut = 0;
  214. }
  215. }
  216. else
  217. {
  218. //Parameter Err
  219. spdpid->swPidOut = 0;
  220. }
  221. }
  222. /**
  223. * @brief Cad Assist Module Para Init
  224. *
  225. * @param void
  226. * @return void
  227. */
  228. void ass_voParameterInit(void)
  229. {
  230. /** Local variable */
  231. UWORD tmp_uwCntValue = 0;
  232. /** Speed Control Pid Parameter Initial */
  233. ass_voSpdPidCoefInit(&ass_stCadAssSpdCtl);
  234. ass_voSpdPidInit(&ass_stCadAssSpdCtl);
  235. ass_enCadAssStatus = CadAssStop;
  236. ass_uwCadAssVoltSatCnt = 0;
  237. /** Module Coefficient Initial */
  238. ass_stCadAssCoef.uwWheelCircumferenceCm = ASS_BIKE_WHEEL_DIAMETER;
  239. ass_stCadAssCoef.uwMechRationMotor = (UWORD)(((ULONG)ASS_BIKE_MECH_RATION*1024)/1000);
  240. ass_stCadAssCoef.uwAssistMaxBikeSpeed = ASS_SPD_LIMIT + 8;
  241. ass_stCadAssCoef.uwThrottleMaxBikeSpeed = ASS_THROTTLE_SPD_LIMIT + 8;
  242. ass_stCadAssCoef.uwCartMaxBikeSpeed = ASS_CART_SPEED + 2;
  243. ass_stCadAssCoef.uwMaxCadRpm = ASS_CAD_MAX_RPM;
  244. ass_stCadAssCoef.uwCadencePulses = TORQUE_NUMBERS_PULSES;//CADENCE_NUMBERS_PULSES;
  245. ass_stCadAssCoef.uwMotorPoles = M_POLE_PAIRS;
  246. ass_stCadAssCoef.uwCofCurMaxPu = (UWORD)(((ULONG)(M_IS_PEAK_MAX_AP) << 14)/IBASE);
  247. ass_stCadAssCoef.uwFluxPu = ((ULONG)M_FLUX_WB << 12) / ((ULONG)VBASE * 1000000 / ((ULONG) 2 * 31416 * FBASE / 1000));
  248. ass_stCadAssCoef.swKmhToMSpdPu = 889L*(SLONG)ass_stCadAssCoef.uwMotorPoles*(SLONG)ass_stCadAssCoef.uwMechRationMotor/((SLONG)ass_stCadAssCoef.uwWheelCircumferenceCm * (SLONG)FBASE);
  249. ass_stCadAssCoef.slBSpdPuToMSpdPu = ((SLONG)ass_stCadAssCoef.uwMechRationMotor * ass_stCadAssCoef.uwMotorPoles);
  250. ass_stCadAssCoef.swMSpdpuLimit = (SWORD)((SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)(ass_stCadAssCoef.uwAssistMaxBikeSpeed + ASS_SPD_LIMIT_ERR) >> 4);
  251. ass_stCadAssCoef.swAssistSectionComp = _IQ14(1.0/3.0);
  252. /** Module Input Parameter Initial */
  253. ass_stCadAssParaIn.swFlxIqLimitPu = ass_stCadAssCoef.uwCofCurMaxPu;
  254. ass_stCadAssParaIn.swPwrIqLimitPu = ass_stCadAssCoef.uwCofCurMaxPu;
  255. ass_stCadAssParaIn.uwBmsIqLimitPu = ass_stCadAssCoef.uwCofCurMaxPu;
  256. ass_stCadAssParaIn.swDirection = -1;
  257. ass_stCadAssParaIn.uwGearSt = 0;
  258. ass_stCadAssParaIn.uwCadancePer = 0;
  259. ass_stCadAssParaIn.uwCadanceFwCnt = 0;
  260. ass_stCadAssParaIn.uwBikespeedPu = 0;
  261. ass_stCadAssParaIn.swSpdFbkPu = 0;
  262. ass_stCadAssParaIn.swIqRefpu = 0;
  263. ass_stCadAssParaIn.swIqFbkpu = 0;
  264. ass_stCadAssParaIn.swUqOutputpu = 0;
  265. ass_stCadAssParaIn.uwThrottlePercent = 0;
  266. /** Module Process Parameter Initial */
  267. ass_stCadAssParaPro.uw1msCnt = 0;
  268. ass_stCadAssParaPro.uw10msCnt = 0;
  269. ass_stCadAssParaPro.uwAssitMode = 0;
  270. ass_stCadAssParaPro.uwAssitModeLast = 0;
  271. ass_stCadAssParaPro.swAssistSpdCmd = 0;
  272. ass_stCadAssParaPro.swCurrentMaxPu = (SWORD)ass_stCadAssCoef.uwCofCurMaxPu;
  273. ass_stCadAssParaPro.swUqLimitInitPu = 0;
  274. ass_stCadAssParaPro.swVoltageStep = 0;
  275. ass_stCadAssParaPro.slVoltageSum = 0;
  276. ass_stCadAssParaPro.swBikeSpd2MotSpdPu = 0;
  277. for(tmp_uwCntValue=0;tmp_uwCntValue<10;tmp_uwCntValue++)
  278. {
  279. ass_stCadAssParaPro.swSpdFbkPuRec[tmp_uwCntValue] = 0;
  280. }
  281. ass_stCadAssParaPro.swSpdFbkPuAcc = 0;
  282. ass_stCadAssParaPro.swTargetAssCurPu = 0;
  283. ass_stCadAssParaPro.swTargetAssCurAcc = ASS_CUR_STEP;
  284. mth_voLPFilterCoef((ASS_CMD_SPEED_LPF_TIME*333L),1000L,&ass_lpf_SpeedCmd.uwKx);
  285. /** Module Output Parameter Initial */
  286. ass_stCadAssCalOut.blAssistflag = FALSE;
  287. ass_stCadAssCalOut.blPreStopFlag = FALSE;
  288. ass_stCadAssCalOut.swAssCurrentPu = 0;
  289. ass_stCadAssCalOut.swVoltLimitPu = 0;
  290. GearLimitCurInit();
  291. }
  292. /**
  293. * @brief Cad Assist Module Coefficient Get and Calculate Function
  294. *
  295. * @param void
  296. * @return void
  297. */
  298. void ass_voAssistCoefCal(void)
  299. {
  300. /** Local variable */
  301. SLONG tmp_slAssistSpdLimit = 0;
  302. /** Bike and assist parameter config */
  303. ass_stCadAssCoef.uwWheelCircumferenceCm = ass_ParaCong.uwWheelPerimeter + ass_ParaCong.swDeltPerimeter;
  304. ass_stCadAssCoef.uwMechRationMotor = ass_ParaCong.uwMechRationMotor;
  305. ass_stCadAssCoef.uwAssistMaxBikeSpeed = (ass_ParaSet.uwAssistLimitBikeSpdStart<<4) + 8; // 骑行助力限速
  306. ass_stCadAssCoef.uwThrottleMaxBikeSpeed = (ass_ParaCong.uwThrottleMaxSpdKmH<<4) + 8;
  307. ass_stCadAssCoef.uwCartMaxBikeSpeed = (ass_ParaCong.uwCartSpdKmH<<4) + 2;
  308. if(cp_stFlg.RunModelSelect == TorqAssist)
  309. {
  310. cadence_stFreGetCof.uwNumbersPulses = cadence_stFreGetCof.uwTorque_NumbersPulses;
  311. }
  312. else
  313. {
  314. cadence_stFreGetCof.uwNumbersPulses=cadence_stFreGetCof.uwCad_NumbersPulses;
  315. }
  316. ass_stCadAssCoef.uwCadencePulses = cadence_stFreGetCof.uwNumbersPulses;
  317. ass_stCadAssCoef.uwMotorPoles = cp_stMotorPara.swMotrPolePairs;
  318. ass_stCadAssCoef.uwCofCurMaxPu = (UWORD)(((ULONG)(cp_stMotorPara.swIpeakMaxA) << 14)/IBASE);
  319. ass_stCadAssCoef.uwFluxPu = ((ULONG)cp_stMotorPara.swFluxWb << 12) / cof_uwFluxbWb;
  320. /** Transform from bikespeed Km/h to motor speed pu Parameter calculate */
  321. ass_stCadAssCoef.swKmhToMSpdPu = (SWORD)(889L*(SLONG)ass_stCadAssCoef.uwMotorPoles*(SLONG)ass_stCadAssCoef.uwMechRationMotor/((SLONG)ass_stCadAssCoef.uwWheelCircumferenceCm * (SLONG)FBASE));
  322. /** Transform from bikespeed pu to motor speed pu Parameter calculate */
  323. ass_stCadAssCoef.slBSpdPuToMSpdPu = ((SLONG)ass_stCadAssCoef.uwMechRationMotor * ass_stCadAssCoef.uwMotorPoles);
  324. /** Motor Max Speed calculate according to bike speed limit */
  325. tmp_slAssistSpdLimit = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG) ass_stCadAssCoef.uwThrottleMaxBikeSpeed + ASS_SPD_LIMIT_ERR) >> 4;
  326. ass_stCadAssCoef.swThrottleMaxspd= (SWORD)tmp_slAssistSpdLimit;
  327. tmp_slAssistSpdLimit = (SWORD)((SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed + ASS_SPD_LIMIT_ERR) >> 4);
  328. ass_stCadAssCoef.swAssistMaxSpd=(SWORD)tmp_slAssistSpdLimit;
  329. #if(THROTTLEGEAR !=0)
  330. ass_MaxSpeed.uwGearOne =(UWORD)( ass_stCadAssCoef.uwThrottleMaxBikeSpeed *ASS_ONE_SPEED_PERCENT/100 );//
  331. ass_MaxSpeed.uwGearTwo =(UWORD)( ass_stCadAssCoef.uwThrottleMaxBikeSpeed *ASS_TWO_SPEED_PERCENT/100 );
  332. ass_MaxSpeed.uwGearThree=(UWORD)( ass_stCadAssCoef.uwThrottleMaxBikeSpeed *ASS_THREE_SPEED_PERCENT/100 );
  333. ass_MaxSpeed.uwGearFour =(UWORD)( ass_stCadAssCoef.uwThrottleMaxBikeSpeed *ASS_FOUR_SPEED_PERCENT/100 );
  334. ass_MaxSpeed.uwGearFive =(UWORD)( ass_stCadAssCoef.uwThrottleMaxBikeSpeed *ASS_FIVE_SPEED_PERCENT/100 );//
  335. #endif
  336. #if(CADASSISTGEAR !=0)
  337. CadAssistSped.uwGearOne=(UWORD)( ass_stCadAssCoef.uwThrottleMaxBikeSpeed *CAD_ONE_SPEED_PERCENT/100 );//
  338. CadAssistSped.uwGearTwo=(UWORD)( ass_stCadAssCoef.uwThrottleMaxBikeSpeed *CAD_TWO_SPEED_PERCENT/100 );
  339. CadAssistSped.uwGearThree=(UWORD)( ass_stCadAssCoef.uwThrottleMaxBikeSpeed *CAD_THREE_SPEED_PERCENT/100 );
  340. CadAssistSped.uwGearFour =(UWORD)( ass_stCadAssCoef.uwThrottleMaxBikeSpeed *CAD_FOUR_SPEED_PERCENT/100 );
  341. CadAssistSped.uwGearFive =(UWORD)( ass_stCadAssCoef.uwThrottleMaxBikeSpeed *CAD_FIVE_SPEED_PERCENT/100 );//
  342. #endif
  343. if(ass_ParaSet.uwAssistLimitBikeSpdStart >= 25)
  344. {
  345. ass_stCadAssCoef.swAssistSectionComp = ((25L<<14)/(3L*ass_ParaSet.uwAssistLimitBikeSpdStart));
  346. }
  347. else
  348. {
  349. ass_stCadAssCoef.swAssistSectionComp = _IQ14(1.0/3.0);
  350. }
  351. #if(POWER_INTELLIGENCADGEAR_EN!=0)
  352. CadSpedLinitPowerInit();
  353. #endif
  354. }
  355. /**
  356. * @brief Cad Assist Module Parameter input
  357. *
  358. * @param void
  359. * @return void
  360. */
  361. void ass_voParameterInput(void)
  362. {
  363. /** Motor Max Speed calculate according to bike speed limit */
  364. if( ass_stCadAssParaPro.uwAssitMode == 7)
  365. {
  366. ass_stCadAssCoef.swMSpdpuLimit =ass_stCadAssCoef.swThrottleMaxspd;
  367. }
  368. else
  369. {
  370. ass_stCadAssCoef.swMSpdpuLimit =ass_stCadAssCoef.swAssistMaxSpd;
  371. }
  372. /** Flux current limit input */
  373. ass_stCadAssParaIn.swFlxIqLimitPu = abs(flx_stCtrlOut.swIqLimPu);
  374. /** Power limit current limit input */
  375. ass_stCadAssParaIn.swPwrIqLimitPu = abs(pwr_stPwrLimOut2.swIqLimPu);
  376. /** BMS current limit input */
  377. ass_stCadAssParaIn.uwBmsIqLimitPu = ass_CurLimitCalBMSOut.uwIqLimitAbs;
  378. // (ass_CurLimitCalBMSOut.uwIdcLimIqAbs < ass_CurLimitCalBMSOut.uwIqLimitAbs) ? \
  379. // ass_CurLimitCalBMSOut.uwIdcLimIqAbs : ass_CurLimitCalBMSOut.uwIqLimitAbs;
  380. /** Assist motor run max voltage limit */
  381. ass_stCadAssParaIn.swAssMaxVolLimpu = scm_swVsDcpLimPu;
  382. /** Assist motor run direction input */
  383. if(cp_stFlg.RotateDirectionSelect == ForwardRotate)
  384. {
  385. ass_stCadAssParaIn.swDirection = 1;
  386. }
  387. else
  388. {
  389. ass_stCadAssParaIn.swDirection = -1;
  390. }
  391. /** Assist gear input */
  392. ass_stCadAssParaIn.uwGearSt = cp_stBikeRunInfoPara.uwBikeGear;
  393. /** Cadence frequency percentage input */
  394. ass_stCadAssParaIn.uwCadancePer = cadence_stFreGetOut.uwFreqPercent;
  395. /** Cadence forword pulse counter input */
  396. ass_stCadAssParaIn.uwCadanceFwCnt = cadence_stFreGetOut.uwForwardCnt;
  397. /** Bike speed frequency pu input */
  398. ass_stCadAssParaIn.uwBikespeedPu = bikespeed_stFreGetOut.uwLPFFrequencyPu;
  399. /** Motor speed frequency pu input */
  400. ass_stCadAssParaIn.swSpdFbkPu = scm_stSpdFbkLpf.slY.sw.hi;
  401. /** q axis current reference low pass filter input */
  402. ass_stCadAssParaIn.swIqRefpu = scm_stIqRefforDesat.slY.sw.hi;
  403. /** q axis current feedback low pass filter input */
  404. ass_stCadAssParaIn.swIqFbkpu = scm_stIqFbkforDesat.slY.sw.hi;
  405. /** q axis voltage input */
  406. ass_stCadAssParaIn.swUqOutputpu = scm_swUqRefPu;
  407. /** Throttle percentage input */
  408. ass_stCadAssParaIn.uwThrottlePercent = bikethrottle_stBikeThrottleOut.uwThrottlePercent;
  409. }
  410. /**
  411. * @brief Cad Assist Module Cadence Cmd Deal
  412. *
  413. * @param void
  414. * @return SWORD
  415. */
  416. #if(INTELLIGENCADGEAR_EN!=0)
  417. static SWORD ass_voCadCmdDeal(void)
  418. {
  419. SLONG tmp_slCadCmd = 0;
  420. UWORD tmp_uwCadMaxpu = 0;
  421. //tmp_uwCadMaxpu = ((ULONG)ass_stCadAssCoef.uwMaxCadRpm * 3495 >> 20) << 14;// 3495>>20 = 1/(5*60)
  422. /*小飞最高车速对应踏频(rpm)= 车速*1000/60/(周长/100)/前飞齿数*后飞齿数 车速单位:km/h 周长单位:cm*/
  423. tmp_uwCadMaxpu = (UWORD)(((ULONG)ass_stCadAssCoef.uwMaxCadRpm * 3495) >> 6); //Q14 BASE 5HZ
  424. if(ass_stCadAssParaIn.uwCadancePer <= 0)
  425. {
  426. tmp_slCadCmd = 0;
  427. }
  428. else if(ass_stCadAssParaIn.uwCadancePer >= tmp_uwCadMaxpu)
  429. {
  430. tmp_slCadCmd = _IQ14(0.999);
  431. }
  432. else
  433. {
  434. tmp_slCadCmd = ((ULONG)ass_stCadAssParaIn.uwCadancePer << 14) / tmp_uwCadMaxpu;
  435. if(tmp_slCadCmd <= _IQ14(0.0))
  436. {
  437. tmp_slCadCmd = _IQ14(0.0);
  438. }
  439. else if(tmp_slCadCmd >= _IQ14(0.999))
  440. {
  441. tmp_slCadCmd = _IQ14(0.999);
  442. }
  443. else
  444. {
  445. }
  446. }
  447. return (SWORD)tmp_slCadCmd;
  448. }
  449. #endif
  450. /**
  451. * @brief Cad Assist Module Deal with Command Function
  452. *
  453. * @param void
  454. * @return void
  455. */
  456. #if(POWER_INTELLIGENCADGEAR_EN!=0)
  457. void ass_voAssistCmdDeal(void)
  458. {
  459. /** Local variable */
  460. SLONG tmp_slAssistSpdCmd = 0;
  461. #if(INTELLIGENCADGEAR_EN!=0)
  462. SLONG tmp_slAssistCadSpdCmd = 0;
  463. SLONG tmp_slMaxMotorSpd = 0; //Q15 BASE 1400HZ
  464. SLONG tmp_slAssistSectionComp = 0; //Q14
  465. tmp_slMaxMotorSpd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed >> 4;
  466. #endif
  467. /** Record Last assist mode */
  468. ass_stCadAssParaPro.uwAssitModeLast = ass_stCadAssParaPro.uwAssitMode;
  469. /** Cart Comand */
  470. if(ass_stCadAssParaIn.uwGearSt == 0x22)
  471. {
  472. ass_stCadAssParaPro.uwAssitMode = 6;
  473. /** Q15 * Q4 / Q4 = Q15 */
  474. if(MC_WorkMode == 1)
  475. {
  476. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_stCadAssCoef.uwThrottleMaxBikeSpeed >> 4;
  477. tmp_slAssistSpdCmd= ((SLONG)MC_MotorSPD_rpm_Percent * tmp_slAssistSpdCmd) / 100;
  478. }
  479. else
  480. {
  481. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_stCadAssCoef.uwCartMaxBikeSpeed >> 4;
  482. }
  483. }
  484. else if((ass_stCadAssParaIn.uwGearSt > 0)&&(ass_stCadAssParaIn.uwGearSt <= 5))
  485. {
  486. /** Throttle command */
  487. if(ass_stCadAssParaIn.uwThrottlePercent > 250)
  488. {
  489. ass_stCadAssParaPro.uwAssitMode = 7;
  490. #if(THROTTLEGEAR !=0)
  491. if(ass_stCadAssParaIn.uwGearSt == 1)
  492. {
  493. ass_MaxSpeed.MaxBikeSpeed = ass_MaxSpeed.uwGearOne;
  494. }
  495. else if(ass_stCadAssParaIn.uwGearSt == 2)
  496. {
  497. ass_MaxSpeed.MaxBikeSpeed = ass_MaxSpeed.uwGearTwo;
  498. }
  499. else if(ass_stCadAssParaIn.uwGearSt == 3)
  500. {
  501. ass_MaxSpeed.MaxBikeSpeed = ass_MaxSpeed.uwGearThree;
  502. }
  503. else if(ass_stCadAssParaIn.uwGearSt == 4)
  504. {
  505. ass_MaxSpeed.MaxBikeSpeed = ass_MaxSpeed.uwGearFour;
  506. }
  507. else if((ass_stCadAssParaIn.uwGearSt == 5) )
  508. {
  509. ass_MaxSpeed.MaxBikeSpeed = ass_stCadAssCoef.uwThrottleMaxBikeSpeed ;
  510. }
  511. if(ass_stCadAssParaIn.uwThrottlePercent < 650)
  512. {
  513. /** Q15 * Q4 / Q4 = Q15 */
  514. tmp_slAssistSpdCmd = ((SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((((SLONG)(ass_stCadAssParaIn.uwThrottlePercent - 250)*(SLONG)(ass_MaxSpeed.MaxBikeSpeed - ASS_THROT_SPEED_MIN))/400)+ASS_THROT_SPEED_MIN)) >> 4;
  515. }
  516. else
  517. {
  518. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_MaxSpeed.MaxBikeSpeed>> 4;
  519. }
  520. #else
  521. if(ass_stCadAssParaIn.uwThrottlePercent < 650)
  522. {
  523. /** Q15 * Q4 / Q4 = Q15 */
  524. tmp_slAssistSpdCmd = ((SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((((SLONG)(ass_stCadAssParaIn.uwThrottlePercent - 250)*(SLONG)(ass_stCadAssCoef.uwThrottleMaxBikeSpeed - ASS_THROT_SPEED_MIN))/400)+ASS_THROT_SPEED_MIN)) >> 4;
  525. }
  526. else
  527. {
  528. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_stCadAssCoef.uwThrottleMaxBikeSpeed >> 4;
  529. }
  530. #endif
  531. }
  532. else
  533. {
  534. /** Assist start judge */
  535. if(ass_stCadAssParaIn.uwCadanceFwCnt > (ass_stCadAssCoef.uwCadencePulses >> 3))
  536. {
  537. /** Assist command,gear 1 to 5 */
  538. if(ass_stCadAssParaIn.uwGearSt == 1)
  539. {
  540. ass_stCadAssParaPro.uwAssitMode = ass_stCadAssParaIn.uwGearSt;
  541. /** gear 1, target speed command, Q15 * Q4 / Q4 = Q15 */
  542. #if(INTELLIGENCADGEAR_EN!=0)
  543. tmp_slAssistCadSpdCmd = (SLONG)ass_voCadCmdDeal();
  544. #if(CADASSISTGEAR !=0)
  545. tmp_slAssistSectionComp = _IQ14(1.0 );
  546. if(tmp_slAssistCadSpdCmd < (tmp_slAssistSectionComp * (SLONG)_IQ14(0.48)>>14))
  547. {
  548. tmp_slAssistCadSpdCmd = (tmp_slAssistCadSpdCmd * _IQ14(1.8/4.8) >> 14) + (tmp_slAssistSectionComp * (SLONG)_IQ14(0.3)>>14);
  549. }
  550. else
  551. {
  552. tmp_slAssistCadSpdCmd = (tmp_slAssistSectionComp * (SLONG)_IQ14(0.48)>>14);
  553. }
  554. tmp_slAssistSpdCmd = tmp_slAssistCadSpdCmd * tmp_slMaxMotorSpd >> 14;
  555. #else
  556. // if(tmp_slAssistCadSpdCmd < _IQ14(1.0))
  557. // {
  558. // tmp_slAssistCadSpdCmd = (tmp_slAssistCadSpdCmd * _IQ14(8.0/10.0) >> 14) + _IQ14(0.2);
  559. // }
  560. // else
  561. // {
  562. // tmp_slAssistCadSpdCmd = _IQ14(1.0);
  563. // }
  564. //
  565. // tmp_slAssistSpdCmd = tmp_slAssistCadSpdCmd * tmp_slMaxMotorSpd >> 14;
  566. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)ASS_GEAR1_SPEED + 4) >> 4;
  567. #endif
  568. #else
  569. #if(CADASSISTGEAR !=0)
  570. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)CadAssistSped.uwGearOne ) >> 4;
  571. #else
  572. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)ASS_GEAR1_SPEED + 4) >> 4;
  573. #endif
  574. #endif
  575. }
  576. else if(ass_stCadAssParaIn.uwGearSt == 2)
  577. {
  578. ass_stCadAssParaPro.uwAssitMode = ass_stCadAssParaIn.uwGearSt;
  579. /** gear 2, target speed command, Q15 * Q4 / Q4 = Q15 */
  580. #if(INTELLIGENCADGEAR_EN!=0)
  581. tmp_slAssistCadSpdCmd = (SLONG)ass_voCadCmdDeal();
  582. #if(CADASSISTGEAR !=0)
  583. tmp_slAssistSectionComp = _IQ14(1.0 );
  584. if(tmp_slAssistCadSpdCmd < (tmp_slAssistSectionComp * (SLONG)_IQ14(0.6)>>14))
  585. {
  586. tmp_slAssistCadSpdCmd = (tmp_slAssistCadSpdCmd * _IQ14(3.0/6.0) >> 14) + (tmp_slAssistSectionComp * (SLONG)_IQ14(0.3)>>14);
  587. }
  588. else
  589. {
  590. tmp_slAssistCadSpdCmd = (tmp_slAssistSectionComp * (SLONG)_IQ14(0.6)>>14);
  591. }
  592. tmp_slAssistSpdCmd = tmp_slAssistCadSpdCmd * tmp_slMaxMotorSpd >> 14;
  593. #else
  594. // if(tmp_slAssistCadSpdCmd < _IQ14(1.0))
  595. // {
  596. // tmp_slAssistCadSpdCmd = (tmp_slAssistCadSpdCmd * _IQ14(8.0/10.0) >> 14) + _IQ14(0.2);
  597. // }
  598. // else
  599. // {
  600. // tmp_slAssistCadSpdCmd = _IQ14(1.0);
  601. // }
  602. //
  603. // tmp_slAssistSpdCmd = tmp_slAssistCadSpdCmd * tmp_slMaxMotorSpd >> 14;
  604. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - ASS_GEAR1_SPEED)>>2) + ASS_GEAR1_SPEED) >> 4;
  605. #endif
  606. #else
  607. #if(CADASSISTGEAR !=0)
  608. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)CadAssistSped.uwGearTwo ) >> 4;
  609. #else
  610. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - ASS_GEAR1_SPEED)>>2) + ASS_GEAR1_SPEED) >> 4;
  611. #endif
  612. #endif
  613. }
  614. else if(ass_stCadAssParaIn.uwGearSt == 3)
  615. {
  616. ass_stCadAssParaPro.uwAssitMode = ass_stCadAssParaIn.uwGearSt;
  617. /** gear 3, target speed command, Q15 * Q4 / Q4 = Q15 */
  618. #if(INTELLIGENCADGEAR_EN!=0)
  619. tmp_slAssistCadSpdCmd = (SLONG)ass_voCadCmdDeal();
  620. #if(CADASSISTGEAR !=0)
  621. tmp_slAssistSectionComp = _IQ14(1.0 );
  622. if(tmp_slAssistCadSpdCmd < (tmp_slAssistSectionComp * (SLONG)_IQ14(0.73) >> 14))
  623. {
  624. tmp_slAssistCadSpdCmd = (tmp_slAssistCadSpdCmd * _IQ14(4.0/7.3) >> 14) + (tmp_slAssistSectionComp * (SLONG)_IQ14(0.33)>>14);
  625. }
  626. else
  627. {
  628. tmp_slAssistCadSpdCmd = (tmp_slAssistSectionComp * (SLONG)_IQ14(0.73)>>14);
  629. }
  630. tmp_slAssistSpdCmd = tmp_slAssistCadSpdCmd * tmp_slMaxMotorSpd >> 14;
  631. #else
  632. // if(tmp_slAssistCadSpdCmd < _IQ14(1.0))
  633. // {
  634. // tmp_slAssistCadSpdCmd = (tmp_slAssistCadSpdCmd * _IQ14(8.0/10.0) >> 14) + _IQ14(0.2);
  635. // }
  636. // else
  637. // {
  638. // tmp_slAssistCadSpdCmd = _IQ14(1.0);
  639. // }
  640. //
  641. // tmp_slAssistSpdCmd = tmp_slAssistCadSpdCmd * tmp_slMaxMotorSpd >> 14;
  642. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - ASS_GEAR1_SPEED)>>1) + ASS_GEAR1_SPEED) >> 4;
  643. #endif
  644. #else
  645. #if(CADASSISTGEAR !=0)
  646. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)CadAssistSped.uwGearThree ) >> 4;
  647. #else
  648. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - ASS_GEAR1_SPEED)>>1) + ASS_GEAR1_SPEED) >> 4;
  649. #endif
  650. #endif
  651. }
  652. else if(ass_stCadAssParaIn.uwGearSt == 4)
  653. {
  654. ass_stCadAssParaPro.uwAssitMode = ass_stCadAssParaIn.uwGearSt;
  655. /** gear 4, target speed command, Q15 * Q4 / Q4 = Q15 */
  656. #if(INTELLIGENCADGEAR_EN!=0)
  657. tmp_slAssistCadSpdCmd = (SLONG)ass_voCadCmdDeal();
  658. #if(CADASSISTGEAR !=0)
  659. tmp_slAssistSectionComp = _IQ14(1.0 );
  660. if(tmp_slAssistCadSpdCmd < (tmp_slAssistSectionComp * (SLONG)_IQ14(0.84) >> 14))
  661. {
  662. tmp_slAssistCadSpdCmd = (tmp_slAssistCadSpdCmd * _IQ14(5.10/8.4) >> 14) + (tmp_slAssistSectionComp * (SLONG)_IQ14(0.33)>>14);
  663. }
  664. else
  665. {
  666. tmp_slAssistCadSpdCmd = (tmp_slAssistSectionComp * (SLONG)_IQ14(0.84)>>14);
  667. }
  668. tmp_slAssistSpdCmd = tmp_slAssistCadSpdCmd * tmp_slMaxMotorSpd >> 14;
  669. #else
  670. // if(tmp_slAssistCadSpdCmd < _IQ14(1.0))
  671. // {
  672. // tmp_slAssistCadSpdCmd = (tmp_slAssistCadSpdCmd * _IQ14(6.0/10.0) >> 14) + _IQ14(0.4);
  673. // }
  674. // else
  675. // {
  676. // tmp_slAssistCadSpdCmd = _IQ14(1.0);
  677. // }
  678. //
  679. // tmp_slAssistSpdCmd = tmp_slAssistCadSpdCmd * tmp_slMaxMotorSpd >> 14;
  680. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed >> 4;
  681. #endif
  682. #else
  683. //tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - (((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - ASS_GEAR1_SPEED)>>2)) >> 4;
  684. #if(CADASSISTGEAR !=0)
  685. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)CadAssistSped.uwGearFour ) >> 4;
  686. #else
  687. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - (((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - ASS_GEAR1_SPEED)>>2)) >> 4;
  688. // tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed >> 4;
  689. #endif
  690. #endif
  691. }
  692. else if(ass_stCadAssParaIn.uwGearSt == 5)
  693. {
  694. ass_stCadAssParaPro.uwAssitMode = ass_stCadAssParaIn.uwGearSt;
  695. /** gear 5, target speed command, Q15 * Q4 / Q4 = Q15 */
  696. #if(INTELLIGENCADGEAR_EN!=0)
  697. tmp_slAssistCadSpdCmd = (SLONG)ass_voCadCmdDeal(); //Q14
  698. #if(CADASSISTGEAR !=0)
  699. if(tmp_slAssistCadSpdCmd < _IQ14(0.9))
  700. {
  701. tmp_slAssistCadSpdCmd = (tmp_slAssistCadSpdCmd * _IQ14(9.0/9.0) >> 14) + _IQ14(0.1);
  702. }
  703. else
  704. {
  705. tmp_slAssistCadSpdCmd = _IQ14(1.0);
  706. }
  707. tmp_slAssistSpdCmd = tmp_slAssistCadSpdCmd * tmp_slMaxMotorSpd >> 14;
  708. #else
  709. if(tmp_slAssistCadSpdCmd < _IQ14(0.9))
  710. {
  711. tmp_slAssistCadSpdCmd = (tmp_slAssistCadSpdCmd * _IQ14(9.0/9.0) >> 14) + _IQ14(0.1);
  712. }
  713. else
  714. {
  715. tmp_slAssistCadSpdCmd = _IQ14(1.0);
  716. }
  717. tmp_slAssistSpdCmd = tmp_slAssistCadSpdCmd * tmp_slMaxMotorSpd >> 14;
  718. #endif
  719. #else
  720. #if(CADASSISTGEAR !=0)
  721. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)CadAssistSped.uwGearFive ) >> 4;
  722. #else
  723. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed >> 4;
  724. #endif
  725. #endif
  726. }
  727. else
  728. {
  729. /** gear err */
  730. ass_stCadAssParaPro.uwAssitMode = 0;
  731. tmp_slAssistSpdCmd = 0; /**< Q15 */
  732. }
  733. }
  734. else
  735. {
  736. /** Assist stop */
  737. ass_stCadAssParaPro.uwAssitMode = 0;
  738. tmp_slAssistSpdCmd = 0; /**< Q15 */
  739. }
  740. }
  741. }
  742. else if(ass_stCadAssParaIn.uwGearSt == 0)
  743. {
  744. /** Gear 0, Assist stop */
  745. ass_stCadAssParaPro.uwAssitMode = 0;
  746. tmp_slAssistSpdCmd = 0; /**< Q15 */
  747. }
  748. else
  749. {
  750. /** gear err */
  751. ass_stCadAssParaPro.uwAssitMode = 0;
  752. tmp_slAssistSpdCmd = 0; /**< Q15 */
  753. }
  754. /** Stop Assist when Bike Brake */
  755. if((BikeBrake_blGetstate() == TRUE) ||(BMS_RunInfo.Status.Status_Bit.Charge!=0))
  756. {
  757. cadence_stFreGetOut.uwForwardCnt = 0;
  758. ass_stCadAssParaIn.uwCadanceFwCnt = 0;
  759. ass_stCadAssParaPro.uwAssitMode = 0;
  760. tmp_slAssistSpdCmd = 0; /**< Q15 */
  761. }
  762. else
  763. {
  764. }
  765. /** Assist target speed limit and err judge */
  766. if(tmp_slAssistSpdCmd < 32767)
  767. {
  768. /** Judge speed sign by direction */
  769. ass_stCadAssParaPro.swAssistSpdCmd = (SWORD)tmp_slAssistSpdCmd*ass_stCadAssParaIn.swDirection;
  770. }
  771. else
  772. {
  773. /** parameter err */
  774. ass_stCadAssParaPro.swAssistSpdCmd = 0;
  775. }
  776. }
  777. #else
  778. void ass_voAssistCmdDeal(void)
  779. {
  780. /** Local variable */
  781. SLONG tmp_slAssistSpdCmd = 0;
  782. #if(INTELLIGENCADGEAR_EN!=0)
  783. SLONG tmp_slAssistCadSpdCmd = 0;
  784. SLONG tmp_slMaxMotorSpd = 0; //Q15 BASE 1400HZ
  785. tmp_slMaxMotorSpd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed >> 4;
  786. #endif
  787. /** Record Last assist mode */
  788. ass_stCadAssParaPro.uwAssitModeLast = ass_stCadAssParaPro.uwAssitMode;
  789. /** Cart Comand */
  790. if(ass_stCadAssParaIn.uwGearSt == 0x22)
  791. {
  792. ass_stCadAssParaPro.uwAssitMode = 6;
  793. /** Q15 * Q4 / Q4 = Q15 */
  794. if(MC_WorkMode == 1)
  795. {
  796. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_stCadAssCoef.uwThrottleMaxBikeSpeed >> 4;
  797. tmp_slAssistSpdCmd= ((SLONG)MC_MotorSPD_rpm_Percent * tmp_slAssistSpdCmd) / 100;
  798. if(MC_MotorSPD_rpm_Percent<=2)
  799. {
  800. tmp_slAssistSpdCmd=0;
  801. ass_stCadAssParaPro.uwAssitMode =0;
  802. }
  803. }
  804. else
  805. {
  806. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_stCadAssCoef.uwCartMaxBikeSpeed >> 4;
  807. }
  808. }
  809. else if((ass_stCadAssParaIn.uwGearSt > 0)&&(ass_stCadAssParaIn.uwGearSt <= 5))
  810. {
  811. /** Throttle command */
  812. if(ass_stCadAssParaIn.uwThrottlePercent > 250)
  813. {
  814. ass_stCadAssParaPro.uwAssitMode = 7;
  815. #if(THROTTLEGEAR !=0)
  816. if(ass_stCadAssParaIn.uwGearSt == 1)
  817. {
  818. ass_MaxSpeed.MaxBikeSpeed = ass_MaxSpeed.uwGearOne;
  819. }
  820. else if(ass_stCadAssParaIn.uwGearSt == 2)
  821. {
  822. ass_MaxSpeed.MaxBikeSpeed = ass_MaxSpeed.uwGearTwo;
  823. }
  824. else if(ass_stCadAssParaIn.uwGearSt == 3)
  825. {
  826. ass_MaxSpeed.MaxBikeSpeed = ass_MaxSpeed.uwGearThree;
  827. }
  828. else if(ass_stCadAssParaIn.uwGearSt == 4)
  829. {
  830. ass_MaxSpeed.MaxBikeSpeed = ass_MaxSpeed.uwGearFour;
  831. }
  832. else if((ass_stCadAssParaIn.uwGearSt == 5) )
  833. {
  834. ass_MaxSpeed.MaxBikeSpeed = ass_stCadAssCoef.uwThrottleMaxBikeSpeed ;
  835. }
  836. if(ass_stCadAssParaIn.uwThrottlePercent < 650)
  837. {
  838. /** Q15 * Q4 / Q4 = Q15 */
  839. tmp_slAssistSpdCmd = ((SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((((SLONG)(ass_stCadAssParaIn.uwThrottlePercent - 250)*(SLONG)(ass_MaxSpeed.MaxBikeSpeed - ASS_THROT_SPEED_MIN))/400)+ASS_THROT_SPEED_MIN)) >> 4;
  840. }
  841. else
  842. {
  843. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_MaxSpeed.MaxBikeSpeed>> 4;
  844. }
  845. #else
  846. if(ass_stCadAssParaIn.uwThrottlePercent < 650) //850
  847. {
  848. /** Q15 * Q4 / Q4 = Q15 */
  849. tmp_slAssistSpdCmd = ((SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((((SLONG)(ass_stCadAssParaIn.uwThrottlePercent - 250)*(SLONG)(ass_stCadAssCoef.uwThrottleMaxBikeSpeed - ASS_THROT_SPEED_MIN))/400)+ASS_THROT_SPEED_MIN)) >> 4;
  850. }
  851. else
  852. {
  853. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_stCadAssCoef.uwThrottleMaxBikeSpeed >> 4;
  854. }
  855. #endif
  856. }
  857. else
  858. {
  859. /** Assist start judge */
  860. if(ass_stCadAssParaIn.uwCadanceFwCnt > (ass_stCadAssCoef.uwCadencePulses >> 3))
  861. {
  862. #if(INTELLIGENCADGEAR_EN!=0)
  863. tmp_slAssistCadSpdCmd = (SLONG)ass_voCadCmdDeal(); //Q14
  864. #endif
  865. /** Assist command,gear 1 to 5 */
  866. if(ass_stCadAssParaIn.uwGearSt == 1)
  867. {
  868. ass_stCadAssParaPro.uwAssitMode = ass_stCadAssParaIn.uwGearSt;
  869. /** gear 1, target speed command, Q15 * Q4 / Q4 = Q15 */
  870. #if(INTELLIGENCADGEAR_EN!=0)
  871. // tmp_slAssistCadSpdCmd = (SLONG)ass_voCadCmdDeal();
  872. #if(CADASSISTGEAR !=0)
  873. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)CadAssistSped.uwGearOne ) >> 4;
  874. #else
  875. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)ASS_GEAR1_SPEED + 4) >> 4;
  876. #endif
  877. #else
  878. #if(CADASSISTGEAR !=0)
  879. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)CadAssistSped.uwGearOne ) >> 4;
  880. #else
  881. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)ASS_GEAR1_SPEED + 4) >> 4;
  882. #endif
  883. #endif
  884. }
  885. else if(ass_stCadAssParaIn.uwGearSt == 2)
  886. {
  887. ass_stCadAssParaPro.uwAssitMode = ass_stCadAssParaIn.uwGearSt;
  888. /** gear 2, target speed command, Q15 * Q4 / Q4 = Q15 */
  889. #if(INTELLIGENCADGEAR_EN!=0)
  890. // tmp_slAssistCadSpdCmd = (SLONG)ass_voCadCmdDeal();
  891. #if(CADASSISTGEAR !=0)
  892. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)CadAssistSped.uwGearTwo ) >> 4;
  893. #else
  894. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - ASS_GEAR1_SPEED)>>2) + ASS_GEAR1_SPEED) >> 4;
  895. #endif
  896. #else
  897. #if(CADASSISTGEAR !=0)
  898. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)CadAssistSped.uwGearTwo ) >> 4;
  899. #else
  900. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - ASS_GEAR1_SPEED)>>2) + ASS_GEAR1_SPEED) >> 4;
  901. #endif
  902. #endif
  903. }
  904. else if(ass_stCadAssParaIn.uwGearSt == 3)
  905. {
  906. ass_stCadAssParaPro.uwAssitMode = ass_stCadAssParaIn.uwGearSt;
  907. /** gear 3, target speed command, Q15 * Q4 / Q4 = Q15 */
  908. #if(INTELLIGENCADGEAR_EN!=0)
  909. // tmp_slAssistCadSpdCmd = (SLONG)ass_voCadCmdDeal();
  910. #if(CADASSISTGEAR !=0)
  911. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)CadAssistSped.uwGearThree ) >> 4;
  912. #else
  913. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - ASS_GEAR1_SPEED)>>1) + ASS_GEAR1_SPEED) >> 4;
  914. #endif
  915. #else
  916. #if(CADASSISTGEAR !=0)
  917. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)CadAssistSped.uwGearThree ) >> 4;
  918. #else
  919. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - ASS_GEAR1_SPEED)>>1) + ASS_GEAR1_SPEED) >> 4;
  920. #endif
  921. #endif
  922. }
  923. else if(ass_stCadAssParaIn.uwGearSt == 4)
  924. {
  925. ass_stCadAssParaPro.uwAssitMode = ass_stCadAssParaIn.uwGearSt;
  926. /** gear 4, target speed command, Q15 * Q4 / Q4 = Q15 */
  927. #if(INTELLIGENCADGEAR_EN!=0)
  928. // tmp_slAssistCadSpdCmd = (SLONG)ass_voCadCmdDeal();
  929. #if(CADASSISTGEAR !=0)
  930. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)CadAssistSped.uwGearFour ) >> 4;
  931. #else
  932. // tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - (((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - ASS_GEAR1_SPEED)>>2)) >> 4;
  933. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed >> 4;
  934. #endif
  935. #else
  936. //tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - (((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - ASS_GEAR1_SPEED)>>2)) >> 4;
  937. #if(CADASSISTGEAR !=0)
  938. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)CadAssistSped.uwGearFour ) >> 4;
  939. #else
  940. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - (((SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed - ASS_GEAR1_SPEED)>>2)) >> 4;
  941. // tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed >> 4;
  942. #endif
  943. #endif
  944. }
  945. else if(ass_stCadAssParaIn.uwGearSt == 5)
  946. {
  947. ass_stCadAssParaPro.uwAssitMode = ass_stCadAssParaIn.uwGearSt;
  948. /** gear 5, target speed command, Q15 * Q4 / Q4 = Q15 */
  949. #if(INTELLIGENCADGEAR_EN!=0)
  950. if(tmp_slAssistCadSpdCmd < _IQ14(0.9))
  951. {
  952. tmp_slAssistCadSpdCmd = (tmp_slAssistCadSpdCmd * _IQ14(9.0/9.0) >> 14) + _IQ14(0.1);
  953. }
  954. else
  955. {
  956. tmp_slAssistCadSpdCmd = _IQ14(1.0);
  957. }
  958. tmp_slAssistSpdCmd = tmp_slAssistCadSpdCmd * tmp_slMaxMotorSpd >> 14;
  959. #else
  960. #if(CADASSISTGEAR !=0)
  961. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((SLONG)CadAssistSped.uwGearFive ) >> 4;
  962. #else
  963. tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_stCadAssCoef.uwAssistMaxBikeSpeed >> 4;
  964. #endif
  965. #endif
  966. }
  967. else
  968. {
  969. /** gear err */
  970. ass_stCadAssParaPro.uwAssitMode = 0;
  971. tmp_slAssistSpdCmd = 0; /**< Q15 */
  972. }
  973. }
  974. else
  975. {
  976. /** Assist stop */
  977. ass_stCadAssParaPro.uwAssitMode = 0;
  978. tmp_slAssistSpdCmd = 0; /**< Q15 */
  979. }
  980. }
  981. }
  982. else if(ass_stCadAssParaIn.uwGearSt == 0)
  983. {
  984. /** Gear 0, Assist stop */
  985. ass_stCadAssParaPro.uwAssitMode = 0;
  986. tmp_slAssistSpdCmd = 0; /**< Q15 */
  987. }
  988. else
  989. {
  990. /** gear err */
  991. ass_stCadAssParaPro.uwAssitMode = 0;
  992. tmp_slAssistSpdCmd = 0; /**< Q15 */
  993. }
  994. /** Stop Assist when Bike Brake */
  995. if(BikeBrake_blGetstate() == TRUE)
  996. {
  997. cadence_stFreGetOut.uwForwardCnt = 0;
  998. ass_stCadAssParaIn.uwCadanceFwCnt = 0;
  999. ass_stCadAssParaPro.uwAssitMode = 0;
  1000. tmp_slAssistSpdCmd = 0; /**< Q15 */
  1001. }
  1002. else
  1003. {
  1004. }
  1005. #if(STARTRUNATSPEED!=0)
  1006. if(ass_stCadAssParaIn.uwGearSt != 0x22)
  1007. {
  1008. if((bikespeed_stFreGetOut.uwFrequencyPu<RESETTRUNSPEED) &&(ass_stCadAssParaPro.uwAssitMode==0))
  1009. {
  1010. SetZeroRunMode=0;
  1011. }
  1012. else if(cp_stBikeRunInfoPara.BikeSpeedKmH>=STARTRUNSPEED)
  1013. {
  1014. SetZeroRunMode=1;
  1015. }
  1016. if(SetZeroRunMode==0)
  1017. {
  1018. // bikethrottle_stBikeThrottleOut.uwThrottlePercent=0;
  1019. cadence_stFreGetOut.uwForwardCnt = 0;
  1020. ass_stCadAssParaIn.uwCadanceFwCnt = 0;
  1021. ass_stCadAssParaPro.uwAssitMode = 0;
  1022. tmp_slAssistSpdCmd = 0; /**< Q15 */
  1023. }
  1024. }
  1025. #endif
  1026. /** Assist target speed limit and err judge */
  1027. if(tmp_slAssistSpdCmd < 32767)
  1028. {
  1029. /** Judge speed sign by direction */
  1030. ass_stCadAssParaPro.swAssistSpdCmd = (SWORD)tmp_slAssistSpdCmd*ass_stCadAssParaIn.swDirection;
  1031. }
  1032. else
  1033. {
  1034. /** parameter err */
  1035. ass_stCadAssParaPro.swAssistSpdCmd = 0;
  1036. }
  1037. }
  1038. #endif
  1039. /**
  1040. * @brief Cad Assist Module Max Assist Current Calculate
  1041. *
  1042. * @param void
  1043. * @return void
  1044. */
  1045. void ass_voAssMaxCurCal(void)
  1046. {
  1047. /** Local variable */
  1048. /** Calculate the Speed use for speed limit */
  1049. SLONG tmp_slMotorSpd = (SLONG)ass_stCadAssParaIn.swSpdFbkPu * (SLONG)ass_stCadAssParaIn.swDirection;
  1050. /** Calculate the err of current speed and limit speed */
  1051. SLONG tmp_slSpdLimitErr = tmp_slMotorSpd - ((SLONG)ass_stCadAssCoef.swMSpdpuLimit - ((SLONG)ass_stCadAssCoef.swKmhToMSpdPu * ASS_SPD_LIMIT_ERR >> 4));
  1052. SLONG tmp_slSpdLimitCoef = 0;
  1053. /** Calculate the q axis current limit by speed limit */
  1054. if (tmp_slSpdLimitErr <= 0)
  1055. {
  1056. ass_stCadAssParaPro.swCurrentMaxPu = ass_stCadAssCoef.uwCofCurMaxPu;
  1057. }
  1058. else if(tmp_slSpdLimitErr < ((SLONG)ass_stCadAssCoef.swKmhToMSpdPu * ASS_SPD_LIMIT_ERR >> 4))
  1059. {
  1060. /** Q15 * Q13 / Q15 = Q13 */
  1061. tmp_slSpdLimitCoef = (tmp_slSpdLimitErr << 13) / ((SLONG)ass_stCadAssCoef.swKmhToMSpdPu * ASS_SPD_LIMIT_ERR >> 4);
  1062. /** Q14 * Q13 / Q13 = Q14 */
  1063. ass_stCadAssParaPro.swCurrentMaxPu = ((SLONG)ass_stCadAssCoef.uwCofCurMaxPu * (SLONG)(8192L - tmp_slSpdLimitCoef)>>13);
  1064. }
  1065. else
  1066. {
  1067. ass_stCadAssParaPro.swCurrentMaxPu = 0; /**< Q14 */
  1068. }
  1069. /** Calculate the min value of speed limit,flux limit,power limit and Bms limit. Q14 */
  1070. ass_stCadAssParaPro.swCurrentMaxPu = (ass_stCadAssParaPro.swCurrentMaxPu < ass_stCadAssParaIn.swPwrIqLimitPu) ? ass_stCadAssParaPro.swCurrentMaxPu : ass_stCadAssParaIn.swPwrIqLimitPu;
  1071. ass_stCadAssParaPro.swCurrentMaxPu = (ass_stCadAssParaPro.swCurrentMaxPu < ass_stCadAssParaIn.swFlxIqLimitPu) ? ass_stCadAssParaPro.swCurrentMaxPu : ass_stCadAssParaIn.swFlxIqLimitPu;
  1072. ass_stCadAssParaPro.swCurrentMaxPu = (ass_stCadAssParaPro.swCurrentMaxPu < ass_stCadAssParaIn.uwBmsIqLimitPu) ? ass_stCadAssParaPro.swCurrentMaxPu : ass_stCadAssParaIn.uwBmsIqLimitPu;
  1073. #if(POWER_INTELLIGENCADGEAR_EN!=0)
  1074. ass_stCadAssParaPro.swCurrentMaxPu = (ass_stCadAssParaPro.swCurrentMaxPu < CadSpdPower.uwIqCurLimitMax) ? ass_stCadAssParaPro.swCurrentMaxPu : CadSpdPower.uwIqCurLimitMax;
  1075. #endif
  1076. }
  1077. /**
  1078. * @brief Cad Assist Module Init Voltage Calculate
  1079. *
  1080. * @param void
  1081. * @return void
  1082. */
  1083. void ass_voAssInitVoltageCal(void)
  1084. {
  1085. /** Local variable */
  1086. SLONG tmp_slValue1 = 0;
  1087. SLONG tmp_slValue2 = 0;
  1088. /** Calculate the Aim Motor Speed by Bike Speed */
  1089. /** Q20 * Q10 / Q15 = Q15 */
  1090. tmp_slValue1 = (SLONG)(((SQWORD)ass_stCadAssParaIn.uwBikespeedPu * ass_stCadAssCoef.slBSpdPuToMSpdPu) >> 15);
  1091. /** Aim speed limit. Q15 */
  1092. if(tmp_slValue1 > _IQ15(0.9))
  1093. {
  1094. tmp_slValue1 = _IQ15(0.0);
  1095. }
  1096. else if(tmp_slValue1 < _IQ15(0.0))
  1097. {
  1098. tmp_slValue1 = _IQ15(0.0);
  1099. }
  1100. else
  1101. {
  1102. //
  1103. }
  1104. ass_stCadAssParaPro.swBikeSpd2MotSpdPu = tmp_slValue1 * ass_stCadAssParaIn.swDirection;
  1105. tmp_slValue2 = (SLONG)ass_stCadAssParaIn.swSpdFbkPu * (SLONG)ass_stCadAssParaIn.swDirection;
  1106. if(tmp_slValue2 < -200)
  1107. {
  1108. tmp_slValue1 = tmp_slValue2 * (SLONG)ass_stCadAssParaIn.swDirection;
  1109. }
  1110. else if(tmp_slValue2 > tmp_slValue1)
  1111. {
  1112. tmp_slValue1 = tmp_slValue2 * (SLONG)ass_stCadAssParaIn.swDirection;
  1113. }
  1114. else
  1115. {
  1116. tmp_slValue1 = ass_stCadAssParaPro.swBikeSpd2MotSpdPu;
  1117. }
  1118. /** Calculate the Initial Value of Voltage Limit */
  1119. /** Q15 * Q12 / Q13 = Q14 */
  1120. tmp_slValue1 = (SLONG)tmp_slValue1 *(SLONG)ass_stCadAssCoef.uwFluxPu >> 13;
  1121. /** 加快起动过程 */
  1122. tmp_slValue1 = (tmp_slValue1 * 1126L)>>10;
  1123. /** 对电压限幅初始值进行速度指令限幅处理 */
  1124. if(ass_stCadAssParaPro.uwAssitMode != 0)
  1125. {
  1126. tmp_slValue2 = (SLONG)ass_stCadAssParaPro.swAssistSpdCmd *(SLONG)ass_stCadAssCoef.uwFluxPu >> 13;
  1127. if((tmp_slValue1 * ass_stCadAssParaIn.swDirection) > (tmp_slValue2 * ass_stCadAssParaIn.swDirection))
  1128. {
  1129. tmp_slValue1 = tmp_slValue2;
  1130. }
  1131. }
  1132. /** Initial voltage limit */
  1133. if(tmp_slValue1 >= ass_stCadAssParaIn.swAssMaxVolLimpu)
  1134. {
  1135. tmp_slValue2 = ass_stCadAssParaIn.swAssMaxVolLimpu;
  1136. }
  1137. else if(tmp_slValue1 <= -ass_stCadAssParaIn.swAssMaxVolLimpu)
  1138. {
  1139. tmp_slValue2 = -ass_stCadAssParaIn.swAssMaxVolLimpu;
  1140. }
  1141. else
  1142. {
  1143. tmp_slValue2 = (SWORD)tmp_slValue1;
  1144. }
  1145. ass_stCadAssParaPro.swUqLimitInitPu = tmp_slValue2;
  1146. }
  1147. /**
  1148. * @brief Cad Assist Module Assist Current Calculate
  1149. *
  1150. * @param void
  1151. * @return void
  1152. */
  1153. void ass_voAssCurCalFunc(void)
  1154. {
  1155. SWORD tmp_swAssMeshCur = 0;
  1156. /**< Assist current calculate state machine */
  1157. switch (ass_enCadAssStatus)
  1158. {
  1159. /** Stop state */
  1160. case CadAssStop:
  1161. /** Reset the variable */
  1162. ass_stCadAssCalOut.blAssistflag = FALSE;
  1163. ass_stCadAssParaPro.swTargetAssCurPu = 0;
  1164. ass_stCadAssCalOut.swAssCurrentPu = 0;
  1165. ass_stCadAssParaPro.swVoltageStep = 0;
  1166. ass_lpf_SpeedCmd.slY.sl = 0;
  1167. ass_voSpdPidInit(&ass_stCadAssSpdCtl);
  1168. if(ass_stCadAssParaPro.uwAssitMode != 0)
  1169. {
  1170. ass_enCadAssStatus = CadAssStartup;
  1171. ass_uwCadAssVoltSatCnt = 0;
  1172. ass_uwCadAssStartCnt = 0;
  1173. /** Initial voltage limit */
  1174. ass_stCadAssCalOut.swVoltLimitPu = ass_stCadAssParaPro.swUqLimitInitPu;
  1175. ass_stCadAssParaPro.slVoltageSum = ((SLONG)ass_stCadAssCalOut.swVoltLimitPu << 8);
  1176. }
  1177. /** Stop to Start interval */
  1178. // if(ass_uwCadAssStartCnt < 1500)
  1179. // {
  1180. // ass_uwCadAssStartCnt ++;
  1181. // cadence_stFreGetOut.uwForwardCnt = 0;
  1182. // ass_stCadAssParaIn.uwCadanceFwCnt = 0;
  1183. // }
  1184. // else
  1185. // {
  1186. // if(ass_stCadAssParaPro.uwAssitMode != 0)
  1187. // {
  1188. // ass_enCadAssStatus = CadAssStartup;
  1189. // ass_uwCadAssVoltSatCnt = 0;
  1190. // ass_uwCadAssStartCnt = 0;
  1191. // }
  1192. // }
  1193. break;
  1194. /** Startup state for mesh */
  1195. case CadAssStartup:
  1196. /** setting the assist flag */
  1197. ass_stCadAssCalOut.blAssistflag = TRUE;
  1198. ass_uwCadAssVoltSatCnt ++;
  1199. tmp_swAssMeshCur = ASS_MESH_CUR;
  1200. if(tmp_swAssMeshCur > ass_stCadAssParaPro.swCurrentMaxPu)
  1201. {
  1202. tmp_swAssMeshCur = ass_stCadAssParaPro.swCurrentMaxPu;
  1203. }
  1204. if(ass_stCadAssParaIn.swDirection == 1)
  1205. {
  1206. ass_stCadAssParaPro.swVoltageStep = ASS_VOL_STEP_MAX;
  1207. ass_stCadAssParaPro.swTargetAssCurPu = tmp_swAssMeshCur;
  1208. ass_stCadAssCalOut.swAssCurrentPu = tmp_swAssMeshCur;
  1209. }
  1210. else if(ass_stCadAssParaIn.swDirection == -1)
  1211. {
  1212. ass_stCadAssParaPro.swVoltageStep = -ASS_VOL_STEP_MAX;
  1213. ass_stCadAssParaPro.swTargetAssCurPu = -tmp_swAssMeshCur;
  1214. ass_stCadAssCalOut.swAssCurrentPu = -tmp_swAssMeshCur;
  1215. }
  1216. else
  1217. {
  1218. /** Direction err */
  1219. }
  1220. if(ass_uwCadAssVoltSatCnt >= 250)
  1221. {
  1222. ass_enCadAssStatus = CadAssPro;
  1223. }
  1224. else if((ass_stCadAssParaIn.swSpdFbkPu * ass_stCadAssParaIn.swDirection) >= (ass_stCadAssParaPro.swBikeSpd2MotSpdPu * ass_stCadAssParaIn.swDirection))
  1225. {
  1226. ass_enCadAssStatus = CadAssPro;
  1227. }
  1228. else if((ass_stCadAssParaIn.swSpdFbkPu * ass_stCadAssParaIn.swDirection) >= (ass_stCadAssParaPro.swAssistSpdCmd * ass_stCadAssParaIn.swDirection))
  1229. {
  1230. ass_enCadAssStatus = CadAssPro;
  1231. }
  1232. else
  1233. {
  1234. /** 等待 */
  1235. }
  1236. ass_stCadAssParaPro.slVoltageSum += ass_stCadAssParaPro.swVoltageStep;
  1237. /** voltage limit */
  1238. if(ass_stCadAssParaPro.slVoltageSum >= ((SLONG)ass_stCadAssParaIn.swAssMaxVolLimpu<<8))
  1239. {
  1240. ass_stCadAssParaPro.slVoltageSum = (SLONG)ass_stCadAssParaIn.swAssMaxVolLimpu<<8;
  1241. }
  1242. else if(ass_stCadAssParaPro.slVoltageSum <= -((SLONG)ass_stCadAssParaIn.swAssMaxVolLimpu<<8))
  1243. {
  1244. ass_stCadAssParaPro.slVoltageSum = -(SLONG)ass_stCadAssParaIn.swAssMaxVolLimpu<<8;
  1245. }
  1246. else
  1247. {
  1248. /** Do not deal */
  1249. }
  1250. ass_stCadAssCalOut.swVoltLimitPu = (ass_stCadAssParaPro.slVoltageSum >> 8);
  1251. if(ass_enCadAssStatus == CadAssPro)
  1252. {
  1253. ass_uwCadAssVoltSatCnt = 0;
  1254. ass_uwCadAssStartCnt = 0;
  1255. ass_stCadAssCalOut.swVoltLimitPu = ass_stCadAssParaIn.swUqOutputpu;
  1256. ass_stCadAssParaPro.slVoltageSum = ((SLONG)ass_stCadAssParaIn.swUqOutputpu<<8);
  1257. }
  1258. if(ass_stCadAssParaPro.uwAssitMode == 0)
  1259. {
  1260. ass_enCadAssStatus = CadAssStop;
  1261. ass_stCadAssCalOut.blAssistflag = FALSE;
  1262. ass_voSpdPidInit(&ass_stCadAssSpdCtl);
  1263. ass_stCadAssParaPro.swTargetAssCurPu = 0;
  1264. ass_stCadAssCalOut.swAssCurrentPu = 0;
  1265. ass_stCadAssParaPro.swVoltageStep = 0;
  1266. ass_lpf_SpeedCmd.slY.sl = 0;
  1267. ass_stCadAssParaIn.uwCadanceFwCnt = 0;
  1268. ass_uwCadAssStartCnt = 0;
  1269. ass_uwCadAssVoltSatCnt = 0;
  1270. }
  1271. break;
  1272. case CadAssPro:
  1273. ass_stCadAssCalOut.blAssistflag = TRUE;
  1274. if(ass_stCadAssParaIn.swDirection == 1)
  1275. {
  1276. #if(INTELLIGENCADGEAR_EN!=0)
  1277. if((ass_stCadAssParaIn.swIqFbkpu + _IQ14(5.0/60.0)) < ass_stCadAssParaPro.swCurrentMaxPu)
  1278. {
  1279. ass_stCadAssParaPro.swTargetAssCurPu = (ass_stCadAssParaIn.swIqFbkpu + _IQ14(5.0/60.0));
  1280. }
  1281. else
  1282. {
  1283. ass_stCadAssParaPro.swTargetAssCurPu = ass_stCadAssParaPro.swCurrentMaxPu;
  1284. }
  1285. #else
  1286. ass_stCadAssParaPro.swTargetAssCurPu = ass_stCadAssParaPro.swCurrentMaxPu;
  1287. #endif
  1288. if(((SLONG)ass_stCadAssCalOut.swAssCurrentPu + (SLONG)ass_stCadAssParaPro.swTargetAssCurAcc) < ass_stCadAssParaPro.swTargetAssCurPu)
  1289. {
  1290. ass_stCadAssCalOut.swAssCurrentPu += ass_stCadAssParaPro.swTargetAssCurAcc;
  1291. }
  1292. else if(((SLONG)ass_stCadAssCalOut.swAssCurrentPu - ((SLONG)ass_stCadAssParaPro.swTargetAssCurAcc<<1)) > ass_stCadAssParaPro.swTargetAssCurPu)
  1293. {
  1294. ass_stCadAssCalOut.swAssCurrentPu -= (ass_stCadAssParaPro.swTargetAssCurAcc<<1);
  1295. }
  1296. else
  1297. {
  1298. ass_stCadAssCalOut.swAssCurrentPu = ass_stCadAssParaPro.swTargetAssCurPu;
  1299. }
  1300. }
  1301. else if(ass_stCadAssParaIn.swDirection == -1)
  1302. {
  1303. #if(INTELLIGENCADGEAR_EN!=0)
  1304. if((ass_stCadAssParaIn.swIqFbkpu - _IQ14(5.0/60.0)) > -ass_stCadAssParaPro.swCurrentMaxPu)
  1305. {
  1306. ass_stCadAssParaPro.swTargetAssCurPu = (ass_stCadAssParaIn.swIqFbkpu - _IQ14(5.0/60.0));
  1307. }
  1308. else
  1309. {
  1310. ass_stCadAssParaPro.swTargetAssCurPu = -ass_stCadAssParaPro.swCurrentMaxPu;
  1311. }
  1312. #else
  1313. ass_stCadAssParaPro.swTargetAssCurPu = -ass_stCadAssParaPro.swCurrentMaxPu;
  1314. #endif
  1315. if(((SLONG)ass_stCadAssCalOut.swAssCurrentPu + ((SLONG)ass_stCadAssParaPro.swTargetAssCurAcc<<1)) < ass_stCadAssParaPro.swTargetAssCurPu)
  1316. {
  1317. ass_stCadAssCalOut.swAssCurrentPu += (ass_stCadAssParaPro.swTargetAssCurAcc<<1);
  1318. }
  1319. else if(((SLONG)ass_stCadAssCalOut.swAssCurrentPu - (SLONG)ass_stCadAssParaPro.swTargetAssCurAcc) > ass_stCadAssParaPro.swTargetAssCurPu)
  1320. {
  1321. ass_stCadAssCalOut.swAssCurrentPu -= ass_stCadAssParaPro.swTargetAssCurAcc;
  1322. }
  1323. else
  1324. {
  1325. ass_stCadAssCalOut.swAssCurrentPu = ass_stCadAssParaPro.swTargetAssCurPu;
  1326. }
  1327. }
  1328. else
  1329. {
  1330. //err
  1331. }
  1332. ass_stCadAssSpdCtl.swPidRef = ass_stCadAssParaPro.swAssistSpdCmd;
  1333. ass_stCadAssSpdCtl.swPidFbk = ass_stCadAssParaIn.swSpdFbkPu;
  1334. ass_stCadAssSpdCtl.swIqRef = ass_stCadAssParaIn.swIqRefpu;
  1335. ass_stCadAssSpdCtl.swIqFbk = ass_stCadAssParaIn.swIqFbkpu;
  1336. // ass_stCadAssSpdCtl.swPidLimMax = _IQ10(1.0);
  1337. ass_stCadAssSpdCtl.swDirection = ass_stCadAssParaIn.swDirection;
  1338. if(ass_stCadAssParaIn.uwThrottlePercent > 250)
  1339. {
  1340. ass_stCadAssSpdCtl.uwACTPidKp= 10240;//spdpid->uwThrittlePidKp;
  1341. }
  1342. else
  1343. {
  1344. ass_stCadAssSpdCtl.uwACTPidKp= ass_stCadAssSpdCtl.uwPidKp;
  1345. }
  1346. ass_voSpdPidCtrl(&ass_stCadAssSpdCtl);
  1347. ass_stCadAssParaPro.swVoltageStep = ass_stCadAssSpdCtl.swPidOut;
  1348. ass_stCadAssParaPro.slVoltageSum += ass_stCadAssParaPro.swVoltageStep;
  1349. /** voltage limit */
  1350. if(ass_stCadAssParaPro.slVoltageSum >= ((SLONG)ass_stCadAssParaIn.swAssMaxVolLimpu<<8))
  1351. {
  1352. ass_stCadAssParaPro.slVoltageSum = (SLONG)ass_stCadAssParaIn.swAssMaxVolLimpu<<8;
  1353. }
  1354. else if(ass_stCadAssParaPro.slVoltageSum <= -((SLONG)ass_stCadAssParaIn.swAssMaxVolLimpu<<8))
  1355. {
  1356. ass_stCadAssParaPro.slVoltageSum = -(SLONG)ass_stCadAssParaIn.swAssMaxVolLimpu<<8;
  1357. }
  1358. else
  1359. {
  1360. /** Do not deal */
  1361. }
  1362. ass_stCadAssCalOut.swVoltLimitPu = (ass_stCadAssParaPro.slVoltageSum >> 8);
  1363. if(ass_stCadAssParaPro.uwAssitMode == 0)
  1364. {
  1365. ass_enCadAssStatus = CadAssPreStop;
  1366. ass_stCadAssCalOut.swAssCurrentPu = ass_stCadAssParaIn.swIqFbkpu;
  1367. ass_stCadAssCalOut.blPreStopFlag = TRUE;
  1368. }
  1369. break;
  1370. case CadAssPreStop:
  1371. if(ass_stCadAssParaIn.swDirection == 1)
  1372. {
  1373. ass_stCadAssParaPro.swTargetAssCurPu = 0;
  1374. if(((SLONG)ass_stCadAssCalOut.swAssCurrentPu + (SLONG)ass_stCadAssParaPro.swTargetAssCurAcc) < ass_stCadAssParaPro.swTargetAssCurPu)
  1375. {
  1376. ass_stCadAssCalOut.swAssCurrentPu += (ass_stCadAssParaPro.swTargetAssCurAcc);
  1377. }
  1378. else if(((SLONG)ass_stCadAssCalOut.swAssCurrentPu - ((SLONG)ass_stCadAssParaPro.swTargetAssCurAcc<<1)) > ass_stCadAssParaPro.swTargetAssCurPu)
  1379. {
  1380. ass_stCadAssCalOut.swAssCurrentPu -= (ass_stCadAssParaPro.swTargetAssCurAcc<<1);
  1381. }
  1382. else
  1383. {
  1384. ass_stCadAssCalOut.swAssCurrentPu = ass_stCadAssParaPro.swTargetAssCurPu;
  1385. }
  1386. }
  1387. else if(ass_stCadAssParaIn.swDirection == -1)
  1388. {
  1389. ass_stCadAssParaPro.swTargetAssCurPu = 0;
  1390. if(((SLONG)ass_stCadAssCalOut.swAssCurrentPu + ((SLONG)ass_stCadAssParaPro.swTargetAssCurAcc<<1)) < ass_stCadAssParaPro.swTargetAssCurPu)
  1391. {
  1392. ass_stCadAssCalOut.swAssCurrentPu += (ass_stCadAssParaPro.swTargetAssCurAcc<<1);
  1393. }
  1394. else if(((SLONG)ass_stCadAssCalOut.swAssCurrentPu - (SLONG)ass_stCadAssParaPro.swTargetAssCurAcc) > ass_stCadAssParaPro.swTargetAssCurPu)
  1395. {
  1396. ass_stCadAssCalOut.swAssCurrentPu -= (ass_stCadAssParaPro.swTargetAssCurAcc);
  1397. }
  1398. else
  1399. {
  1400. ass_stCadAssCalOut.swAssCurrentPu = ass_stCadAssParaPro.swTargetAssCurPu;
  1401. }
  1402. }
  1403. else
  1404. {
  1405. //err
  1406. }
  1407. ass_stCadAssCalOut.blPreStopFlag = FALSE;
  1408. if(ass_stCadAssParaPro.uwAssitMode != 0)
  1409. {
  1410. ass_enCadAssStatus = CadAssPro;
  1411. /** Initial voltage limit */
  1412. ass_stCadAssCalOut.swVoltLimitPu = ass_stCadAssParaIn.swUqOutputpu;
  1413. ass_stCadAssParaPro.slVoltageSum = ((SLONG)ass_stCadAssParaIn.swUqOutputpu<<8);
  1414. }
  1415. if(abs(ass_stCadAssCalOut.swAssCurrentPu) <= (ass_stCadAssParaPro.swTargetAssCurAcc<<1))
  1416. {
  1417. ass_enCadAssStatus = CadAssStop;
  1418. ass_stCadAssCalOut.blAssistflag = FALSE;
  1419. ass_voSpdPidInit(&ass_stCadAssSpdCtl);
  1420. ass_stCadAssParaPro.swTargetAssCurPu = 0;
  1421. ass_stCadAssCalOut.swAssCurrentPu = 0;
  1422. ass_stCadAssParaPro.swVoltageStep = 0;
  1423. ass_lpf_SpeedCmd.slY.sl = 0;
  1424. ass_stCadAssParaIn.uwCadanceFwCnt = 0;
  1425. }
  1426. break;
  1427. default:
  1428. break;
  1429. }
  1430. // ass_stCadAssCalOut.swAssCurrentPu = ass_stCadAssParaPro.swTargetAssCurPu;
  1431. }
  1432. /**
  1433. * @brief Cad Assist Module Function
  1434. *
  1435. * @param void
  1436. * @return void
  1437. */
  1438. void ass_voAssistFunc(void)
  1439. {
  1440. // 1ms Counter Cycle Count
  1441. if(ass_stCadAssParaPro.uw1msCnt >= 9999)
  1442. {
  1443. ass_stCadAssParaPro.uw1msCnt = 0;
  1444. }
  1445. else
  1446. {
  1447. ass_stCadAssParaPro.uw1msCnt ++;
  1448. }
  1449. //get input parameter
  1450. ass_voParameterInput();
  1451. //speed limit power
  1452. #if(POWER_INTELLIGENCADGEAR_EN!=0)
  1453. CadSpeedLimitPower();
  1454. #endif
  1455. //Cmd deal
  1456. ass_voAssistCmdDeal();
  1457. //motor speed acc calculate
  1458. ass_stCadAssParaPro.swSpdFbkPuRec[((ass_stCadAssParaPro.uw1msCnt)%10)] = ass_stCadAssParaIn.swSpdFbkPu;
  1459. ass_stCadAssParaPro.swSpdFbkPuAcc = (SWORD)((SLONG)ass_stCadAssParaIn.swSpdFbkPu - (SLONG)ass_stCadAssParaPro.swSpdFbkPuRec[((ass_stCadAssParaPro.uw1msCnt + 1)%10)]);
  1460. ass_voAssMaxCurCal();
  1461. ass_voAssInitVoltageCal();
  1462. //Calculate the Assist Current
  1463. ass_voAssCurCalFunc();
  1464. }
  1465. MaTCHCAD_TRUCT CadSmart;
  1466. UWORD TESTCadnu=0;
  1467. void CadSmartDisting(void)
  1468. {
  1469. CadSmart.wwCdenceRpm= ((SQWORD)cadence_stFreGetOut.uwFrequencyPu* cof_uwFbHz * 60) >> 20;// uwFrequencyPu
  1470. CadSmart.uwBikeRpm= ((SQWORD)bikespeed_stFreGetOut.uwLPFFrequencyPu * FBASE * 6000) >>20; //uwFrequencyPu
  1471. if((CadSmart.blCadChangeFlag==TRUE)&&(CadSmart.wwCdenceRpm>5)) //踏频有更新
  1472. {
  1473. TESTCadnu++;
  1474. CadSmart.uwCadErrNow= CadSmart.uwBikeRpm/CadSmart.wwCdenceRpm; //
  1475. if(CadSmart.blmatchMode==FALSE)
  1476. {
  1477. if(((CadSmart.uwCadErrNow-CadSmart.uwCadErrBack)<15)&&((CadSmart.uwCadErrBack-CadSmart.uwCadErrNow)<15))
  1478. {
  1479. CadSmart.blmatchMode=TRUE;
  1480. CadSmart.uwCadErrdata[0]=CadSmart.uwCadErrNow;
  1481. CadSmart.uwcnt=1;
  1482. CadSmart.uwWhellFitCnt=0;
  1483. }
  1484. }
  1485. else
  1486. {
  1487. CadSmart.uwCadErrdata[CadSmart.uwcnt]=CadSmart.uwCadErrNow;
  1488. if(((CadSmart.uwCadErrdata[CadSmart.uwcnt]-CadSmart.uwCadErrdata[CadSmart.uwcnt-1])<15)&&((CadSmart.uwCadErrdata[CadSmart.uwcnt-1]-CadSmart.uwCadErrdata[CadSmart.uwcnt])<15))
  1489. {
  1490. CadSmart.uwWhellFitCnt++;
  1491. }
  1492. if(CadSmart.uwcnt>=4)
  1493. {
  1494. if(CadSmart.uwWhellFitCnt==CadSmart.uwcnt)
  1495. {
  1496. CadSmart.uwmatchNumb=(CadSmart.uwCadErrdata[1]+CadSmart.uwCadErrdata[2]+CadSmart.uwCadErrdata[3]+CadSmart.uwCadErrdata[4])>>2;
  1497. if(CadSmart.uwmatchNumb<110)
  1498. {
  1499. CadSmart.uwmatchNumb = 110;
  1500. }
  1501. else if(CadSmart.uwmatchNumb>510)
  1502. {
  1503. CadSmart.uwmatchNumb=510;
  1504. }
  1505. if(CadSmart.uwmatchNumb!= CadSmart.uwmatchNumbBack)
  1506. {
  1507. ass_stCadAssCoef.uwMaxCadRpm =(UWORD)(166667/(ULONG)ass_stCadAssCoef.uwWheelCircumferenceCm*(ULONG)ass_ParaSet.uwAssistLimitBikeSpdStart/CadSmart.uwmatchNumb);
  1508. MC_UpcInfo.stAssistInfo.uwMaxCadRpm=ass_stCadAssCoef.uwMaxCadRpm;
  1509. // MC_UpcInfo.stAssistInfo.uwSaveFlg = 1;
  1510. cp_stFlg.ParaSaveEEFlg = TRUE;
  1511. // cp_stFlg.ParaUpdateFlg = TRUE;
  1512. //cp_stFlg.ParaAInfoUpdateFlg = TRUE;
  1513. // cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
  1514. CadSmart.uwmatchNumbBack=CadSmart.uwmatchNumb;
  1515. }
  1516. }
  1517. CadSmart.uwcnt=0;
  1518. CadSmart.uwWhellFitCnt=0;
  1519. CadSmart.blmatchMode=FALSE;
  1520. }
  1521. CadSmart.uwcnt++;
  1522. }
  1523. CadSmart.uwCadErrBack=CadSmart.uwCadErrNow;
  1524. CadSmart.blCadChangeFlag=FALSE;
  1525. }
  1526. }
  1527. #if(POWER_INTELLIGENCADGEAR_EN!=0)
  1528. //速度限功率
  1529. void CadSpeedLimitPower(void)
  1530. {
  1531. UWORD CadGear;
  1532. CadSpdPower.uwbikespeedCal = bikespeed_stFreGetOut.uwLPFFrequencyPu;
  1533. /* Bike Speed Limit: use ass_CalCoef.swBikeSpeedGain(0-1) */
  1534. CadGear=ass_stCadAssParaIn.uwGearSt;
  1535. if(CadGear>5)
  1536. {
  1537. CadGear=5;
  1538. }
  1539. CadSpdPower.uwBikeSpdThresHold1= CadSpdPower.uwLimitdSpeed_S[CadGear];
  1540. CadSpdPower.uwBikeSpdThresHold2= CadSpdPower.uwLimitdSpeed_E[CadGear];
  1541. if(CadSpdPower.uwbikespeedCal <= CadSpdPower.uwBikeSpdThresHold1)
  1542. {
  1543. CadSpdPower.uwIqCurLimitMax = ass_ParaCong.uwCofCurMaxPu;
  1544. }
  1545. else if (CadSpdPower.uwbikespeedCal < CadSpdPower.uwBikeSpdThresHold2 )
  1546. {
  1547. CadSpdPower.uwIqCurLimitMax = (SLONG)(ass_ParaCong.uwCofCurMaxPu-CadSpdPower.uwIqCurLimitMin) *((SLONG)CadSpdPower.uwBikeSpdThresHold2-(SLONG)CadSpdPower.uwbikespeedCal ) /((SLONG)CadSpdPower.uwBikeSpdThresHold2 -(SLONG)CadSpdPower.uwBikeSpdThresHold1) ; // Q12
  1548. CadSpdPower.uwIqCurLimitMax +=CadSpdPower.uwIqCurLimitMin;
  1549. }
  1550. else
  1551. {
  1552. CadSpdPower.uwIqCurLimitMax = CadSpdPower.uwIqCurLimitMin;
  1553. }
  1554. }
  1555. void CadSpedLinitPowerInit(void)
  1556. {
  1557. CadSpdPower.uwAssistLimitSpdStart[0]=ass_ParaSet.uwAssistLimitBikeSpdStart;
  1558. CadSpdPower.uwAssistLimitSpdStop[0]=CadSpdPower.uwAssistLimitSpdStart[0]+5;
  1559. CadSpdPower.uwAssistLimitSpdStart[1]=ass_ParaSet.uwAssistLimitBikeSpdStart*3/10;//
  1560. CadSpdPower.uwAssistLimitSpdStop[1]=CadSpdPower.uwAssistLimitSpdStart[1]+7;
  1561. CadSpdPower.uwAssistLimitSpdStart[2]=ass_ParaSet.uwAssistLimitBikeSpdStart*45/100;//
  1562. CadSpdPower.uwAssistLimitSpdStop[2]=CadSpdPower.uwAssistLimitSpdStart[2]+7;
  1563. CadSpdPower.uwAssistLimitSpdStart[3]=ass_ParaSet.uwAssistLimitBikeSpdStart*6/10;//
  1564. CadSpdPower.uwAssistLimitSpdStop[3]=CadSpdPower.uwAssistLimitSpdStart[3]+7;
  1565. CadSpdPower.uwAssistLimitSpdStart[4]=ass_ParaSet.uwAssistLimitBikeSpdStart ;//
  1566. CadSpdPower.uwAssistLimitSpdStop[4]=CadSpdPower.uwAssistLimitSpdStart[4]+2;
  1567. CadSpdPower.uwAssistLimitSpdStart[5]=ass_ParaSet.uwAssistLimitBikeSpdStart ;//100%
  1568. CadSpdPower.uwAssistLimitSpdStop[5]=CadSpdPower.uwAssistLimitSpdStart[5]+2;
  1569. CadSpdPower.uwLimitdSpeed_S[0]=((SQWORD)1000 << 20) * CadSpdPower.uwAssistLimitSpdStart[0] /
  1570. ((SQWORD)36 * (ass_ParaCong.uwWheelPerimeter + ass_ParaCong.swDeltPerimeter) * FBASE); // Q20 3216 = Q10(3.1415926)
  1571. CadSpdPower.uwLimitdSpeed_S[1]=((SQWORD)1000 << 20) * CadSpdPower.uwAssistLimitSpdStart[1] /
  1572. ((SQWORD)36 * (ass_ParaCong.uwWheelPerimeter + ass_ParaCong.swDeltPerimeter) * FBASE); // Q20 3216 = Q10(3.1415926)
  1573. CadSpdPower.uwLimitdSpeed_S[2]=((SQWORD)1000 << 20) * CadSpdPower.uwAssistLimitSpdStart[2] /
  1574. ((SQWORD)36 * (ass_ParaCong.uwWheelPerimeter + ass_ParaCong.swDeltPerimeter) * FBASE); // Q20 3216 = Q10(3.1415926)
  1575. CadSpdPower.uwLimitdSpeed_S[3]=((SQWORD)1000 << 20) * CadSpdPower.uwAssistLimitSpdStart[3] /
  1576. ((SQWORD)36 * (ass_ParaCong.uwWheelPerimeter + ass_ParaCong.swDeltPerimeter) * FBASE); // Q20 3216 = Q10(3.1415926)
  1577. CadSpdPower.uwLimitdSpeed_S[4]=((SQWORD)1000 << 20) * CadSpdPower.uwAssistLimitSpdStart[4] /
  1578. ((SQWORD)36 * (ass_ParaCong.uwWheelPerimeter + ass_ParaCong.swDeltPerimeter) * FBASE); // Q20 3216 = Q10(3.1415926)
  1579. CadSpdPower.uwLimitdSpeed_S[5]=((SQWORD)1000 << 20) * CadSpdPower.uwAssistLimitSpdStart[5] /
  1580. ((SQWORD)36 * (ass_ParaCong.uwWheelPerimeter + ass_ParaCong.swDeltPerimeter) * FBASE); // Q20 3216 = Q10(3.1415926)
  1581. CadSpdPower.uwLimitdSpeed_E[0] = ((SQWORD)1000 << 20) * CadSpdPower.uwAssistLimitSpdStop[0] /
  1582. ((SQWORD)36 * (ass_ParaCong.uwWheelPerimeter + ass_ParaCong.swDeltPerimeter) * FBASE); // Q20 3216 = Q10(3.1415926)
  1583. CadSpdPower.uwLimitdSpeed_E[1] = ((SQWORD)1000 << 20) * CadSpdPower.uwAssistLimitSpdStop[1] /
  1584. ((SQWORD)36 * (ass_ParaCong.uwWheelPerimeter + ass_ParaCong.swDeltPerimeter) * FBASE); // Q20 3216 = Q10(3.1415926)
  1585. CadSpdPower.uwLimitdSpeed_E[2] = ((SQWORD)1000 << 20) * CadSpdPower.uwAssistLimitSpdStop[2] /
  1586. ((SQWORD)36 * (ass_ParaCong.uwWheelPerimeter + ass_ParaCong.swDeltPerimeter) * FBASE); // Q20 3216 = Q10(3.1415926)
  1587. CadSpdPower.uwLimitdSpeed_E[3] = ((SQWORD)1000 << 20) * CadSpdPower.uwAssistLimitSpdStop[3] /
  1588. ((SQWORD)36 * (ass_ParaCong.uwWheelPerimeter + ass_ParaCong.swDeltPerimeter) * FBASE); // Q20 3216 = Q10(3.1415926)
  1589. CadSpdPower.uwLimitdSpeed_E[4] = ((SQWORD)1000 << 20) * CadSpdPower.uwAssistLimitSpdStop[4] /
  1590. ((SQWORD)36 * (ass_ParaCong.uwWheelPerimeter + ass_ParaCong.swDeltPerimeter) * FBASE); // Q20 3216 = Q10(3.1415926)
  1591. CadSpdPower.uwLimitdSpeed_E[5] = ((SQWORD)1000 << 20) * CadSpdPower.uwAssistLimitSpdStop[5] /
  1592. ((SQWORD)36 * (ass_ParaCong.uwWheelPerimeter + ass_ParaCong.swDeltPerimeter) * FBASE); // Q20 3216 = Q10(3.1415926)
  1593. CadSpdPower.uwBikeSpdThresHold1=CadSpdPower.uwLimitdSpeed_S[0];
  1594. CadSpdPower.uwBikeSpdThresHold2=CadSpdPower.uwLimitdSpeed_E[0];
  1595. CadSpdPower.uwIqCurLimitMin= (UWORD)(((ULONG)(CAD_IS_MIN_AP) << 14)/IBASE);
  1596. }
  1597. #endif
  1598. void GearLimitCurInit(void)
  1599. {
  1600. GearCur.swAccCurLimitMax= cp_stControlPara.swPwrLimitValWt;
  1601. }
  1602. void GearLimitCurHandle(void)
  1603. {
  1604. #if(GEAR_POWERCURLIMIT_EN!=0)
  1605. #if(GEAR_CUR_NORMOL!=0)
  1606. GearCur.uwAccCurLimitGear=ass_stCadAssParaIn.uwGearSt;
  1607. if(GearCur.uwAccCurLimitGear >5)
  1608. {
  1609. GearCur.uwAccCurLimitGear=5;
  1610. }
  1611. if(GearCur.uwAccCurLimitGear==1)
  1612. {
  1613. GearCur.swAccCurLimitMax=cp_stControlPara.swPwrLimitValWt/100*GEAR_CURVALUT_ONE;
  1614. }
  1615. else if(GearCur.uwAccCurLimitGear==2)
  1616. {
  1617. GearCur.swAccCurLimitMax=cp_stControlPara.swPwrLimitValWt/100*GEAR_CURVALUT_TWO
  1618. }
  1619. else if(GearCur.uwAccCurLimitGear==3)
  1620. {
  1621. GearCur.swAccCurLimitMax=cp_stControlPara.swPwrLimitValWt/100*GEAR_CURVALUT_THR;
  1622. }
  1623. else if(GearCur.uwAccCurLimitGear==4)
  1624. {
  1625. GearCur.swAccCurLimitMax=cp_stControlPara.swPwrLimitValWt/100*GEAR_CURVALUT_FOR;
  1626. }
  1627. else if(GearCur.uwAccCurLimitGear==5)
  1628. {
  1629. GearCur.swAccCurLimitMax=cp_stControlPara.swPwrLimitValWt/100*GEAR_CURVALUT_FIV;
  1630. }
  1631. else
  1632. {
  1633. GearCur.swAccCurLimitMax=cp_stControlPara.swPwrLimitValWt;
  1634. }
  1635. #elif(GEAR_CUR_UART5S!=0)
  1636. if(stOBC_RunInfo.ucPWM!=GearCur.uwUart5SPWM)
  1637. {
  1638. GearCur.uwUart5SPWM=stOBC_RunInfo.ucPWM;
  1639. if(GearCur.uwUart5SPWM>256)
  1640. GearCur.uwUart5SPWM=256;
  1641. GearCur.swAccCurLimitMax= (cp_stControlPara.swPwrLimitValWt>>8)* GearCur.uwUart5SPWM;
  1642. if(GearCur.swAccCurLimitMax<720)
  1643. GearCur.swAccCurLimitMax=720;
  1644. }
  1645. #endif
  1646. #else
  1647. GearCur.swAccCurLimitMax= cp_stControlPara.swPwrLimitValWt
  1648. #endif
  1649. cp_stControlPara.swPwrLimitValWtCALC= GearCur.swAccCurLimitMax;
  1650. }