nv_storage.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. #include "app/nv_storage.h"
  2. #include "bsp/bsp_driver.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. #define motorParam_idx_0 (sn_page_index + 1)
  8. #define motorParam_idx_1 (motorParam_idx_0 + 1)
  9. #define focParam_idx_0 (motorParam_idx_1 + 1)
  10. #define focParam_idx_1 (focParam_idx_0 + 1)
  11. #define trq_Tbl_size (4)
  12. #define trq_Tbl_idx0 (focParam_idx_1 + 1)
  13. #define trq_Tbl_idx1 (trq_Tbl_idx0 + trq_Tbl_size)
  14. #define gear_config_idx_0 (trq_Tbl_idx1 + trq_Tbl_size)
  15. #define gear_config_idx_1 (gear_config_idx_0 + 1)
  16. #define sn_idx_back (gear_config_idx_1 + 1)
  17. #define limiter_cfg_idx_0 (sn_idx_back + 1)
  18. #define limiter_cfg_idx_1 (limiter_cfg_idx_0 + 1)
  19. #define mc_err_red_idx_0 (limiter_cfg_idx_1 + 1)
  20. #define mc_err_red_idx_1 (mc_err_red_idx_0 + 1)
  21. static motor_params_t m_params;
  22. static foc_params_t foc_params;
  23. static mc_gear_config_t gear_config;
  24. static mc_limit_t limiter;
  25. #define NV_MAGIC 0x5AA5
  26. motor_params_t *nv_get_motor_params(void) {
  27. return &m_params;
  28. }
  29. foc_params_t *nv_get_foc_params(void) {
  30. return &foc_params;
  31. }
  32. mc_gear_config_t *nv_get_gear_configs(void) {
  33. return &gear_config;
  34. }
  35. mc_limit_t *nv_get_limter(void) {
  36. return &limiter;
  37. }
  38. void nv_save_hall_table(s32 *hall_table) {
  39. // memcpy((char *)m_params.hall_table, (char *)hall_table, sizeof(m_params.hall_table));
  40. nv_save_motor_params();
  41. }
  42. void nv_save_angle_offset(float offset) {
  43. m_params.offset = offset;
  44. nv_save_motor_params();
  45. }
  46. static void nv_default_motor_params(void) {
  47. m_params.mot_nr = MOTOR_NR;
  48. m_params.poles = MOTOR_POLES;
  49. m_params.r = MOTOR_R;
  50. m_params.ld = MOTOR_Ld;
  51. m_params.lq = MOTOR_Lq;
  52. #ifdef MOTOR_Flux
  53. m_params.flux_linkage = MOTOR_Flux;
  54. #else
  55. m_params.flux_linkage = 0;
  56. #endif
  57. m_params.offset = MOTOR_ENC_OFFSET;
  58. m_params.est_pll_band = 200;
  59. m_params.epm_pll_band = 400;
  60. m_params.pos_lock_pll_band = 500;
  61. m_params.velocity_weight = 190;
  62. m_params.velocity_C = 145;
  63. m_params.gear_ratio = 6250;//6.25:1
  64. }
  65. static void nv_default_limter(void) {
  66. limiter.motor[0].enter_pointer = 120;
  67. limiter.motor[0].exit_pointer = 110;
  68. limiter.motor[0].limit_value = 0;
  69. limiter.motor[1].enter_pointer = 110;
  70. limiter.motor[1].exit_pointer = 97;
  71. limiter.motor[1].limit_value = 50;
  72. limiter.motor[2].enter_pointer = 97;
  73. limiter.motor[2].exit_pointer = 85;
  74. limiter.motor[2].limit_value = 80;
  75. limiter.mos[0].enter_pointer = 110;
  76. limiter.mos[0].exit_pointer = 100;
  77. limiter.mos[0].limit_value = 0;
  78. limiter.mos[1].enter_pointer = 100;
  79. limiter.mos[1].exit_pointer = 90;
  80. limiter.mos[1].limit_value = 60;
  81. limiter.mos[2].enter_pointer = 90;
  82. limiter.mos[2].exit_pointer = 80;
  83. limiter.mos[2].limit_value = 80;
  84. limiter.vbus.enter_pointer = 76;
  85. limiter.vbus.exit_pointer = 80;
  86. limiter.vbus.limit_value = 20;
  87. }
  88. static void nv_default_foc_params(void) {
  89. foc_params.s_maxDCVol = CONFIG_MAX_DC_VOL;
  90. foc_params.s_minDCVol = CONFIG_MIN_DC_VOL;
  91. foc_params.s_PhaseCurrLim = CONFIG_DEFAULT_PHASE_CURR_LIM;
  92. foc_params.s_maxRPM = CONFIG_DEFAULT_RPM_LIM;
  93. foc_params.s_maxEpmRPM = CONFIG_DEFAULT_EPM_RPM;
  94. foc_params.s_maxEpmTorqueLim = CONFIG_DEFAULT_EPM_PHASE_CURR;
  95. foc_params.s_maxTorque = CONFIG_MAX_MOTOR_TORQUE;
  96. foc_params.s_TorqueBrkLim = CONFIG_DEFAULT_EBRK_TORQUE;
  97. foc_params.n_currentBand = CONFIG_CURRENT_BANDWITH;
  98. foc_params.n_brkShutPower = CONFIG_BRK_SHUT_POWER_ENABLE;
  99. foc_params.s_LimitiDC = CONFIG_DEFAULT_IDC_LIM;
  100. foc_params.s_iDCeBrkLim = CONFIG_DEFAULT_EBRK_IDC_LIM;
  101. foc_params.n_startThroVol = CONFIG_THROTTLE_START_VALUE;
  102. foc_params.n_endThroVol = CONFIG_THROTTLE_END_VALUE;
  103. foc_params.n_autoHold = CONFIG_AUTOHOLD_ENABLE;
  104. foc_params.n_dec_time = CONFIG_DEC_TIME;
  105. foc_params.n_ebrk_time = CONFIG_EBRK_RAMP_TIME;
  106. foc_params.n_FwEnable = CONFIG_DEFAULT_FW_ENABLE;
  107. foc_params.f_minThroVol = CONFIG_THROTTLE_MIN_VALUE;
  108. foc_params.f_maxThroVol = CONFIG_THROTTLE_MAX_VALUE;
  109. foc_params.s_maxEpmRPMBck = CONFIG_DEFAULT_EPM_BK_RPM;
  110. foc_params.s_maxEpmTorqueLimBck = CONFIG_DEFAULT_EPM_BK_PHASE_CURR;
  111. foc_params.pid_conf[PID_D_id].kp = (foc_params.n_currentBand * MOTOR_Ld);
  112. foc_params.pid_conf[PID_D_id].ki = (MOTOR_R/MOTOR_Ld);
  113. foc_params.pid_conf[PID_D_id].kd = 0;
  114. foc_params.pid_conf[PID_Q_id].kp = (foc_params.n_currentBand * MOTOR_Lq);
  115. foc_params.pid_conf[PID_Q_id].ki = (MOTOR_R/MOTOR_Lq);
  116. foc_params.pid_conf[PID_Q_id].kd = 0;
  117. foc_params.pid_conf[PID_TRQ_id].kp = PI_VEL_LIM_KP;
  118. foc_params.pid_conf[PID_TRQ_id].ki = PI_VEL_LIM_KI;
  119. foc_params.pid_conf[PID_TRQ_id].kd = PI_VEL_LIM_KD;
  120. foc_params.pid_conf[PID_Spd_id].kp = PI_VEL_KP;
  121. foc_params.pid_conf[PID_Spd_id].ki = PI_VEL_KI;
  122. foc_params.pid_conf[PID_Spd_id].kd = PI_VEL_KD;
  123. foc_params.pid_conf[PID_Pow_id].kp = 5.0f;
  124. foc_params.pid_conf[PID_Pow_id].ki = 15.0f;
  125. foc_params.pid_conf[PID_Pow_id].kd = 0;
  126. foc_params.pid_conf[PID_Lock_id].kp = (0.01f);
  127. foc_params.pid_conf[PID_Lock_id].ki = (0.20f);
  128. foc_params.pid_conf[PID_Lock_id].kd = 0;
  129. #ifdef CONFIG_SPEED_LADRC
  130. foc_params.f_adrc_vel_lim_Wo = CONFIG_LADRC_Wo;
  131. foc_params.f_adrc_vel_lim_Wcv = CONFIG_LADRC_Wcv;
  132. foc_params.f_adrc_vel_lim_B0 = CONFIG_LADRC_B0;
  133. foc_params.f_adrc_vel_Wo = CONFIG_LADRC_Wo;
  134. foc_params.f_adrc_vel_Wcv = CONFIG_LADRC_Wcv;
  135. foc_params.f_adrc_vel_B0 = CONFIG_LADRC_B0;
  136. #endif
  137. }
  138. static void nv_default_gear_config(void) {
  139. for (int i = 0; i < CONFIG_MAX_GEAR_NUM; i++) {
  140. gear_config.gears_48[i].n_max_speed = 4000;
  141. gear_config.gears_48[i].n_max_trq = CONFIG_MAX_MOTOR_TORQUE/2;
  142. gear_config.gears_48[i].n_max_idc = 60;
  143. gear_config.gears_48[i].n_zero_accl = 500;
  144. gear_config.gears_48[i].n_accl_time = 10;
  145. gear_config.gears_96[i].n_max_speed = 8000;
  146. gear_config.gears_96[i].n_max_trq = CONFIG_MAX_MOTOR_TORQUE;
  147. gear_config.gears_96[i].n_max_idc = 100;
  148. gear_config.gears_96[i].n_zero_accl = 500;
  149. gear_config.gears_96[i].n_accl_time = 10;
  150. for (int j = 0; j < GEAR_SPEED_TRQ_NUM; j++) {
  151. gear_config.gears_48[i].n_torque[j] = 60+j;
  152. gear_config.gears_96[i].n_torque[j] = 80+j;
  153. }
  154. }
  155. }
  156. void nv_save_motor_params(void) {
  157. u16 crc = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  158. m_params.crc16 = crc;
  159. fmc_write_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  160. fmc_write_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  161. }
  162. void nv_read_motor_params(void) {
  163. fmc_read_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  164. u16 crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  165. if (crc0 != m_params.crc16) {
  166. sys_debug("mp 0 error\n");
  167. fmc_read_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  168. crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  169. if (crc0 != m_params.crc16) {
  170. nv_default_motor_params();
  171. nv_save_motor_params();
  172. return;
  173. }
  174. fmc_write_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  175. }else {
  176. fmc_read_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  177. crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  178. if (crc0 != m_params.crc16) {
  179. sys_debug("mp 1 error\n");
  180. fmc_read_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  181. fmc_write_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  182. }
  183. }
  184. }
  185. bool nv_set_limit_config(u8 *config, int len) {
  186. int config_len = sizeof(nv_limter_t) * (2 * TEMP_LIMITER_NUM + 1);
  187. if (len < config_len) {
  188. return false;
  189. }
  190. memcpy(&limiter.motor[0], config, len);
  191. sys_debug("lim %d %d %d\n", limiter.motor[0].enter_pointer, limiter.motor[0].exit_pointer, limiter.motor[0].limit_value);
  192. nv_save_limit_config();
  193. return true;
  194. }
  195. void* nv_get_limit_config(int *len) {
  196. if (len) {
  197. *len = sizeof(nv_limter_t) * (2 * TEMP_LIMITER_NUM + 1);
  198. }
  199. return &limiter.motor[0];
  200. }
  201. void nv_save_limit_config(void) {
  202. limiter.magic = NV_MAGIC;
  203. u16 crc = crc16_get((u8 *)&limiter, sizeof(limiter) - 2);
  204. limiter.crc16 = crc;
  205. fmc_write_data(limiter_cfg_idx_0, (u8 *)&limiter, sizeof(limiter));
  206. fmc_write_data(limiter_cfg_idx_1, (u8 *)&limiter, sizeof(limiter));
  207. }
  208. void nv_read_limit_config(void) {
  209. fmc_read_data(limiter_cfg_idx_0, (u8 *)&limiter, sizeof(limiter));
  210. u16 crc16 = crc16_get((u8 *)&limiter, sizeof(limiter) - 2);
  211. if (limiter.magic != NV_MAGIC || limiter.crc16 != crc16) {
  212. sys_debug("lim 0 error\n");
  213. fmc_read_data(limiter_cfg_idx_1, (u8 *)&limiter, sizeof(limiter));
  214. crc16 = crc16_get((u8 *)&limiter, sizeof(limiter) - 2);
  215. if (limiter.magic == NV_MAGIC && limiter.crc16 == crc16) {
  216. fmc_write_data(limiter_cfg_idx_0, (u8 *)&limiter, sizeof(limiter));
  217. return;
  218. }else {
  219. sys_debug("lim 1 error\n");
  220. nv_default_limter();
  221. nv_save_limit_config();
  222. }
  223. }else {
  224. fmc_read_data(limiter_cfg_idx_1, (u8 *)&limiter, sizeof(limiter));
  225. crc16 = crc16_get((u8 *)&limiter, sizeof(limiter) - 2);
  226. if (limiter.magic != NV_MAGIC || limiter.crc16 != crc16) {
  227. sys_debug("lim 1 error\n");
  228. fmc_read_data(limiter_cfg_idx_0, (u8 *)&limiter, sizeof(limiter));
  229. fmc_write_data(limiter_cfg_idx_1, (u8 *)&limiter, sizeof(limiter));
  230. }
  231. }
  232. }
  233. void nv_save_foc_params(void) {
  234. u16 crc = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  235. foc_params.crc16 = crc;
  236. fmc_write_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  237. fmc_write_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  238. }
  239. void nv_read_foc_params(void) {
  240. fmc_read_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  241. u16 crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  242. if (crc0 != foc_params.crc16) {
  243. sys_debug("fp 0 error\n");
  244. fmc_read_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  245. crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  246. if (crc0 != foc_params.crc16) {
  247. nv_default_foc_params();
  248. nv_save_foc_params();
  249. return;
  250. }
  251. fmc_write_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  252. }else {
  253. fmc_read_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  254. crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  255. if (crc0 != foc_params.crc16) {
  256. sys_debug("fp 1 error\n");
  257. fmc_read_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  258. fmc_write_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  259. }
  260. }
  261. sys_debug("maxTorque=%f\n", foc_params.s_maxTorque);
  262. }
  263. void nv_save_gear_configs(void) {
  264. gear_config.magic = NV_MAGIC;
  265. u16 crc = crc16_get((u8 *)&gear_config, sizeof(gear_config) - 2);
  266. gear_config.crc16 = crc;
  267. fmc_write_data(gear_config_idx_0, (u8 *)&gear_config, sizeof(gear_config));
  268. fmc_write_data(gear_config_idx_1, (u8 *)&gear_config, sizeof(gear_config));
  269. }
  270. void nv_read_gear_configs(void) {
  271. fmc_read_data(gear_config_idx_0, (u8 *)&gear_config, sizeof(gear_config));
  272. u16 crc0 = crc16_get((u8 *)&gear_config, sizeof(gear_config) - 2);
  273. if (crc0 != gear_config.crc16) {
  274. sys_debug("gear 0 error\n");
  275. fmc_read_data(gear_config_idx_1, (u8 *)&gear_config, sizeof(gear_config));
  276. crc0 = crc16_get((u8 *)&gear_config, sizeof(gear_config) - 2);
  277. if (crc0 != gear_config.crc16) {
  278. sys_debug("default gear\n");
  279. nv_default_gear_config();
  280. nv_save_gear_configs();
  281. return;
  282. }
  283. fmc_write_data(gear_config_idx_0, (u8 *)&gear_config, sizeof(gear_config));
  284. }else {
  285. fmc_read_data(gear_config_idx_1, (u8 *)&gear_config, sizeof(gear_config));
  286. crc0 = crc16_get((u8 *)&gear_config, sizeof(gear_config) - 2);
  287. if (crc0 != gear_config.crc16) {
  288. sys_debug("gear 1 error\n");
  289. fmc_read_data(gear_config_idx_0, (u8 *)&gear_config, sizeof(gear_config));
  290. fmc_write_data(gear_config_idx_1, (u8 *)&gear_config, sizeof(gear_config));
  291. }
  292. }
  293. }
  294. #if 0
  295. bool nv_set_gear_config(u8 mode4896, u8 gear, u16 rpm, u16 torque, u16 idc, u16 acc) {
  296. mc_gear_t *gear_cfg;
  297. if (gear >= CONFIG_MAX_GEAR_NUM) {
  298. return false;
  299. }
  300. if (mode4896 == 0) { //48vmode
  301. gear_cfg = &gear_config.gears_48[gear];
  302. }else {
  303. gear_cfg = &gear_config.gears_96[gear];
  304. }
  305. gear_cfg->u_maxRPM = rpm;
  306. gear_cfg->u_maxTorque = torque;
  307. gear_cfg->u_maxIdc = idc;
  308. gear_cfg->u_accTime = acc;
  309. nv_save_gear_configs();
  310. return true;
  311. }
  312. bool nv_get_gear_config(u8 mode4896, u8 gear, u16 *rpm, u16 *torque, u16 *idc, u16 *acc) {
  313. mc_gear_t *gear_cfg;
  314. if (gear >= CONFIG_MAX_GEAR_NUM) {
  315. return false;
  316. }
  317. if (mode4896 == 0) { //48vmode
  318. gear_cfg = &gear_config.gears_48[gear];
  319. }else {
  320. gear_cfg = &gear_config.gears_96[gear];
  321. }
  322. *rpm = gear_cfg->u_maxRPM;
  323. *torque = gear_cfg->u_maxTorque;
  324. *idc = gear_cfg->u_maxIdc;
  325. *acc = gear_cfg->u_accTime;
  326. return true;
  327. }
  328. #endif
  329. bool nv_set_gear_config(u8 mode96, u8 *config, int len) {
  330. int config_len = sizeof(mc_gear_t) * CONFIG_MAX_GEAR_NUM;
  331. if (len < config_len) {
  332. return false;
  333. }
  334. if (mode96) {
  335. memcpy(&gear_config.gears_96[0], config, len);
  336. }else {
  337. memcpy(&gear_config.gears_48[0], config, len);
  338. }
  339. for (int i = 0; i < CONFIG_MAX_GEAR_NUM; i++) {
  340. if (gear_config.gears_48[i].n_max_speed > CONFIG_MAX_MOT_RPM) {
  341. gear_config.gears_48[i].n_max_speed = CONFIG_MAX_MOT_RPM;
  342. }
  343. if (gear_config.gears_48[i].n_max_trq > CONFIG_MAX_TORQUE) {
  344. gear_config.gears_48[i].n_max_trq = CONFIG_MAX_TORQUE;
  345. }
  346. if (gear_config.gears_48[i].n_max_idc > CONFIG_MAX_VBUS_CURRENT) {
  347. gear_config.gears_48[i].n_max_idc = CONFIG_MAX_VBUS_CURRENT;
  348. }
  349. if (gear_config.gears_48[i].n_zero_accl == 0) {
  350. gear_config.gears_48[i].n_zero_accl = 100;
  351. }
  352. if (gear_config.gears_48[i].n_accl_time == 0) {
  353. gear_config.gears_48[i].n_accl_time = 1;
  354. }
  355. if (gear_config.gears_96[i].n_max_speed > CONFIG_MAX_MOT_RPM) {
  356. gear_config.gears_96[i].n_max_speed = CONFIG_MAX_MOT_RPM;
  357. }
  358. if (gear_config.gears_96[i].n_max_trq > CONFIG_MAX_TORQUE) {
  359. gear_config.gears_96[i].n_max_trq = CONFIG_MAX_TORQUE;
  360. }
  361. if (gear_config.gears_96[i].n_max_idc > CONFIG_MAX_VBUS_CURRENT) {
  362. gear_config.gears_96[i].n_max_idc = CONFIG_MAX_VBUS_CURRENT;
  363. }
  364. if (gear_config.gears_96[i].n_zero_accl == 0) {
  365. gear_config.gears_96[i].n_zero_accl = 100;
  366. }
  367. if (gear_config.gears_96[i].n_accl_time == 0) {
  368. gear_config.gears_96[i].n_accl_time = 1;
  369. }
  370. for (int j = 0; j < GEAR_SPEED_TRQ_NUM; j++) {
  371. if (gear_config.gears_48[i].n_torque[j] > 100) {
  372. gear_config.gears_48[i].n_torque[j] = 100;
  373. }
  374. if (gear_config.gears_96[i].n_torque[j] > 100) {
  375. gear_config.gears_96[i].n_torque[j] = 100;
  376. }
  377. }
  378. }
  379. nv_save_gear_configs();
  380. return true;
  381. }
  382. void* nv_get_gear_config(u8 mode96, int *len) {
  383. if (len) {
  384. *len = sizeof(mc_gear_t) * CONFIG_MAX_GEAR_NUM;
  385. }
  386. sys_debug("gear0 %d %d\n", mode96, gear_config.gears_96[0].n_max_speed);
  387. if (mode96) {
  388. return &gear_config.gears_96[0];
  389. }else {
  390. return &gear_config.gears_48[0];
  391. }
  392. }
  393. void nv_set_pid(u8 id, pid_conf_t *pid) {
  394. foc_params.pid_conf[id] = *pid;
  395. nv_save_foc_params();
  396. }
  397. void nv_get_pid(u8 id, pid_conf_t *pid) {
  398. *pid = foc_params.pid_conf[id];
  399. }
  400. void nv_set_hwbrake_mode(u8 mode) {
  401. foc_params.n_brkShutPower = mode;
  402. }
  403. void nv_set_throttle_vol(float min, float max) {
  404. foc_params.n_startThroVol = min;
  405. foc_params.n_endThroVol = max;
  406. }
  407. int nv_write_sn(u8 *data, int len) {
  408. mc_sn_t sn;
  409. memset(&sn, 0, sizeof(sn));
  410. len = min(32, len);
  411. memcpy(sn.sn, data, len);
  412. sn.len = len;
  413. sn.crc = crc16_get(data, len);
  414. fmc_write_data(sn_page_index, (u8 *)&sn, sizeof(sn));
  415. fmc_write_data(sn_idx_back, (u8 *)&sn, sizeof(sn));
  416. return len;
  417. }
  418. int nv_read_sn(u8 *data, int len) {
  419. mc_sn_t *sn;
  420. memset(&sn, 0, sizeof(sn));
  421. len = min(ARRAY_SIZE(sn->sn), len);
  422. sn = (mc_sn_t *)fmc_get_addr(sn_page_index);
  423. u16 crc16 = crc16_get(sn->sn, min(32, sn->len));
  424. if (crc16 == sn->crc) {
  425. memcpy(data, sn->sn, len);
  426. return len;
  427. }
  428. sn = (mc_sn_t *)fmc_get_addr(sn_idx_back);
  429. crc16 = crc16_get(sn->sn, min(32, sn->len));
  430. if (crc16 == sn->crc) {
  431. memcpy(data, sn->sn, len);
  432. return len;
  433. }
  434. return 0;
  435. }
  436. static int _mc_err_r_id = mc_err_red_idx_0;
  437. static u8 _mc_err_r_idx = 0;
  438. static void mc_err_block_init(void) {
  439. mc_err_red_t me0, me1;
  440. fmc_read_data(mc_err_red_idx_0, (u8 *)&me0, sizeof(mc_err_red_t));
  441. if (me0.len > (one_page_size - sizeof(mc_err_red_t))) {
  442. return;
  443. }
  444. fmc_read_data(mc_err_red_idx_1, (u8 *)&me1, sizeof(mc_err_red_t));
  445. if (me1.len > (one_page_size - sizeof(mc_err_red_t))) {
  446. return;
  447. }
  448. if (me0.index > me1.index) {
  449. if (me0.index == 255 && me1.index == 0) {
  450. _mc_err_r_id = mc_err_red_idx_0;
  451. _mc_err_r_idx = 1;
  452. }else {
  453. _mc_err_r_id = mc_err_red_idx_1;
  454. _mc_err_r_idx = (me0.index + 1) % 255;
  455. }
  456. }else {
  457. if (me0.index == 0 && me1.index == 255) {
  458. _mc_err_r_id = mc_err_red_idx_1;
  459. _mc_err_r_idx = 1;
  460. }else {
  461. _mc_err_r_id = mc_err_red_idx_0;
  462. _mc_err_r_idx = (me1.index + 1) % 255;
  463. }
  464. }
  465. }
  466. void mc_err_block_write(u32 err_mask, u8 *data, int len) {
  467. mc_err_red_t me;
  468. me.index = _mc_err_r_idx;
  469. me.len = (u16)len;
  470. if (me.len > (one_page_size - sizeof(mc_err_red_t))) {
  471. return;
  472. }
  473. me.err_mask = err_mask;
  474. me.crc = crc16_get(data, me.len);
  475. fmc_write_data(_mc_err_r_id, data, len);
  476. _mc_err_r_idx = (me.index + 1) % 255;
  477. if (_mc_err_r_id == mc_err_red_idx_0) {
  478. _mc_err_r_id = mc_err_red_idx_1;
  479. }else {
  480. _mc_err_r_id = mc_err_red_idx_0;
  481. }
  482. }
  483. int mc_error_block_read(int block, u32 *err_mask, u8 *data, int len) {
  484. mc_err_red_t me;
  485. int index = block?mc_err_red_idx_1:mc_err_red_idx_0;
  486. fmc_read_data(index, (u8 *)&me, sizeof(mc_err_red_t));
  487. fmc_read_data_with_offset(index, sizeof(mc_err_red_t), data, len);
  488. if (me.crc != crc16_get(data, len)) {
  489. return -1;
  490. }
  491. if (err_mask) {
  492. *err_mask = me.err_mask;
  493. }
  494. return me.index;
  495. }
  496. int mc_error_curr_block_read(u32 *err_mask, u8 *data, int len) {
  497. int idx0 = mc_error_block_read(0, err_mask, data, len);
  498. int idx1 = mc_error_block_read(1, err_mask, data, len);
  499. if (idx0 == -1 && idx1 == -1) {
  500. return -1;
  501. }
  502. if (idx0 == -1) {
  503. return idx1;
  504. }
  505. if (idx1 == -1) {
  506. return mc_error_block_read(0, err_mask, data, len);
  507. }
  508. if (idx0 == 255 && idx1 == 0) {
  509. return idx1;
  510. }
  511. if (idx0 == 0 && idx1 == 255) {
  512. return mc_error_block_read(0, err_mask, data, len);
  513. }
  514. if (idx0 > idx1) {
  515. return mc_error_block_read(0, err_mask, data, len);
  516. }
  517. return idx1;
  518. }
  519. void nv_storage_init(void) {
  520. nv_read_motor_params();
  521. nv_read_foc_params();
  522. nv_read_gear_configs();
  523. nv_read_limit_config();
  524. sys_debug("encoder_off = %f\n", m_params.offset);
  525. if (m_params.mot_nr != MOTOR_NR) {
  526. nv_default_motor_params();
  527. nv_default_foc_params();
  528. nv_save_foc_params();
  529. nv_save_motor_params();
  530. nv_default_gear_config();
  531. nv_save_gear_configs();
  532. nv_default_limter();
  533. nv_save_limit_config();
  534. sys_debug("change motor %x\n", m_params.mot_nr);
  535. }
  536. #if CONFIG_MOT_TYPE==MOTOR_BLUESHARK_NEW1
  537. m_params.offset = 0.0f; //编码器做了零位置校准
  538. #endif
  539. #if CONFIG_MOT_TYPE==MOTOR_BLUESHARK_ZD_100
  540. m_params.offset = 0.0f; //编码器做了零位置校准
  541. m_params.est_pll_band = 200;
  542. #endif
  543. #if CONFIG_MOT_TYPE==MOTOR_BLUESHARK_A1
  544. m_params.offset = 0.0f; //编码器做了零位置校准
  545. #endif
  546. mc_err_block_init();
  547. sys_debug("%f -- %f, flux: %f, %d\n", foc_params.n_currentBand, m_params.ld, m_params.flux_linkage, sizeof(m_params));
  548. sys_debug("mc err %d, %d\n", _mc_err_r_id, _mc_err_r_idx);
  549. }