nv_storage.c 15 KB

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