nv_storage.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. #include "app/nv_storage.h"
  2. #include "bsp/fmc_flash.h"
  3. #include "libs/crc16.h"
  4. #include "libs/logger.h"
  5. #include "foc/motor/motor_param.h"
  6. #include "foc/foc_config.h"
  7. static motor_params_t m_params;
  8. static foc_params_t foc_params;
  9. static mc_gear_config_t gear_config;
  10. motor_params_t *nv_get_motor_params(void) {
  11. return &m_params;
  12. }
  13. foc_params_t *nv_get_foc_params(void) {
  14. return &foc_params;
  15. }
  16. mc_gear_config_t *nv_get_gear_configs(void) {
  17. return &gear_config;
  18. }
  19. void nv_save_hall_table(s32 *hall_table) {
  20. memcpy((char *)m_params.hall_table, (char *)hall_table, sizeof(m_params.hall_table));
  21. nv_save_motor_params();
  22. }
  23. void nv_save_angle_offset(float offset) {
  24. m_params.offset = offset;
  25. nv_save_motor_params();
  26. }
  27. static void nv_default_motor_params(void) {
  28. m_params.mot_nr = MOTOR_NR;
  29. m_params.poles = MOTOR_POLES;
  30. m_params.r = MOTOR_R;
  31. m_params.ld = MOTOR_Ld;
  32. m_params.lq = MOTOR_Lq;
  33. m_params.offset = MOTOR_ENC_OFFSET;//180;//(69.0f);
  34. m_params.est_pll_band = 100;
  35. m_params.pos_lock_pll_band = 500;
  36. m_params.flux_linkage = 0.0f;
  37. }
  38. static void nv_default_foc_params(void) {
  39. foc_params.s_maxDCVol = CONFIG_MAX_DC_VOL;
  40. foc_params.s_minDCVol = CONFIG_MIN_DC_VOL;
  41. foc_params.s_PhaseCurrLim = CONFIG_DEFAULT_PHASE_CURR_LIM;
  42. foc_params.s_maxRPM = CONFIG_DEFAULT_RPM_LIM;
  43. foc_params.s_maxEpmRPM = CONFIG_DEFAULT_EPM_RPM;
  44. foc_params.s_maxEpmPhaseCurrLim = CONFIG_DEFAULT_EPM_PHASE_CURR;
  45. foc_params.s_maxTorque = foc_params.s_PhaseCurrLim;
  46. foc_params.s_PhaseCurreBrkLim = CONFIG_DEFAULT_EBRK_PHASE_CURR;
  47. foc_params.n_currentBand = CONFIG_CURRENT_BANDWITH;
  48. foc_params.n_brkShutPower = CONFIG_BRK_SHUT_POWER_ENABLE;
  49. foc_params.s_LimitiDC = CONFIG_DEFAULT_IDC_LIM;
  50. foc_params.s_iDCeBrkLim = CONFIG_DEFAULT_EBRK_IDC_LIM;
  51. foc_params.n_minThroVol = CONFIG_THROTTLE_LOW_VALUE;
  52. foc_params.n_maxThroVol = CONFIG_THROTTLE_MAX_VALUE;
  53. foc_params.n_autoHold = CONFIG_AUTOHOLD_ENABLE;
  54. foc_params.n_acc_time = CONFIG_ACC_TIME;
  55. foc_params.n_dec_time = CONFIG_DEC_TIME;
  56. foc_params.n_ebrk_time = CONFIG_EBRK_RAMP_TIME;
  57. foc_params.n_FwEnable = CONFIG_DEFAULT_FW_ENABLE;
  58. foc_params.pid_conf[PID_D_id].kp = (foc_params.n_currentBand * MOTOR_Ld);
  59. foc_params.pid_conf[PID_D_id].ki = (MOTOR_R/MOTOR_Ld);
  60. foc_params.pid_conf[PID_D_id].kb = 0;
  61. foc_params.pid_conf[PID_Q_id].kp = (foc_params.n_currentBand * MOTOR_Lq);
  62. foc_params.pid_conf[PID_Q_id].ki = (MOTOR_R/MOTOR_Lq);
  63. foc_params.pid_conf[PID_Q_id].kb = 0;
  64. foc_params.pid_conf[PID_TRQ_id].kp = TRQ_PI_KP;
  65. foc_params.pid_conf[PID_TRQ_id].ki = TRQ_PI_KI;
  66. foc_params.pid_conf[PID_TRQ_id].kb = 1.0f;
  67. foc_params.pid_conf[PID_Spd_id].kp = 0.13f;
  68. foc_params.pid_conf[PID_Spd_id].ki = 0.08f;
  69. foc_params.pid_conf[PID_Spd_id].kb = 1.0f;
  70. foc_params.pid_conf[PID_Pow_id].kp = 0.6f;
  71. foc_params.pid_conf[PID_Pow_id].ki = 4.0f;
  72. foc_params.pid_conf[PID_Pow_id].kb = 0;
  73. foc_params.pid_conf[PID_Lock_id].kp = (0.01f);
  74. foc_params.pid_conf[PID_Lock_id].ki = (0.20f);
  75. foc_params.pid_conf[PID_Lock_id].kb = 0;
  76. foc_params.pid_conf[PID_FW_id].kp = 0;
  77. foc_params.pid_conf[PID_FW_id].ki = 0.01f;
  78. foc_params.pid_conf[PID_FW_id].kb = 0;
  79. }
  80. static void nv_default_gear_config(void) {
  81. /* 48v 模式 */
  82. gear_config.gears_48[0].u_maxRPM = 1430;
  83. gear_config.gears_48[0].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM * 0.5f;
  84. gear_config.gears_48[0].u_maxIdc = 25;
  85. gear_config.gears_48[0].u_accTime = 50;
  86. gear_config.gears_48[1].u_maxRPM = 2100;
  87. gear_config.gears_48[1].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM * 0.8f;
  88. gear_config.gears_48[1].u_maxIdc = 30;
  89. gear_config.gears_48[1].u_accTime = 80;
  90. gear_config.gears_48[2].u_maxRPM = 2850;
  91. gear_config.gears_48[2].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
  92. gear_config.gears_48[2].u_maxIdc = 40;
  93. gear_config.gears_48[2].u_accTime = 80;
  94. gear_config.gears_48[3].u_maxRPM = 2850;
  95. gear_config.gears_48[3].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
  96. gear_config.gears_48[3].u_maxIdc = 40;
  97. gear_config.gears_48[3].u_accTime = 80;
  98. gear_config.gears_48[4].u_maxRPM = 2850;
  99. gear_config.gears_48[4].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
  100. gear_config.gears_48[4].u_maxIdc = 40;
  101. gear_config.gears_48[4].u_accTime = 80;
  102. /* 96v 模式 */
  103. gear_config.gears_96[0].u_maxRPM = 2850;
  104. gear_config.gears_96[0].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM * 0.5f;
  105. gear_config.gears_96[0].u_maxIdc = 25;
  106. gear_config.gears_96[0].u_accTime = 50;
  107. gear_config.gears_96[1].u_maxRPM = 4300;
  108. gear_config.gears_96[1].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM * 0.8f;
  109. gear_config.gears_96[1].u_maxIdc = 30;
  110. gear_config.gears_96[1].u_accTime = 80;
  111. gear_config.gears_96[2].u_maxRPM = 5500;
  112. gear_config.gears_96[2].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
  113. gear_config.gears_96[2].u_maxIdc = 35;
  114. gear_config.gears_96[2].u_accTime = 100;
  115. gear_config.gears_96[3].u_maxRPM = 5500;
  116. gear_config.gears_96[3].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
  117. gear_config.gears_96[3].u_maxIdc = 45;
  118. gear_config.gears_96[3].u_accTime = 100;
  119. gear_config.gears_96[4].u_maxRPM = 5500;
  120. gear_config.gears_96[4].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
  121. gear_config.gears_96[4].u_maxIdc = 45;
  122. gear_config.gears_96[4].u_accTime = 100;
  123. }
  124. void nv_save_motor_params(void) {
  125. u16 crc = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  126. m_params.crc16 = crc;
  127. fmc_write_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  128. fmc_write_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  129. }
  130. void nv_read_motor_params(void) {
  131. fmc_read_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  132. u16 crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  133. if (crc0 != m_params.crc16) {
  134. sys_debug("mp 0 error\n");
  135. fmc_read_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  136. crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  137. if (crc0 != m_params.crc16) {
  138. nv_default_motor_params();
  139. nv_save_motor_params();
  140. return;
  141. }
  142. fmc_write_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  143. }else {
  144. fmc_read_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  145. crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  146. if (crc0 != m_params.crc16) {
  147. sys_debug("mp 1 error\n");
  148. fmc_read_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  149. fmc_write_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  150. }
  151. }
  152. }
  153. void nv_save_foc_params(void) {
  154. u16 crc = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  155. foc_params.crc16 = crc;
  156. fmc_write_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  157. fmc_write_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  158. }
  159. void nv_read_foc_params(void) {
  160. fmc_read_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  161. u16 crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  162. if (crc0 != foc_params.crc16) {
  163. sys_debug("fp 0 error\n");
  164. fmc_read_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  165. crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  166. if (crc0 != foc_params.crc16) {
  167. nv_default_foc_params();
  168. nv_save_foc_params();
  169. return;
  170. }
  171. fmc_write_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  172. }else {
  173. fmc_read_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  174. crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  175. if (crc0 != foc_params.crc16) {
  176. sys_debug("fp 1 error\n");
  177. fmc_read_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  178. fmc_write_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  179. }
  180. }
  181. foc_params.s_maxTorque = foc_params.s_PhaseCurrLim;//overwrite
  182. sys_debug("maxTorque=%f\n", foc_params.s_maxTorque);
  183. }
  184. void nv_save_gear_configs(void) {
  185. u16 crc = crc16_get((u8 *)&gear_config, sizeof(gear_config) - 2);
  186. gear_config.crc16 = crc;
  187. fmc_write_data(gear_config_idx_0, (u8 *)&gear_config, sizeof(gear_config));
  188. fmc_write_data(gear_config_idx_1, (u8 *)&gear_config, sizeof(gear_config));
  189. }
  190. void nv_read_gear_configs(void) {
  191. fmc_read_data(gear_config_idx_0, (u8 *)&gear_config, sizeof(gear_config));
  192. u16 crc0 = crc16_get((u8 *)&gear_config, sizeof(gear_config) - 2);
  193. if (crc0 != gear_config.crc16) {
  194. sys_debug("gear 0 error\n");
  195. fmc_read_data(gear_config_idx_1, (u8 *)&gear_config, sizeof(gear_config));
  196. crc0 = crc16_get((u8 *)&gear_config, sizeof(gear_config) - 2);
  197. if (crc0 != gear_config.crc16) {
  198. nv_default_gear_config();
  199. nv_save_gear_configs();
  200. return;
  201. }
  202. fmc_write_data(gear_config_idx_0, (u8 *)&gear_config, sizeof(gear_config));
  203. }else {
  204. fmc_read_data(gear_config_idx_1, (u8 *)&gear_config, sizeof(gear_config));
  205. crc0 = crc16_get((u8 *)&gear_config, sizeof(gear_config) - 2);
  206. if (crc0 != gear_config.crc16) {
  207. sys_debug("gear 1 error\n");
  208. fmc_read_data(gear_config_idx_0, (u8 *)&gear_config, sizeof(gear_config));
  209. fmc_write_data(gear_config_idx_1, (u8 *)&gear_config, sizeof(gear_config));
  210. }
  211. }
  212. }
  213. bool nv_set_gear_config(u8 mode4896, u8 gear, u16 rpm, u16 torque, u16 idc, u16 acc) {
  214. mc_gear_t *gear_cfg;
  215. if (gear >= CONFIG_MAX_GEAR_NUM) {
  216. return false;
  217. }
  218. if (mode4896 == 0) { //48vmode
  219. gear_cfg = &gear_config.gears_48[gear];
  220. }else {
  221. gear_cfg = &gear_config.gears_96[gear];
  222. }
  223. gear_cfg->u_maxRPM = rpm;
  224. gear_cfg->u_maxTorque = torque;
  225. gear_cfg->u_maxIdc = idc;
  226. gear_cfg->u_accTime = acc;
  227. nv_save_gear_configs();
  228. return true;
  229. }
  230. bool nv_get_gear_config(u8 mode4896, u8 gear, u16 *rpm, u16 *torque, u16 *idc, u16 *acc) {
  231. mc_gear_t *gear_cfg;
  232. if (gear >= CONFIG_MAX_GEAR_NUM) {
  233. return false;
  234. }
  235. if (mode4896 == 0) { //48vmode
  236. gear_cfg = &gear_config.gears_48[gear];
  237. }else {
  238. gear_cfg = &gear_config.gears_96[gear];
  239. }
  240. *rpm = gear_cfg->u_maxRPM;
  241. *torque = gear_cfg->u_maxTorque;
  242. *idc = gear_cfg->u_maxIdc;
  243. *acc = gear_cfg->u_accTime;
  244. return true;
  245. }
  246. void nv_set_pid(u8 id, pid_conf_t *pid) {
  247. foc_params.pid_conf[id] = *pid;
  248. nv_save_foc_params();
  249. }
  250. void nv_get_pid(u8 id, pid_conf_t *pid) {
  251. *pid = foc_params.pid_conf[id];
  252. }
  253. void nv_set_hwbrake_mode(u8 mode) {
  254. foc_params.n_brkShutPower = mode;
  255. }
  256. void nv_set_throttle_vol(float min, float max) {
  257. foc_params.n_minThroVol = min;
  258. foc_params.n_maxThroVol = max;
  259. }
  260. void nv_set_ebrake_current(float phase_curr, float dc_curr) {
  261. foc_params.s_PhaseCurreBrkLim = phase_curr;
  262. foc_params.s_iDCeBrkLim = dc_curr;
  263. }
  264. torque_lut_t *nv_get_trq_tlb(void) {
  265. torque_lut_t *tbl = (torque_lut_t *)fmc_get_addr(trq_Tbl_idx);
  266. if (tbl->magic != 0x5AA5) {
  267. sys_error("trq tlb magic error, 0x%x\n", tbl->magic);
  268. return NULL;
  269. }
  270. u16 crc = crc16_get((u8 *)tbl, sizeof(torque_lut_t) - 2);
  271. if (crc != tbl->crc16) {
  272. sys_error("trq tlb crc16 error\n");
  273. return NULL;
  274. }
  275. return tbl;
  276. }
  277. void nv_storage_init(void) {
  278. nv_read_motor_params();
  279. nv_read_foc_params();
  280. nv_read_gear_configs();
  281. sys_debug("encoder_off = %f\n", m_params.offset);
  282. if ((m_params.mot_nr != MOTOR_NR) || (foc_params.pid_conf[PID_TRQ_id].kp != TRQ_PI_KP) || (foc_params.pid_conf[PID_TRQ_id].ki != TRQ_PI_KI)) {
  283. nv_default_motor_params();
  284. nv_default_foc_params();
  285. nv_save_foc_params();
  286. nv_save_motor_params();
  287. }
  288. sys_debug("current band %f\n", foc_params.n_currentBand);
  289. }