AssistCurve.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  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. /****************************************
  17. *
  18. * Definitions & Macros
  19. *
  20. ****************************************/
  21. #define TIMEUNIT 1 // run time unit 1ms
  22. #define CURSWITCH 1// 开关电流斜坡
  23. #define GEAR_NUM 6 // number of gear
  24. #define CADENCE_PULSES_PER_CIRC 64
  25. #define BIKE_WHEEL_DIAMETER 219 // CM
  26. #define BIKE_MECH_RATION 35
  27. #define BIKE_SPEED_IQLIMIT_THRESHOLD1 25 // Km/h
  28. #define BIKE_SPEED_IQLIMIT_THRESHOLD2 (BIKE_SPEED_IQLIMIT_THRESHOLD1 + 2) // Km/h
  29. #define BIKE_SPEED_THROTTLE_MAX 6 // Km/h
  30. #define BIKE_FRONTTEETH_NMB 38 // number
  31. #define BIKE_BACKTEETH_NMB 11 // number
  32. #define BIKE_LIGHT_VOLTAGE 6 //V
  33. #define BIKE_WHEEL_SIZE_ADJUST 0 //cm
  34. #define BIKE_START_MODE 2 //Normal
  35. #define BIKE_AUTO_POWER_OFF_TIME 15 //min
  36. #define BIKE_ASSIST_MODE1 0x0155
  37. #define BIKE_ASSIST_MODE2 0x02AA
  38. #define TORQUE_START_THRESHOLD 80 // 0.1Nm
  39. #define TORQUE_STOP_THRESHOLD 20 // 0.1Nm
  40. #define TORQUE_SWITCH2_THRESHOLD 120 // 0.1Nm
  41. #define TORQUE_SWITCH1_THRESHOLD 60 // 0.1Nm
  42. #define BIKE_ASS_MOTOR_CURRENT_MAX 5500 // 0.01A
  43. #define BIKE_ASS_MOTOR_TORQUE_MAX 20 // 0.1Nm
  44. #define BIKE_SPD_MOTOR_CURRENT_MAX 500 // 0.01A
  45. #define BIKE_SPD_MOTOR_CONSTANT_COMMAND 0 // RPM
  46. #define ASS_LIM_DEFAULT \
  47. { \
  48. {0, 716, 870, 1024, 1024, 1024}, 0 \
  49. } // Q10 percentage 0 70% 85% 100% 100% 100%
  50. #define TORQUE_CAL_IN_DEFAULT \
  51. { \
  52. 0, 0, 0, 0, 0, 0, 0, 0, 0 \
  53. }
  54. #define START_GAIN_DEFAULT \
  55. { \
  56. 16384, 10240, 6144, 4778, 4096 \
  57. } // Q12
  58. #define ASS_LINER_TORQUE_DEFAULT \
  59. { \
  60. 2867, 4096, 6144, 8192, 4096 \
  61. } // Q12
  62. //#define TORQUE_ASSIST_DEFAULT \
  63. // { \
  64. // 0, 1290, 1228, 91,\
  65. // 0, 2212, 1024, 91,\
  66. // 0, 3355, 819, 91, \
  67. // 0, 4792, 614, 0,\
  68. // 0, 6636, 409, 0,\
  69. // 0, 8478, 409, 0,\
  70. // 0, 11059, 0, 0,\
  71. // 0, 13639, 0, 0, \
  72. // 0, 16957, 0, 0,\
  73. // 0, 22118, 0, 0,\
  74. // 16589, 22118, 0, 0,\
  75. // 33178, 25805, 0, 0, \
  76. // 66355, 29491, 0, 0, \
  77. // 132710, 29491, 0, 0,\
  78. // 232243, 29491, 0, 0 \
  79. // }
  80. #define TORQUE_ASSIST_DEFAULT \
  81. { \
  82. 0, 0, 2048, 137,\
  83. 0, 0, 2458, 137,\
  84. 0, 0, 2867, 137, \
  85. 0, 7004, 409, 273,\
  86. 0, 9216, 409, 273,\
  87. 0, 12165, 409, 273,\
  88. 3318, 15852, 0, 137,\
  89. 9953, 21012, 0, 137, \
  90. 36495, 22855, 0, 137,\
  91. 66355, 29491, 0, 137,\
  92. 132710, 29491, 0, 137,\
  93. 232243, 29491, 0, 137, \
  94. 3318, 15852, 0, 137,\
  95. 9953, 21012, 0, 137, \
  96. 36495, 22855, 0, 137 \
  97. }
  98. #define CADENCE_ASSIST_DEFAULT \
  99. { \
  100. 0, 0, 35000, 0, 0, 0, 60000, 0, 0, 0, 60000, 0, 0, 0, 60000, 0, 0, 0, 90000, 0 \
  101. }
  102. #define ASSISTMOD_SELECT_DEFAULT 0x0000
  103. //////////////////////////////// just for Assist Module It may has bug when u used in other Module//////////////
  104. #define TIME_MS2CNT(X) ((ULONG)(X) / TIMEUNIT) // X unit:ms
  105. #define PERCENT30(x) (((ULONG)(x)*300) >> 10) // X is variable needed to percentage
  106. #define PERCENT50(x) (((ULONG)(x)*500) >> 10) // X is variable needed to percentage
  107. #define Q12_1 4094 // Q12(1)=4096
  108. #define Q14_1 16384 // Q14(1)=16384
  109. /***************************************
  110. *
  111. * Type Definations
  112. *
  113. ***************************************/
  114. /**
  115. * @brief Polynomial coefficient
  116. * Y = a*X^3 + b*X^2 + c*x +d
  117. *
  118. */
  119. typedef struct
  120. {
  121. SLONG a; // Q12
  122. SLONG b; // Q12
  123. SLONG c; // Q12
  124. SLONG d; // Q12
  125. } POLY_COEF;
  126. /**
  127. * @brief Polynomial coefficient
  128. * Y = z*(x-h)^2 + k
  129. *
  130. */
  131. typedef struct
  132. {
  133. SLONG z; // Q12
  134. SLONG h; // Q12
  135. SLONG k; // Q12
  136. } ORIG_COEF;
  137. /**
  138. * @brief Type of Assist FSM
  139. *
  140. */
  141. typedef enum
  142. {
  143. Startup = 0,
  144. TorqueAssit = 1,
  145. SpeedAssit = 2,
  146. Spd2Torq = 3,
  147. StartupCruise = 4,
  148. StopAssit = 5,
  149. ReduceCurrent = 6
  150. } ASS_FSM_STATUS;
  151. /**
  152. * @brief AssistCurve Para Configure of Bike
  153. *
  154. */
  155. typedef struct
  156. {
  157. // Bike info
  158. UWORD uwWheelDiameter; // Q0 0.1cm
  159. UWORD uwMechRationMotor;
  160. UWORD uwAssistMaxSpdKmH;
  161. UWORD uwThrottleMaxSpdKmH;
  162. UWORD uwNmFrontChainring;
  163. UWORD uwNmBackChainring;
  164. UWORD uwAssistSelect1;
  165. UWORD uwAssistSelect2;
  166. UWORD uwLightVoltage;
  167. SWORD swDeltDiameter;
  168. UWORD uwStartMode;
  169. UWORD uwAutoPowerOffTime;
  170. UWORD uwCadPulsePerCirc;
  171. UWORD uwBikeAssTorMaxPu;
  172. // Drive info
  173. UWORD uwMotorPoles;
  174. UWORD uwCofCurMaxPu; // Q14,allowed max Current
  175. UWORD uwCofTorMaxPu; // Q14,allowed max Torque
  176. } ASS_PARA_CONFIGURE;
  177. /**
  178. * @brief AssistCurve Para Set From extern
  179. *
  180. */
  181. typedef struct
  182. {
  183. UWORD uwStartupCoef; // Q12 assist gain during startup
  184. UWORD uwStartupCruiseCoef;
  185. UWORD uwAssistStartNm;
  186. UWORD uwAssistStopNm;
  187. UWORD uwStartUpGainStep;
  188. UWORD uwStartUpCadNm;
  189. UWORD uwTorLPFCadNm;
  190. UWORD uwSpeedAssistSpdRpm;
  191. UWORD uwSpeedAssistIMaxA;
  192. UWORD uwAssistLimitBikeSpdStart;
  193. UWORD uwAssistLimitBikeSpdStop;
  194. UWORD uwCadenceWeight; // Q12 0-4094 Cadence sensor assist weight of the whole assist current��the torque weight = 4096 - uwTorWeight
  195. UWORD uwTorWeight; // Q12 0-4094
  196. UWORD uwTorAssAjstGain; // Q12 0-4094
  197. UWORD uwCadenceAssAjstGain; // Q12 0-4094
  198. UWORD uwAsssistSelectNum;
  199. UWORD uwSpdRegion[3]; // Q15 MOTOR SPEED
  200. UWORD uwSpdRegionGain[3]; // Q12 0-4094
  201. } ASS_PARA_SET;
  202. /**
  203. * @brief AssistCurve persentage input
  204. *
  205. */
  206. typedef struct
  207. {
  208. UWORD uwGearSt; // Assist Gear
  209. UWORD swDirection; // Motor direction
  210. UWORD uwtorque;
  211. UWORD uwtorquelpf;
  212. UWORD uwtorquePer; // Q15, Torque sensor output persentage Tmax = 80Nm
  213. UWORD uwcadancePer; // Q15, Cadance output persentage Fmax = 5Hz
  214. UWORD uwcadance; // Q20, Cadance frequency
  215. UWORD uwcadancelast; // Q20, last step Cadance frequency
  216. UWORD uwcadanceFWCnt; // Cadance pulse count number
  217. UWORD uwbikespeed; // Q20, bikespeed hz
  218. UWORD uwSpdFbkAbsPu; // Q15, bikespeed hz
  219. SWORD swSpdFbkPu;
  220. UWORD uwBaseSpdrpm;
  221. SWORD swFlxIqLimit; // Q14
  222. SWORD swPwrIqLimit; // Q14
  223. UWORD SOCValue;
  224. SWORD swCurFdbPu; //Q14
  225. SWORD swCurRefPu;
  226. } ASS_PER_IN;
  227. typedef struct
  228. {
  229. POLY_COEF uwTorqueAssGain[GEAR_NUM];
  230. POLY_COEF uwCadencAsseGain[GEAR_NUM];
  231. UWORD uwStartupGain;
  232. UWORD uwStartupCruiseGain; // Q12 assist gain during startup cruise
  233. SWORD swCoefStep;
  234. UWORD uwAssThreshold;
  235. UWORD uwAssStopThreshold;
  236. UWORD StartFlag;
  237. SWORD swSmoothGain; // Q12
  238. UWORD uwStartUpGainAddStep; // Q12
  239. UWORD uwStartUpTargetGain; // Q12
  240. UWORD uwStartUpTimeCadenceCnt;
  241. UWORD uwSwitch2TorqThreshold;
  242. UWORD uwSwitch1TorqThreshold;
  243. ULONG ulStartupDeltInv;
  244. SWORD swTorqFilterGain; // Q14 Torque filter change from lpf to move average filter
  245. SWORD swCadanceGain;
  246. SWORD uwCadencePeriodCNT;
  247. SWORD swCadanceCNT;
  248. SWORD sw2StopCNT;
  249. SWORD swAss2SpdCNT;
  250. UWORD uwSpeedConstantCommand;
  251. UWORD swSpdLoopAbsCurMax;
  252. SWORD swSpeedlimtrpm;
  253. SWORD swBikeSpeedGain;
  254. UWORD uwCurrentMaxPu;
  255. SWORD swCurrentmax_torAssPu;
  256. SWORD swCurrentmax_cadAssPu;
  257. BOOL blAssistflag;
  258. BOOL blHCadLTorflag;
  259. } ASS_PER_COEF;
  260. typedef struct
  261. {
  262. POLY_COEF uwTorqueAssGain[GEAR_NUM];
  263. POLY_COEF uwCadencAsseGain[GEAR_NUM];
  264. } ASS_PER_COEFIN;
  265. typedef struct
  266. {
  267. UWORD swTorAssistSum1;
  268. UWORD swTorAssistSum2;
  269. SWORD swTorAss2CurrentTemp;
  270. SWORD swCadAss2CurrentTemp;
  271. SWORD swTorAssistCurrentTemp;
  272. SWORD swTorSpdLoopCurrentTemp;
  273. SWORD swTorAssistCurrent;
  274. SWORD swTorRefTarget;
  275. SWORD swTorRefEnd;
  276. SWORD swSpeedRef;
  277. SWORD swCadSpd2MotSpd;
  278. SWORD swVoltLimitPu;
  279. BOOL blAssHoldFlag;
  280. } ASS_PER_OUT;
  281. /**
  282. * @brief AssistCurve current limit input
  283. *
  284. */
  285. typedef struct
  286. {
  287. UWORD uwIqlimit; // Q14, Iq limit
  288. } ASS_CURLIM_OUT;
  289. /**
  290. * @brief AssistCurve current limit input
  291. *
  292. */
  293. typedef struct
  294. {
  295. UWORD uwLimitGain[GEAR_NUM];
  296. UWORD uwSpdThresHold; // Q15 motor speed to decided whether ass or not
  297. UWORD uwBikeSpdThresHold1; // Q15 the start bike speed to limit iqref
  298. UWORD uwBikeSpdThresHold2; // Q15 the end bike speed to limit iqref
  299. ULONG ulBikeSpdDeltInv; // Q14
  300. UWORD uwBikeSpdIqLimitK;
  301. } ASS_CURLIM_COEF;
  302. typedef struct
  303. {
  304. SWORD value;
  305. UWORD length; // 6: 2^6 value to average
  306. SLONG sum;
  307. SLONG AverValue;
  308. SWORD *buffer;
  309. UWORD index;
  310. BOOL blOneDuty;
  311. } MAF_IN;
  312. typedef struct
  313. {
  314. UWORD uwMotprPolePairs;
  315. UWORD uwMotorFluxWb;
  316. SLONG swCalCoefINV;
  317. } TOR2CURRENT_CAL_COEF;
  318. typedef struct
  319. {
  320. UWORD uwIqLimitInitAbs;
  321. UWORD uwIqLimitStartSoc; // IqLimit
  322. UWORD uwIqLimitEndSoc;
  323. SWORD swIqLImitK;
  324. } ASS_LIMIT_ACCORDING_VOL_COF;
  325. typedef struct
  326. {
  327. UWORD uwIqLimitAbs; // IqLimit
  328. } ASS_LIMIT_ACCORDING_VOL_OUT;
  329. /****************************************
  330. *
  331. * Exported variable
  332. *
  333. ****************************************/
  334. extern ASS_LIMIT_ACCORDING_VOL_OUT ass_CurLimitCalBMSOut;
  335. extern ASS_LIMIT_ACCORDING_VOL_COF ass_CurLimCalBMSCoef;
  336. extern ASS_FSM_STATUS Ass_FSM;
  337. extern ASS_PER_OUT ass_CalOut;
  338. extern SWORD Assist_torqueper;
  339. extern ASS_PARA_CONFIGURE ass_ParaCong;
  340. extern ASS_PARA_SET ass_ParaSet;
  341. extern ASS_PER_IN ass_CalIn;
  342. extern ASS_PER_COEF ass_CalCoef;
  343. extern ASS_CURLIM_OUT ass_CurLimOut;
  344. extern ASS_CURLIM_COEF ass_CurLimCoef;
  345. extern SWORD MAF_buffer[64];
  346. extern MAF_IN maf_torque;
  347. extern ASR_SPDPI_IN asr_stTorqSpdPIIn;
  348. extern ASR_SPDPI_OUT asr_stTorqSpdPIOut;
  349. extern ASR_SPDPI_COF asr_stTorqSpdPICoef;
  350. extern ASR_SPDPI_COFIN asr_stTorqSpdPICoefIn;
  351. /************************************************************************
  352. Ram Allocation
  353. *************************************************************************/
  354. /***************************************
  355. *
  356. * Function Definations
  357. *
  358. ***************************************/
  359. /**
  360. * @brief Assistant force curve
  361. *
  362. * @param in
  363. * @return UWORD
  364. */
  365. void AssitEEInit(void);
  366. void AssitCoefInit(void);
  367. void Assist(void);
  368. void MoveAverageFilter(MAF_IN *in);
  369. void MoveAverageFilterClear(MAF_IN *in);
  370. void AssistCurrentLimitAccordingBMS(UWORD uwSOCvalue);
  371. /**
  372. * @brief 选择相应档位曲线
  373. *
  374. */
  375. void AssistMode_Select(void);
  376. #endif