nv_storage.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. static motor_params_t m_params;
  6. static foc_params_t foc_params;
  7. motor_params_t *nv_get_motor_params(void) {
  8. return &m_params;
  9. }
  10. foc_params_t *nv_get_foc_params(void) {
  11. return &foc_params;
  12. }
  13. void nv_save_hall_table(s32 *hall_table) {
  14. memcpy((char *)m_params.hall_table, (char *)hall_table, sizeof(m_params.hall_table));
  15. nv_save_motor_params();
  16. }
  17. void nv_save_hall_offset(s16 offset) {
  18. m_params.hall_offset = offset;
  19. nv_save_motor_params();
  20. }
  21. static void nv_default_motor_params(void) {
  22. m_params.poles = MOTOR_POLES;
  23. m_params.r = MOTOR_R;
  24. m_params.ld = MOTOR_Ld;
  25. m_params.lq = MOTOR_Lq;
  26. m_params.encoder_cpr = 4096;
  27. m_params.est_pll_band = 200;
  28. m_params.flux_linkage = 0.0f;
  29. m_params.hall_offset = 0;
  30. }
  31. static void nv_default_foc_params(void) {
  32. foc_params.s_maxvDC = 16;
  33. foc_params.s_maxiDC = 10;
  34. foc_params.s_maxIdq = 20;
  35. foc_params.s_minIdq = -20;
  36. foc_params.s_maxRPM = 8200;
  37. foc_params.s_maxTorque = 15;
  38. foc_params.n_currentBand = 500;
  39. foc_params.n_modulation = 1.0f;
  40. foc_params.n_PhaseFilterCeof = 0.2f;
  41. foc_params.spd_kp = 0.001f;
  42. foc_params.spd_ki = 0.01;
  43. foc_params.trq_kp = 0.001f;
  44. foc_params.trq_ki = 0.01;
  45. foc_params.fw_kp = 0.1f;
  46. foc_params.fw_ki = 0.01;
  47. foc_params.fw_baseSpd = 5000;
  48. }
  49. void nv_save_motor_params(void) {
  50. u16 crc = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  51. m_params.crc16 = crc;
  52. fmc_write_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  53. fmc_write_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  54. }
  55. void nv_read_motor_params(void) {
  56. fmc_read_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  57. u16 crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  58. if (crc0 != m_params.crc16) {
  59. fmc_read_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  60. crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  61. if (crc0 != m_params.crc16) {
  62. nv_default_motor_params();
  63. nv_save_motor_params();
  64. return;
  65. }
  66. fmc_write_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  67. }else {
  68. fmc_write_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  69. }
  70. }
  71. void nv_save_foc_params(void) {
  72. u16 crc = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  73. foc_params.crc16 = crc;
  74. fmc_write_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  75. fmc_write_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  76. }
  77. void nv_read_foc_params(void) {
  78. fmc_read_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  79. u16 crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  80. if (crc0 != foc_params.crc16) {
  81. fmc_read_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  82. crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  83. if (crc0 != foc_params.crc16) {
  84. nv_default_foc_params();
  85. nv_save_foc_params();
  86. return;
  87. }
  88. fmc_write_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  89. }else {
  90. fmc_write_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  91. }
  92. }
  93. void nv_storage_init(void) {
  94. nv_read_motor_params();
  95. nv_read_foc_params();
  96. }