#include "app/nv_storage.h" #include "bsp/fmc_flash.h" #include "libs/crc16.h" #include "libs/logger.h" #include "foc/motor/motor_param.h" #include "foc/foc_config.h" static motor_params_t m_params; static foc_params_t foc_params; motor_params_t *nv_get_motor_params(void) { return &m_params; } foc_params_t *nv_get_foc_params(void) { return &foc_params; } void nv_save_hall_table(s32 *hall_table) { memcpy((char *)m_params.hall_table, (char *)hall_table, sizeof(m_params.hall_table)); nv_save_motor_params(); } void nv_save_angle_offset(float offset) { m_params.offset = offset; nv_save_motor_params(); } static void nv_default_motor_params(void) { m_params.poles = MOTOR_POLES; m_params.r = MOTOR_R; m_params.ld = MOTOR_Ld; m_params.lq = MOTOR_Lq; m_params.offset = MOTOR_ENC_OFFSET;//180;//(69.0f); //m_params.offset = (360-128); m_params.est_pll_band = 100; m_params.pos_lock_pll_band = 100; m_params.flux_linkage = 0.0f; } static void nv_default_foc_params(void) { foc_params.s_maxDCVol = CONFIG_RATED_DC_VOL; foc_params.s_minDCVol = CONFIG_MIN_DC_VOL; foc_params.s_PhaseCurrLim = CONFIG_DEFAULT_PHASE_CURR_LIM; foc_params.s_maxRPM = CONFIG_DEFAULT_RPM_LIM; foc_params.s_maxEpmRPM = CONFIG_DEFAULT_EPM_RPM; foc_params.s_maxEpmPhaseCurrLim = CONFIG_DEFAULT_EPM_PHASE_CURR; foc_params.s_maxTorque = foc_params.s_PhaseCurrLim; foc_params.s_PhaseCurreBrkLim = CONFIG_DEFAULT_EBRK_PHASE_CURR; foc_params.n_currentBand = CONFIG_CURRENT_BANDWITH; foc_params.n_modulation = CONFIG_SVM_MODULATION; foc_params.n_PhaseFilterCeof = CONFIG_CURR_LP_PARAM; foc_params.n_brkShutPower = CONFIG_BRK_SHUT_POWER_ENABLE; foc_params.s_LimitiDC = CONFIG_DEFAULT_IDC_LIM; foc_params.s_iDCeBrkLim = CONFIG_DEFAULT_EBRK_IDC_LIM; foc_params.n_minThroVol = CONFIG_THROTTLE_LOW_VALUE; foc_params.n_maxThroVol = CONFIG_THROTTLE_MAX_VALUE; foc_params.pid_conf[PID_D_id].kp = (CONFIG_CURRENT_BANDWITH * MOTOR_Ld); foc_params.pid_conf[PID_D_id].ki = (MOTOR_R/MOTOR_Ld); foc_params.pid_conf[PID_D_id].kb = 0; foc_params.pid_conf[PID_Q_id].kp = (CONFIG_CURRENT_BANDWITH * MOTOR_Lq); foc_params.pid_conf[PID_Q_id].ki = (MOTOR_R/MOTOR_Lq); foc_params.pid_conf[PID_Q_id].kb = 0; foc_params.pid_conf[PID_TRQ_id].kp = 0.15f; foc_params.pid_conf[PID_TRQ_id].ki = 0.14f; foc_params.pid_conf[PID_TRQ_id].kb = 1.0f; foc_params.pid_conf[PID_Spd_id].kp = 0.13f; foc_params.pid_conf[PID_Spd_id].ki = 0.08f; foc_params.pid_conf[PID_Spd_id].kb = 1.0f; foc_params.pid_conf[PID_Pow_id].kp = 0.6f; foc_params.pid_conf[PID_Pow_id].ki = 4.0f; foc_params.pid_conf[PID_Pow_id].kb = 0; foc_params.pid_conf[PID_Lock_id].kp = (0.1f); foc_params.pid_conf[PID_Lock_id].ki = (0.5f); foc_params.pid_conf[PID_Lock_id].kb = 0; } void nv_save_motor_params(void) { u16 crc = crc16_get((u8 *)&m_params, sizeof(m_params) - 2); m_params.crc16 = crc; fmc_write_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params)); fmc_write_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params)); } void nv_read_motor_params(void) { fmc_read_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params)); u16 crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2); if (crc0 != m_params.crc16) { sys_debug("mp 0 error\n"); fmc_read_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params)); crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2); if (crc0 != m_params.crc16) { nv_default_motor_params(); nv_save_motor_params(); return; } fmc_write_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params)); }else { fmc_read_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params)); crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2); if (crc0 != m_params.crc16) { sys_debug("mp 1 error\n"); fmc_read_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params)); fmc_write_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params)); } } } void nv_save_foc_params(void) { u16 crc = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2); foc_params.crc16 = crc; fmc_write_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params)); fmc_write_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params)); } void nv_read_foc_params(void) { fmc_read_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params)); u16 crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2); if (crc0 != foc_params.crc16) { sys_debug("fp 0 error\n"); fmc_read_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params)); crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2); if (crc0 != foc_params.crc16) { nv_default_foc_params(); nv_save_foc_params(); return; } fmc_write_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params)); }else { fmc_read_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params)); crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2); if (crc0 != foc_params.crc16) { sys_debug("fp 1 error\n"); fmc_read_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params)); fmc_write_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params)); } } } void nv_set_pid(u8 id, pid_conf_t *pid) { foc_params.pid_conf[id] = *pid; nv_save_foc_params(); } void nv_get_pid(u8 id, pid_conf_t *pid) { *pid = foc_params.pid_conf[id]; } void nv_set_hwbrake_mode(u8 mode) { foc_params.n_brkShutPower = mode; } void nv_set_throttle_vol(float min, float max) { foc_params.n_minThroVol = min; foc_params.n_maxThroVol = max; } void nv_set_ebrake_current(float phase_curr, float dc_curr) { foc_params.s_PhaseCurreBrkLim = phase_curr; foc_params.s_iDCeBrkLim = dc_curr; } torque_lut_t *nv_get_trq_tlb(void) { torque_lut_t *tbl = (torque_lut_t *)fmc_get_addr(trq_Tbl_idx); if (tbl->magic != 0x5AA5) { sys_error("trq tlb magic error, 0x%x\n", tbl->magic); return NULL; } u16 crc = crc16_get((u8 *)tbl, sizeof(torque_lut_t) - 2); if (crc != tbl->crc16) { sys_error("trq tlb crc16 error\n"); return NULL; } return tbl; } void nv_storage_init(void) { nv_read_motor_params(); nv_read_foc_params(); sys_debug("encoder_off = %f\n", m_params.offset); nv_default_motor_params(); nv_default_foc_params(); nv_save_foc_params(); nv_save_motor_params(); }