nv_storage.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #include "app/nv_storage.h"
  2. #include "bsp/fmc_flash.h"
  3. #include "libs/crc16.h"
  4. #include "foc/motor/motor_param.h"
  5. #include "foc/foc_config.h"
  6. static motor_params_t m_params;
  7. static foc_params_t foc_params;
  8. motor_params_t *nv_get_motor_params(void) {
  9. return &m_params;
  10. }
  11. foc_params_t *nv_get_foc_params(void) {
  12. return &foc_params;
  13. }
  14. void nv_save_hall_table(s32 *hall_table) {
  15. memcpy((char *)m_params.hall_table, (char *)hall_table, sizeof(m_params.hall_table));
  16. nv_save_motor_params();
  17. }
  18. void nv_save_angle_offset(float offset) {
  19. m_params.offset = offset;
  20. nv_save_motor_params();
  21. }
  22. static void nv_default_motor_params(void) {
  23. m_params.poles = MOTOR_POLES;
  24. m_params.r = MOTOR_R;
  25. m_params.ld = MOTOR_Ld;
  26. m_params.lq = MOTOR_Lq;
  27. m_params.offset = (69.0f);
  28. //m_params.offset = (360-128);
  29. m_params.est_pll_band = 100;
  30. m_params.pos_lock_pll_band = 100;
  31. m_params.flux_linkage = 0.0f;
  32. }
  33. static void nv_default_foc_params(void) {
  34. foc_params.s_maxvDC = 48;
  35. foc_params.s_maxiDC = 30;
  36. //foc_params.s_maxIdq = 200;
  37. //foc_params.s_minIdq = -200;
  38. foc_params.s_PhaseCurrLim = 180;
  39. foc_params.s_maxRPM = 8000;
  40. foc_params.s_maxEpmRPM = 133;
  41. foc_params.s_maxTorque = 50;
  42. foc_params.s_PhaseCurreBrkLim = 0.0f;
  43. foc_params.n_currentBand = 500;
  44. foc_params.n_modulation = 1.0f;
  45. foc_params.n_PhaseFilterCeof = 0.2f;
  46. foc_params.n_brkShutPower = 1;
  47. foc_params.s_LimitiDC = 200.0f;
  48. foc_params.s_iDCeBrkLim = 15.0f;
  49. foc_params.pid_conf[PID_D_id].kp = (CONFIG_CURRENT_BANDWITH * MOTOR_Ld);
  50. foc_params.pid_conf[PID_D_id].ki = (MOTOR_R/MOTOR_Ld);
  51. foc_params.pid_conf[PID_D_id].kb = 0;
  52. foc_params.pid_conf[PID_Q_id].kp = (CONFIG_CURRENT_BANDWITH * MOTOR_Lq);
  53. foc_params.pid_conf[PID_Q_id].ki = (MOTOR_R/MOTOR_Lq);
  54. foc_params.pid_conf[PID_Q_id].kb = 0;
  55. foc_params.pid_conf[PID_TRQ_id].kp = 0.1f;
  56. foc_params.pid_conf[PID_TRQ_id].ki = 0.5f;
  57. foc_params.pid_conf[PID_TRQ_id].kb = 1.0f;
  58. foc_params.pid_conf[PID_Spd_id].kp = 0.05f;
  59. foc_params.pid_conf[PID_Spd_id].ki = 0.15f;
  60. foc_params.pid_conf[PID_Spd_id].kb = 1.2f;
  61. foc_params.pid_conf[PID_Pow_id].kp = 0.5f;
  62. foc_params.pid_conf[PID_Pow_id].ki = 100.0f;
  63. foc_params.pid_conf[PID_Pow_id].kb = 0;
  64. foc_params.pid_conf[PID_Lock_id].kp = (0.1f);
  65. foc_params.pid_conf[PID_Lock_id].ki = (0.5f);
  66. foc_params.pid_conf[PID_Lock_id].kb = 0;
  67. }
  68. void nv_save_motor_params(void) {
  69. u16 crc = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  70. m_params.crc16 = crc;
  71. fmc_write_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  72. fmc_write_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  73. }
  74. void nv_read_motor_params(void) {
  75. fmc_read_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  76. u16 crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  77. if (crc0 != m_params.crc16) {
  78. fmc_read_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  79. crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  80. if (crc0 != m_params.crc16) {
  81. nv_default_motor_params();
  82. nv_save_motor_params();
  83. return;
  84. }
  85. fmc_write_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  86. }else {
  87. fmc_write_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  88. }
  89. }
  90. void nv_save_foc_params(void) {
  91. u16 crc = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  92. foc_params.crc16 = crc;
  93. fmc_write_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  94. fmc_write_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  95. }
  96. void nv_read_foc_params(void) {
  97. fmc_read_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  98. u16 crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  99. if (crc0 != foc_params.crc16) {
  100. fmc_read_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  101. crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  102. if (crc0 != foc_params.crc16) {
  103. nv_default_foc_params();
  104. nv_save_foc_params();
  105. return;
  106. }
  107. fmc_write_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  108. }else {
  109. fmc_write_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  110. }
  111. }
  112. void nv_set_pid(u8 id, pid_conf_t *pid) {
  113. foc_params.pid_conf[id] = *pid;
  114. }
  115. void nv_get_pid(u8 id, pid_conf_t *pid) {
  116. *pid = foc_params.pid_conf[id];
  117. }
  118. void nv_set_hwbrake_mode(u8 mode) {
  119. foc_params.n_brkShutPower = mode;
  120. }
  121. void nv_set_throttle_vol(float min, float max) {
  122. foc_params.n_minThroVol = min;
  123. foc_params.n_maxThroVol = max;
  124. }
  125. void nv_set_ebrake_current(float phase_curr, float dc_curr) {
  126. foc_params.s_PhaseCurreBrkLim = phase_curr;
  127. foc_params.s_iDCeBrkLim = dc_curr;
  128. }
  129. void nv_storage_init(void) {
  130. nv_read_motor_params();
  131. nv_read_foc_params();
  132. nv_default_motor_params();
  133. nv_default_foc_params();
  134. }