nv_storage.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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. motor_params_t *nv_get_motor_params(void) {
  10. return &m_params;
  11. }
  12. foc_params_t *nv_get_foc_params(void) {
  13. return &foc_params;
  14. }
  15. void nv_save_hall_table(s32 *hall_table) {
  16. memcpy((char *)m_params.hall_table, (char *)hall_table, sizeof(m_params.hall_table));
  17. nv_save_motor_params();
  18. }
  19. void nv_save_angle_offset(float offset) {
  20. m_params.offset = offset;
  21. nv_save_motor_params();
  22. }
  23. static void nv_default_motor_params(void) {
  24. m_params.mot_nr = MOTOR_NR;
  25. m_params.poles = MOTOR_POLES;
  26. m_params.r = MOTOR_R;
  27. m_params.ld = MOTOR_Ld;
  28. m_params.lq = MOTOR_Lq;
  29. m_params.offset = MOTOR_ENC_OFFSET;//180;//(69.0f);
  30. m_params.est_pll_band = 100;
  31. m_params.pos_lock_pll_band = 500;
  32. m_params.flux_linkage = 0.0f;
  33. }
  34. static void nv_default_foc_params(void) {
  35. foc_params.s_maxDCVol = CONFIG_RATED_DC_VOL;
  36. foc_params.s_minDCVol = CONFIG_MIN_DC_VOL;
  37. foc_params.s_PhaseCurrLim = CONFIG_DEFAULT_PHASE_CURR_LIM;
  38. foc_params.s_maxRPM = CONFIG_DEFAULT_RPM_LIM;
  39. foc_params.s_maxEpmRPM = CONFIG_DEFAULT_EPM_RPM;
  40. foc_params.s_maxEpmPhaseCurrLim = CONFIG_DEFAULT_EPM_PHASE_CURR;
  41. foc_params.s_maxTorque = foc_params.s_PhaseCurrLim;
  42. foc_params.s_PhaseCurreBrkLim = CONFIG_DEFAULT_EBRK_PHASE_CURR;
  43. foc_params.n_currentBand = CONFIG_CURRENT_BANDWITH;
  44. foc_params.n_brkShutPower = CONFIG_BRK_SHUT_POWER_ENABLE;
  45. foc_params.s_LimitiDC = CONFIG_DEFAULT_IDC_LIM;
  46. foc_params.s_iDCeBrkLim = CONFIG_DEFAULT_EBRK_IDC_LIM;
  47. foc_params.n_minThroVol = CONFIG_THROTTLE_LOW_VALUE;
  48. foc_params.n_maxThroVol = CONFIG_THROTTLE_MAX_VALUE;
  49. foc_params.n_autoHold = CONFIG_AUTOHOLD_ENABLE;
  50. foc_params.n_acc_time = CONFIG_ACC_TIME;
  51. foc_params.n_dec_time = CONFIG_DEC_TIME;
  52. foc_params.n_ebrk_time = CONFIG_EBRK_RAMP_TIME;
  53. foc_params.pid_conf[PID_D_id].kp = (CONFIG_CURRENT_BANDWITH * MOTOR_Ld);
  54. foc_params.pid_conf[PID_D_id].ki = (MOTOR_R/MOTOR_Ld);
  55. foc_params.pid_conf[PID_D_id].kb = 0;
  56. foc_params.pid_conf[PID_Q_id].kp = (CONFIG_CURRENT_BANDWITH * MOTOR_Lq);
  57. foc_params.pid_conf[PID_Q_id].ki = (MOTOR_R/MOTOR_Lq);
  58. foc_params.pid_conf[PID_Q_id].kb = 0;
  59. foc_params.pid_conf[PID_TRQ_id].kp = 0.07f;
  60. foc_params.pid_conf[PID_TRQ_id].ki = 0.2f;
  61. foc_params.pid_conf[PID_TRQ_id].kb = 1.0f;
  62. foc_params.pid_conf[PID_Spd_id].kp = 0.13f;
  63. foc_params.pid_conf[PID_Spd_id].ki = 0.08f;
  64. foc_params.pid_conf[PID_Spd_id].kb = 1.0f;
  65. foc_params.pid_conf[PID_Pow_id].kp = 0.6f;
  66. foc_params.pid_conf[PID_Pow_id].ki = 4.0f;
  67. foc_params.pid_conf[PID_Pow_id].kb = 0;
  68. foc_params.pid_conf[PID_Lock_id].kp = (0.01f);
  69. foc_params.pid_conf[PID_Lock_id].ki = (0.20f);
  70. foc_params.pid_conf[PID_Lock_id].kb = 0;
  71. }
  72. void nv_save_motor_params(void) {
  73. u16 crc = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  74. m_params.crc16 = crc;
  75. fmc_write_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  76. fmc_write_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  77. }
  78. void nv_read_motor_params(void) {
  79. fmc_read_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  80. u16 crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  81. if (crc0 != m_params.crc16) {
  82. sys_debug("mp 0 error\n");
  83. fmc_read_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  84. crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  85. if (crc0 != m_params.crc16) {
  86. nv_default_motor_params();
  87. nv_save_motor_params();
  88. return;
  89. }
  90. fmc_write_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  91. }else {
  92. fmc_read_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  93. crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  94. if (crc0 != m_params.crc16) {
  95. sys_debug("mp 1 error\n");
  96. fmc_read_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  97. fmc_write_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  98. }
  99. }
  100. }
  101. void nv_save_foc_params(void) {
  102. u16 crc = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  103. foc_params.crc16 = crc;
  104. fmc_write_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  105. fmc_write_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  106. }
  107. void nv_read_foc_params(void) {
  108. fmc_read_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  109. u16 crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  110. if (crc0 != foc_params.crc16) {
  111. sys_debug("fp 0 error\n");
  112. fmc_read_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  113. crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  114. if (crc0 != foc_params.crc16) {
  115. nv_default_foc_params();
  116. nv_save_foc_params();
  117. return;
  118. }
  119. fmc_write_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  120. }else {
  121. fmc_read_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  122. crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  123. if (crc0 != foc_params.crc16) {
  124. sys_debug("fp 1 error\n");
  125. fmc_read_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  126. fmc_write_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  127. }
  128. }
  129. foc_params.s_maxTorque = foc_params.s_PhaseCurrLim;//overwrite
  130. }
  131. void nv_set_pid(u8 id, pid_conf_t *pid) {
  132. foc_params.pid_conf[id] = *pid;
  133. nv_save_foc_params();
  134. }
  135. void nv_get_pid(u8 id, pid_conf_t *pid) {
  136. *pid = foc_params.pid_conf[id];
  137. }
  138. void nv_set_hwbrake_mode(u8 mode) {
  139. foc_params.n_brkShutPower = mode;
  140. }
  141. void nv_set_throttle_vol(float min, float max) {
  142. foc_params.n_minThroVol = min;
  143. foc_params.n_maxThroVol = max;
  144. }
  145. void nv_set_ebrake_current(float phase_curr, float dc_curr) {
  146. foc_params.s_PhaseCurreBrkLim = phase_curr;
  147. foc_params.s_iDCeBrkLim = dc_curr;
  148. }
  149. torque_lut_t *nv_get_trq_tlb(void) {
  150. torque_lut_t *tbl = (torque_lut_t *)fmc_get_addr(trq_Tbl_idx);
  151. if (tbl->magic != 0x5AA5) {
  152. sys_error("trq tlb magic error, 0x%x\n", tbl->magic);
  153. return NULL;
  154. }
  155. u16 crc = crc16_get((u8 *)tbl, sizeof(torque_lut_t) - 2);
  156. if (crc != tbl->crc16) {
  157. sys_error("trq tlb crc16 error\n");
  158. return NULL;
  159. }
  160. return tbl;
  161. }
  162. void nv_storage_init(void) {
  163. nv_read_motor_params();
  164. nv_read_foc_params();
  165. sys_debug("encoder_off = %f\n", m_params.offset);
  166. if (m_params.mot_nr != MOTOR_NR) {
  167. nv_default_motor_params();
  168. nv_default_foc_params();
  169. nv_save_foc_params();
  170. nv_save_motor_params();
  171. }
  172. }