AssistCurve.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. /**
  2. * @file AssistCurve.c
  3. * @author Zhang, Kai(zhangkai71@midea.com)
  4. * @brief
  5. * @version 0.1
  6. * @date 2021-11-15
  7. *
  8. * @copyright Copyright (c) 2021
  9. *
  10. */
  11. #ifndef ASSISTCURVE_H
  12. #define ASSISTCURVE_H
  13. #include "typedefine.h"
  14. #include "macroequ.h"
  15. #include "asr.h"
  16. #include "mathtool.h"
  17. #include "user.h"
  18. #include "syspar.h"
  19. //#include "api.h"
  20. #include "board_config.h"
  21. /****************************************
  22. *
  23. * Definitions & Macros
  24. *
  25. ****************************************/
  26. ///////////////////////////////////////////////////////////////////
  27. #define VolLimCurrLoopErr _IQ14((2.0*M_IS_PEAK_MAX_AP/7500.0)/60.0) /* 电压与电限幅流环指令偏差 */
  28. #define VolLimCtrKp (2250L*M_FLUX_WB/4462L) /* Q14电压限幅控制器比例系数 */
  29. #define VolLimCtrKi (1920L*M_FLUX_WB/4462L) /* Q20电压限幅控制器积分系数 */
  30. #define VolLimCtrKiStep (VolLimCtrKi/120) /* Q20电压限幅控制器积分系数 */
  31. #define PreStartCurr _IQ14(5.0/60.0) /* 预启动电流 */
  32. #define RefCurrErrLim _IQ14(60.0/60.0) /* 电流误差限幅 */
  33. //#define GpioCadVolt_InputSta() GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10)
  34. #define TIMEUNIT 1 // run time unit 1ms
  35. #define TIME_MS2CNT(X) ((ULONG)(X) / TIMEUNIT) // X unit:ms
  36. #define Q12_1 4096 // Q12(1)=4096
  37. #define Q14_1 16384 // Q14(1)=16384
  38. #define TORQUE2PU 1165 // Q20 1<<20/TORQUEBASE = (1<<20)/900
  39. #define BIKE_SPEED_IQLIMIT_THRESHOLD1 (ASS_SPD_LIMIT>>4) // Km/h
  40. #define BIKE_SPEED_IQLIMIT_THRESHOLD2 (BIKE_SPEED_IQLIMIT_THRESHOLD1 + 2) // Km/h
  41. //档位限速 BIKE_SPDLIMIT_EN
  42. #if(BIKE_TORQUESPDLIMIT_EN!=0)
  43. #define BIKE_SPEED_IQLIMIT_Gear1_S (BIKE_SPEED_IQLIMIT_THRESHOLD1*12/25) // Km/h
  44. #define BIKE_SPEED_IQLIMIT_Gear1_E (BIKE_SPEED_IQLIMIT_Gear1_S + 2) // Km/h
  45. #define BIKE_SPEED_IQLIMIT_Gear2_S (BIKE_SPEED_IQLIMIT_THRESHOLD1*15/25) // Km/h
  46. #define BIKE_SPEED_IQLIMIT_Gear2_E (BIKE_SPEED_IQLIMIT_Gear2_S + 2) // Km/h
  47. #define BIKE_SPEED_IQLIMIT_Gear3_S (BIKE_SPEED_IQLIMIT_THRESHOLD1*18/25) // Km/h
  48. #define BIKE_SPEED_IQLIMIT_Gear3_E (BIKE_SPEED_IQLIMIT_Gear3_S + 2) // Km/h
  49. #define BIKE_SPEED_IQLIMIT_Gear4_S (BIKE_SPEED_IQLIMIT_THRESHOLD1*21/25) // Km/h
  50. #define BIKE_SPEED_IQLIMIT_Gear4_E (BIKE_SPEED_IQLIMIT_Gear4_S + 2) // Km/h
  51. #define BIKE_SPEED_IQLIMIT_Gear5_S (BIKE_SPEED_IQLIMIT_THRESHOLD1 ) // Km/h
  52. #define BIKE_SPEED_IQLIMIT_Gear5_E (BIKE_SPEED_IQLIMIT_Gear5_S + 2) // Km/h
  53. #endif
  54. //////////////////////////////// just for Assist Module It may has bug when u used in other Module//////////////
  55. #define GEAR_NUM 6 // number of gear
  56. #define BIKE_START_MODE 2 // 1 Soft 2 Normal 3 Strong
  57. #define ASSISTMOD_SELECT_DEFAULT 0x0000
  58. #define ASSISTMOD_SELECT_MODE1 0x0155
  59. #define ASSISTMOD_SELECT_MODE2 0x02AA
  60. #define TORQUE_START_THRESHOLD 80 // 0.1Nm
  61. #define TORQUE_STOP_THRESHOLD 30 // 0.1Nm
  62. #define BIKE_SPD_MOTOR_CURRENT_MAX 500 // 0.01A
  63. #define BIKE_SPD_MOTOR_CONSTANT_COMMAND 0 // RPM
  64. #define ASS_LIM_DEFAULT \
  65. { \
  66. {0, 716, 870, 1024, 1024, 1024}, 0, 0, 0 \
  67. } // Q10 percentage 0 70% 85% 100% 100% 100%
  68. #define ASS_LINER_TORQUE_DEFAULT \
  69. { \
  70. 1638, 1843, 2457, 3276, 1843 \
  71. } // Q12
  72. #if 1
  73. #define TORQUR_ASSIST_BASE 4200 // 250W Maximum Current
  74. #define TORQUR_CP(x) ((ULONG)(x)*M_IS_PEAK_MAX_AP /TORQUR_ASSIST_BASE)
  75. #define TORQUE_ASSIST_DEFAULT \
  76. { \
  77. TORQUR_CP(10), TORQUR_CP(40), TORQUR_CP(150), 100,\
  78. TORQUR_CP(20), TORQUR_CP(60), TORQUR_CP(250), 100,\
  79. TORQUR_CP(30), TORQUR_CP(80), TORQUR_CP(350), 100, \
  80. TORQUR_CP(40), TORQUR_CP(100), TORQUR_CP(450), 100,\
  81. TORQUR_CP(10), TORQUR_CP(60), TORQUR_CP(400), 100,\
  82. 0, 0, 0, 0,\
  83. 0, 0, 0, 0,\
  84. 0, 0, 0, 0,\
  85. 0, 0, 0, 0,\
  86. 0, 0, 0, 0,\
  87. 0, 0, 0, 0,\
  88. 0, 0, 0, 0,\
  89. 0, 0, 0, 0,\
  90. 0, 0, 0, 0,\
  91. 0, 0, 0, 0,\
  92. }// Y1, Y2, Y3, Z 单位:0.1 Nm
  93. #define ASS_CURVE_X1 30 // 单位:0.1Nm
  94. #define ASS_CURVE_X2 100 // 单位:0.1Nm
  95. #define ASS_CURVE_X3 300 // 单位:0.1Nm
  96. #endif
  97. // #define TORQUE_ASSIST_DEFAULT \
  98. // { \
  99. // 0, 0, 1228, 45,\
  100. // 0, 0, 1433, 45,\
  101. // 0, 0, 1638, 45, \
  102. // 0, 3686, 409, 136,\
  103. // 0, 4976, 409, 136,\
  104. // 0, 6635, 409, 136,\
  105. // 3317, 5529, 819, 137,\
  106. // 1990, 7372, 819, 137, \
  107. // 2654, 8847, 819, 137,\
  108. // 9953, 7372, 1228, 137,\
  109. // 13271, 8847, 1228, 137,\
  110. // 16588, 9584, 1228, 137, \
  111. // 9953, 7372, 1228, -227,\
  112. // 13271, 8847, 1228, -227,\
  113. // 16588, 9584, 1228, -227, \
  114. // }
  115. #define CADENCE_ASSIST_DEFAULT \
  116. { \
  117. 0, 0, 45000, 0, \
  118. 0, 0, 45000, 0, \
  119. 0, 0, 45000, 0, \
  120. 0, 0, 45000, 0, \
  121. 0, 0, 45000, 0 \
  122. } //35000改为45000
  123. /***************************************
  124. *
  125. * Type Definations
  126. *
  127. ***************************************/
  128. /**
  129. * @brief Assist Curve
  130. * Y = a*X^3 + b*X^2 + c*x +d
  131. */
  132. typedef struct
  133. {
  134. SLONG slY1; // 助力曲线点位坐标(X1,Y1)输入X1输出Y1 配置值 单位:0.1Nm
  135. SLONG slY2; // 助力曲线点位坐标(X2,Y2)输入X1输出Y2 配置值 单位:0.1Nm
  136. SLONG slY3; // 助力曲线点位坐标(X3,Y3)输入X1输出Y3 配置值 单位:0.1Nm
  137. SLONG slZ; // 线性段与二次曲线切换点, 配置值 单位:0.1Nm
  138. } ASS_CURVE_PREMETER;
  139. /**
  140. * @brief Assist Curve coefficient
  141. * Y = k1*x+b x< Z
  142. * Y =k1*x+k2*(x-Z)^2+b x>= Z
  143. */
  144. typedef struct
  145. {
  146. SWORD swk1; // Q10 k1 =(y2-y1)/(x2-x1)
  147. SWORD swb; // Q0 b = y2-k2*x1
  148. SWORD swk2; // Q20 k2 = (y3-k1*x3-b)/(x3-Z)^2
  149. SWORD swZ; // Q14
  150. } ASS_CURVE_COEF;
  151. /**
  152. * @brief Assist Curve compenssation coefficient
  153. *
  154. */
  155. typedef struct
  156. {
  157. SWORD swKLow; // Q12
  158. SWORD swKHigh; // Q12
  159. } ASS_CURVE_COMP_COEF;
  160. /**
  161. * @brief Polynomial coefficient
  162. * Y = a*X^3 + b*X^2 + c*x +d
  163. *
  164. */
  165. typedef struct
  166. {
  167. SLONG a; // Q12
  168. SLONG b; // Q12
  169. SLONG c; // Q12
  170. SLONG d; // Q12
  171. } POLY_COEF;
  172. /**
  173. * @brief Polynomial coefficient
  174. * Y = z*(x-h)^2 + k
  175. *
  176. */
  177. typedef struct
  178. {
  179. SLONG z; // Q12
  180. SLONG h; // Q12
  181. SLONG k; // Q12
  182. } ORIG_COEF;
  183. /**
  184. * @brief Type of Assist FSM
  185. *
  186. */
  187. typedef enum
  188. {
  189. StopAssit = 0,
  190. PreStart = 1,
  191. TorqueAssit = 2,
  192. PreStop = 3
  193. } ASS_FSM_STATUS;
  194. /**
  195. * @brief AssistCurve Para Configure of Bike
  196. *
  197. */
  198. typedef struct
  199. {
  200. // Bike info
  201. UWORD uwWheelPerimeter; // Q0 0.1cm
  202. UWORD uwMechRationMotor;
  203. UWORD uwThrottleMaxSpdKmH;
  204. UWORD uwCartSpdKmH;
  205. UWORD uwNmFrontChainring;
  206. UWORD uwNmBackChainring;
  207. UWORD uwAssistSelect1;
  208. UWORD uwAssistSelect2;
  209. UWORD uwLightConfig;
  210. SWORD swDeltPerimeter;
  211. UWORD uwStartMode;
  212. UWORD uwAutoPowerOffTime;
  213. UWORD uwBikeAssTorMaxPu;
  214. // Drive info
  215. UWORD uwMotorPoles;
  216. UWORD uwCofCurMaxPu; // Q14,allowed max Current
  217. UWORD uwCofTorMaxPu; // Q14,allowed max Torque
  218. UWORD uwMechRationMotorEEPROM;
  219. } ASS_PARA_CONFIGURE;
  220. /**
  221. * @brief AssistCurve Para Set From extern
  222. *
  223. */
  224. typedef struct
  225. {
  226. UWORD uwStartupCoef; // Q12 (do not use)
  227. UWORD uwStartupCruiseCoef; // (do not use)
  228. UWORD uwAssistStartNm;
  229. UWORD uwAssistStopNm;
  230. UWORD uwStartUpGainStep;
  231. UWORD uwStartUpCadNm;
  232. UWORD uwTorLPFCadNm;
  233. UWORD uwSpeedAssistSpdRpm;
  234. UWORD uwSpeedAssistIMaxA;
  235. UWORD uwAssistLimitBikeSpdStart;
  236. UWORD uwAssistLimitBikeSpdStop;
  237. UWORD uwCadenceWeight; // Q12 0-4094 Cadence sensor assist weight of the whole assist current��the torque weight = 4096 - uwTorWeight
  238. UWORD uwTorWeight; // Q12 0-4094
  239. UWORD uwTorAssAjstGain; // Q12 0-4094
  240. UWORD uwCadenceAssAjstGain; // Q12 0-4094
  241. UWORD uwAsssistSelectNum;
  242. UWORD uwSpdRegion[3]; // Q15 MOTOR SPEED
  243. UWORD uwSpdRegionGain[3]; // Q12 0-4094
  244. SWORD swUqLimitKi; //Q20 Uq Limit Calcute Coefficient
  245. } ASS_PARA_SET;
  246. /**
  247. * @brief AssistCurve persentage input
  248. *
  249. */
  250. typedef struct
  251. {
  252. BOOL StartAssistEnble; //允许助力启动标志
  253. BOOL blStopAssistEnble; //允许助力启动标志
  254. UWORD uwGearSt; // Assist Gear
  255. SWORD swDirection; // Motor direction
  256. UWORD uwtorque;
  257. UWORD uwtorquelpf;
  258. UWORD uwtorquePer; // Q15, Torque sensor output persentage Tmax = 80Nm
  259. UWORD uwcadancePer; // Q15, Cadance output persentage Fmax = 5Hz
  260. UWORD uwcadance; // Q20, Cadance frequency
  261. UWORD uwcadancelast; // Q20, last step Cadance frequency
  262. UWORD uwcadanceFWCnt; // Cadance pulse count number
  263. UWORD uwbikespeed; // Q20, bikespeed hz
  264. UWORD uwbikespeedCal; // Q20, bikespeed hz
  265. UWORD uwSpdFbkAbsPu; // Q15, bikespeed hz
  266. SWORD swSpdFbkPu; // Q15, motor speed base 1400hz
  267. UWORD uwBaseSpdrpm;
  268. SWORD swFlxIqLimit; // Q14
  269. SWORD swPwrIqLimit; // Q14
  270. UWORD SOCValue;
  271. SWORD swCurFdbPu; //Q14
  272. SWORD swCurRefPu;
  273. UWORD uwStartRunPulse;//启动脉冲个数计数
  274. UWORD uwcadHighStopCnt;//踏频为0时,开始计数值
  275. UWORD uwcadLowStopCnt;//踏频为0时,开始计数值
  276. } ASS_PER_IN;
  277. #define TORQUE_CAL_IN_DEFAULT \
  278. { \
  279. FALSE,FALSE,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \
  280. }
  281. typedef struct
  282. {
  283. POLY_COEF uwTorqueAssGain[GEAR_NUM];
  284. POLY_COEF uwCadencAsseGain[GEAR_NUM];
  285. ASS_CURVE_PREMETER slAssCurPre[GEAR_NUM-1];
  286. ASS_CURVE_COEF swAssCurCoef[GEAR_NUM-1];
  287. ASS_CURVE_COMP_COEF swAssCompCoef;
  288. UWORD uwAssCurvGain;
  289. UWORD uwAssThreshold;
  290. UWORD uwAssStopThreshold;
  291. SWORD swSmoothGain; // Q12
  292. SWORD swSmoothStopGain; /* 停机电流系数 */
  293. UWORD uwStartUpGainAddStep; // Q12
  294. UWORD uwStartUpTimeCadenceCnt;
  295. SWORD swTorqFilterGain; // Q14 Torque filter change from lpf to move average filter
  296. SWORD swBikeSpeedGain;
  297. UWORD uwCurrentMaxPu;
  298. SWORD swCurrentmax_torAssPu;
  299. SWORD swCurrentmax_cadAssPu;
  300. UWORD uwAssistCurveGain; //基于250W助力曲线,根据电机最大电流调整助力曲线
  301. } ASS_PER_COEF;
  302. typedef struct
  303. {
  304. BOOL blAssistflag; /* 力矩助力输出标志 */
  305. UWORD swTorAssistSum1; /* Q14 BASE 90N 总助力力矩 */
  306. SWORD swTorAss2CurrentTemp; /* Q14 BASE 60A 力矩助力指令电流绝对值 */
  307. SWORD swCadAss2CurrentTemp; /* Q14 BASE 60A 踏频助力指令电流绝对值 */
  308. SWORD swTorRefTarget; /* Q14 BASE 60A 总助力指令电流绝对值 */
  309. SWORD swTorRefEnd; /* Q14 BASE 60A 总助力指令电流带方向 */
  310. SWORD swTorAssistCurrentTemp; /* Q14 BASE 60A 总助力指令电流-状态机处理 */
  311. SWORD swTorAssistCurrent; /* Q14 BASE 60A 总助力指令电流-误差限幅处理 */
  312. SWORD swBikeSpd2MotSpd; /* Q15 BASE 1400HZ 当前车速对应电机转速 */
  313. UWORD uwPreStartCnt; /* 预启动计数,单位1ms */
  314. UWORD uwPreStartCntMax; /* 预启动计数最大值,由起动时刻车速决定 */
  315. SWORD swUqLimStep; /* Q22 电压限幅积分步进量(1ms周期) */
  316. SLONG slUqLimSum; /* Q22 电压限幅积分量 */
  317. SWORD swUqLimInit; /* Q14 电压限幅初值 */
  318. SWORD swVoltLimitPu; /* Q14 电压限幅输出 */
  319. } ASS_PER_OUT;
  320. /**
  321. * @brief AssistCurve current limit input
  322. *
  323. */
  324. typedef struct
  325. {
  326. UWORD uwIqlimit; // Q14, Iq limit
  327. } ASS_CURLIM_OUT;
  328. /**
  329. * @brief AssistCurve current limit input
  330. *
  331. */
  332. typedef struct
  333. {
  334. UWORD uwLimitGain[GEAR_NUM];
  335. UWORD uwBikeSpdThresHold1; // Q15 the start bike speed to limit iqref
  336. UWORD uwBikeSpdThresHold2; // Q15 the end bike speed to limit iqref
  337. ULONG ulBikeSpdDeltInv; // Q14
  338. } ASS_CURLIM_COEF;
  339. typedef struct
  340. {
  341. UWORD uwLimitdSpeed_S[GEAR_NUM];
  342. UWORD uwLimitdSpeed_E[GEAR_NUM];
  343. ULONG ulBikeSpdGearDeltInv[GEAR_NUM]; // Q14
  344. UWORD uwAssistLimitSpdStart[GEAR_NUM];
  345. UWORD uwAssistLimitSpdStop[GEAR_NUM];
  346. } ASS_SpedLinit_COEF;
  347. typedef struct
  348. {
  349. SWORD value;
  350. UWORD length; // 6: 2^6 value to average
  351. SLONG sum;
  352. SLONG AverValue;
  353. SWORD *buffer;
  354. UWORD index;
  355. BOOL blSecFlag;
  356. } MAF_IN;
  357. typedef struct
  358. {
  359. UWORD uwMotprPolePairs;
  360. UWORD uwMotorFluxWb;
  361. UWORD uwInvMotorBikeRatio;
  362. SLONG swCalCoefINV;
  363. } TOR2CURRENT_CAL_COEF;
  364. typedef struct
  365. {
  366. UWORD uwIqLimitInitAbs;
  367. UWORD uwIqLimitStartSoc; // IqLimit
  368. UWORD uwIqLimitEndSoc;
  369. SWORD swIqLImitK;
  370. UWORD uwIqLimitStartIdc;
  371. UWORD uwIqLimitEndIdc;
  372. SWORD swIqLImitIdcK;
  373. } ASS_LIMIT_ACCORDING_VOL_COF;
  374. typedef struct
  375. {
  376. UWORD uwIqLimitAbs; // IqLimit
  377. UWORD uwIdcLimIqAbs;
  378. } ASS_LIMIT_ACCORDING_VOL_OUT;
  379. typedef struct
  380. {
  381. UWORD uwReserve1; //助力模块备用EE参数1
  382. UWORD uwReserve2; //助力模块备用EE参数2
  383. UWORD uwReserve3; //助力模块备用EE参数3
  384. UWORD uwReserve4; //助力模块备用EE参数4
  385. } ASS_RESERVE_PARA;
  386. /****************************************
  387. *
  388. * Exported variable
  389. *
  390. ****************************************/
  391. extern LPF_OUT ass_pvt_stCurLpf;
  392. extern ASS_LIMIT_ACCORDING_VOL_OUT ass_CurLimitCalBMSOut;
  393. extern ASS_LIMIT_ACCORDING_VOL_COF ass_CurLimCalBMSCoef;
  394. extern ASS_FSM_STATUS Ass_FSM;
  395. extern ASS_PER_OUT ass_CalOut;
  396. extern SWORD Assist_torqueper;
  397. extern ASS_PARA_CONFIGURE ass_ParaCong;
  398. extern ASS_PARA_SET ass_ParaSet;
  399. extern ASS_PER_IN ass_CalIn;
  400. extern ASS_PER_COEF ass_CalCoef;
  401. extern ASS_CURLIM_OUT ass_CurLimOut;
  402. extern ASS_CURLIM_COEF ass_CurLimCoef;
  403. extern SWORD MAF_buffer[64];
  404. extern MAF_IN maf_torque;
  405. extern ASS_RESERVE_PARA ass_stReservePara;
  406. /************************************************************************
  407. Ram Allocation
  408. *************************************************************************/
  409. /***************************************
  410. *
  411. * Function Definations
  412. *
  413. ***************************************/
  414. /**
  415. * @brief Assistant force curve
  416. *
  417. * @param in
  418. * @return UWORD
  419. */
  420. void AssitEEInit(void);
  421. void AssitCoefInit(void);
  422. void Assist(void);
  423. void MoveAverageFilter(MAF_IN *in);
  424. void MoveAverageFilterClear(MAF_IN *in);
  425. void AssistCurveCoef(ASS_CURVE_COMP_COEF *comp);
  426. SLONG AssistCurveCal(ASS_CURVE_COEF *coef, SWORD *value);
  427. void ass_voTorqAssistInput(void);
  428. void AssistCurrentLimitAccordingBMS(UWORD uwSOCvalue);
  429. void AssCurLimAccordIdc(UWORD uwIdcPu);
  430. void Gear_LimitSpd(UWORD Gear);
  431. /**
  432. * @brief 选择相应档位曲线
  433. *
  434. */
  435. void AssistCurveRatio(void);
  436. #endif