CadAssist.c 76 KB

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