|
|
@@ -9,7 +9,6 @@ static motor_params_t m_params;
|
|
|
static foc_params_t foc_params;
|
|
|
static mc_gear_config_t gear_config;
|
|
|
static mc_limit_t limiter;
|
|
|
-static int _write_position = 0;
|
|
|
#define NV_MAGIC 0x5AA5
|
|
|
|
|
|
motor_params_t *nv_get_motor_params(void) {
|
|
|
@@ -54,21 +53,21 @@ static void nv_default_limter(void) {
|
|
|
limiter.motor[0].enter_pointer = 120;
|
|
|
limiter.motor[0].exit_pointer = 110;
|
|
|
limiter.motor[0].limit_value = 0;
|
|
|
- limiter.motor[1].enter_pointer = 107;
|
|
|
+ limiter.motor[1].enter_pointer = 110;
|
|
|
limiter.motor[1].exit_pointer = 97;
|
|
|
limiter.motor[1].limit_value = CONFIG_MAX_MOTOR_TORQUE/3;
|
|
|
- limiter.motor[2].enter_pointer = 94;
|
|
|
+ limiter.motor[2].enter_pointer = 97;
|
|
|
limiter.motor[2].exit_pointer = 85;
|
|
|
limiter.motor[2].limit_value = CONFIG_MAX_MOTOR_TORQUE*2/3;
|
|
|
|
|
|
limiter.mos[0].enter_pointer = 110;
|
|
|
limiter.mos[0].exit_pointer = 100;
|
|
|
limiter.mos[0].limit_value = 0;
|
|
|
- limiter.mos[1].enter_pointer = 97;
|
|
|
- limiter.mos[1].exit_pointer = 87;
|
|
|
+ limiter.mos[1].enter_pointer = 100;
|
|
|
+ limiter.mos[1].exit_pointer = 90;
|
|
|
limiter.mos[1].limit_value = CONFIG_MAX_MOTOR_TORQUE/3;
|
|
|
- limiter.mos[2].enter_pointer = 84;
|
|
|
- limiter.mos[2].exit_pointer = 78;
|
|
|
+ limiter.mos[2].enter_pointer = 90;
|
|
|
+ limiter.mos[2].exit_pointer = 80;
|
|
|
limiter.mos[2].limit_value = CONFIG_MAX_MOTOR_TORQUE*2/3;
|
|
|
|
|
|
limiter.vbus.enter_pointer = 76;
|
|
|
@@ -92,7 +91,6 @@ static void nv_default_foc_params(void) {
|
|
|
foc_params.n_startThroVol = CONFIG_THROTTLE_START_VALUE;
|
|
|
foc_params.n_endThroVol = CONFIG_THROTTLE_END_VALUE;
|
|
|
foc_params.n_autoHold = CONFIG_AUTOHOLD_ENABLE;
|
|
|
- foc_params.n_acc_time = CONFIG_ACC_TIME;
|
|
|
foc_params.n_dec_time = CONFIG_DEC_TIME;
|
|
|
foc_params.n_ebrk_time = CONFIG_EBRK_RAMP_TIME;
|
|
|
foc_params.n_FwEnable = CONFIG_DEFAULT_FW_ENABLE;
|
|
|
@@ -124,60 +122,26 @@ static void nv_default_foc_params(void) {
|
|
|
}
|
|
|
|
|
|
static void nv_default_gear_config(void) {
|
|
|
- /* 48v 模式 */
|
|
|
- gear_config.gears_48[0].u_maxRPM = 1430;
|
|
|
- gear_config.gears_48[0].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM * 0.5f;
|
|
|
- gear_config.gears_48[0].u_maxIdc = 25;
|
|
|
- gear_config.gears_48[0].u_accTime = 50;
|
|
|
-
|
|
|
- gear_config.gears_48[1].u_maxRPM = 2100;
|
|
|
- gear_config.gears_48[1].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM * 0.8f;
|
|
|
- gear_config.gears_48[1].u_maxIdc = 30;
|
|
|
- gear_config.gears_48[1].u_accTime = 80;
|
|
|
-
|
|
|
- gear_config.gears_48[2].u_maxRPM = 2850;
|
|
|
- gear_config.gears_48[2].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
|
|
|
- gear_config.gears_48[2].u_maxIdc = 40;
|
|
|
- gear_config.gears_48[2].u_accTime = 80;
|
|
|
-
|
|
|
- gear_config.gears_48[3].u_maxRPM = 2850;
|
|
|
- gear_config.gears_48[3].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
|
|
|
- gear_config.gears_48[3].u_maxIdc = 40;
|
|
|
- gear_config.gears_48[3].u_accTime = 80;
|
|
|
-
|
|
|
- gear_config.gears_48[4].u_maxRPM = 2850;
|
|
|
- gear_config.gears_48[4].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
|
|
|
- gear_config.gears_48[4].u_maxIdc = 40;
|
|
|
- gear_config.gears_48[4].u_accTime = 80;
|
|
|
-
|
|
|
- /* 96v 模式 */
|
|
|
- gear_config.gears_96[0].u_maxRPM = 2850;
|
|
|
- gear_config.gears_96[0].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM * 0.5f;
|
|
|
- gear_config.gears_96[0].u_maxIdc = 25;
|
|
|
- gear_config.gears_96[0].u_accTime = 50;
|
|
|
-
|
|
|
- gear_config.gears_96[1].u_maxRPM = 4300;
|
|
|
- gear_config.gears_96[1].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM * 0.8f;
|
|
|
- gear_config.gears_96[1].u_maxIdc = 30;
|
|
|
- gear_config.gears_96[1].u_accTime = 80;
|
|
|
-
|
|
|
- gear_config.gears_96[2].u_maxRPM = 5500;
|
|
|
- gear_config.gears_96[2].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
|
|
|
- gear_config.gears_96[2].u_maxIdc = 35;
|
|
|
- gear_config.gears_96[2].u_accTime = 100;
|
|
|
-
|
|
|
- gear_config.gears_96[3].u_maxRPM = 5500;
|
|
|
- gear_config.gears_96[3].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
|
|
|
- gear_config.gears_96[3].u_maxIdc = 45;
|
|
|
- gear_config.gears_96[3].u_accTime = 100;
|
|
|
-
|
|
|
- gear_config.gears_96[4].u_maxRPM = 5500;
|
|
|
- gear_config.gears_96[4].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
|
|
|
- gear_config.gears_96[4].u_maxIdc = 45;
|
|
|
- gear_config.gears_96[4].u_accTime = 100;
|
|
|
-}
|
|
|
-
|
|
|
+ for (int i = 0; i < CONFIG_MAX_GEAR_NUM; i++) {
|
|
|
+ gear_config.gears_48[i].n_max_speed = 4000;
|
|
|
+ gear_config.gears_48[i].n_max_trq = 200;
|
|
|
+ gear_config.gears_48[i].n_max_idc = 60;
|
|
|
+ gear_config.gears_48[i].n_zero_accl = 1500;
|
|
|
+ gear_config.gears_48[i].n_accl_time = 500;
|
|
|
+
|
|
|
+ gear_config.gears_96[i].n_max_speed = 8000;
|
|
|
+ gear_config.gears_96[i].n_max_trq = 400;
|
|
|
+ gear_config.gears_96[i].n_max_idc = 100;
|
|
|
+ gear_config.gears_96[i].n_zero_accl = 1500;
|
|
|
+ gear_config.gears_96[i].n_accl_time = 400;
|
|
|
+
|
|
|
+ for (int j = 0; j < GEAR_SPEED_TRQ_NUM; j++) {
|
|
|
+ gear_config.gears_48[i].n_torque[j] = 60+j;
|
|
|
+ gear_config.gears_96[i].n_torque[j] = 80+j;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+}
|
|
|
|
|
|
void nv_save_motor_params(void) {
|
|
|
u16 crc = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
|
|
|
@@ -209,9 +173,27 @@ void nv_read_motor_params(void) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+bool nv_set_limit_config(u8 *config, int len) {
|
|
|
+ int config_len = sizeof(nv_limter_t) * (2 * TEMP_LIMITER_NUM + 1);
|
|
|
+ if (len < config_len) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ memcpy(&limiter.motor[0], config, len);
|
|
|
+ sys_debug("lim %d %d %d\n", limiter.motor[0].enter_pointer, limiter.motor[0].exit_pointer, limiter.motor[0].limit_value);
|
|
|
+ nv_save_limit_config();
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+void* nv_get_limit_config(int *len) {
|
|
|
+ if (len) {
|
|
|
+ *len = sizeof(nv_limter_t) * (2 * TEMP_LIMITER_NUM + 1);
|
|
|
+ }
|
|
|
+ return &limiter.motor[0];
|
|
|
+}
|
|
|
+
|
|
|
void nv_save_limit_config(void) {
|
|
|
- u16 crc = crc16_get((u8 *)&limiter, sizeof(limiter) - 2);
|
|
|
limiter.magic = NV_MAGIC;
|
|
|
+ u16 crc = crc16_get((u8 *)&limiter, sizeof(limiter) - 2);
|
|
|
limiter.crc16 = crc;
|
|
|
fmc_write_data(limiter_cfg_idx_0, (u8 *)&limiter, sizeof(limiter));
|
|
|
fmc_write_data(limiter_cfg_idx_1, (u8 *)&limiter, sizeof(limiter));
|
|
|
@@ -276,6 +258,7 @@ void nv_read_foc_params(void) {
|
|
|
}
|
|
|
|
|
|
void nv_save_gear_configs(void) {
|
|
|
+ gear_config.magic = NV_MAGIC;
|
|
|
u16 crc = crc16_get((u8 *)&gear_config, sizeof(gear_config) - 2);
|
|
|
gear_config.crc16 = crc;
|
|
|
fmc_write_data(gear_config_idx_0, (u8 *)&gear_config, sizeof(gear_config));
|
|
|
@@ -290,6 +273,7 @@ void nv_read_gear_configs(void) {
|
|
|
fmc_read_data(gear_config_idx_1, (u8 *)&gear_config, sizeof(gear_config));
|
|
|
crc0 = crc16_get((u8 *)&gear_config, sizeof(gear_config) - 2);
|
|
|
if (crc0 != gear_config.crc16) {
|
|
|
+ sys_debug("default gear\n");
|
|
|
nv_default_gear_config();
|
|
|
nv_save_gear_configs();
|
|
|
return;
|
|
|
@@ -306,6 +290,7 @@ void nv_read_gear_configs(void) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#if 0
|
|
|
bool nv_set_gear_config(u8 mode4896, u8 gear, u16 rpm, u16 torque, u16 idc, u16 acc) {
|
|
|
mc_gear_t *gear_cfg;
|
|
|
if (gear >= CONFIG_MAX_GEAR_NUM) {
|
|
|
@@ -344,106 +329,102 @@ bool nv_get_gear_config(u8 mode4896, u8 gear, u16 *rpm, u16 *torque, u16 *idc, u
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
+#endif
|
|
|
|
|
|
|
|
|
-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];
|
|
|
-}
|
|
|
+bool nv_set_gear_config(u8 mode96, u8 *config, int len) {
|
|
|
+ int config_len = sizeof(mc_gear_t) * CONFIG_MAX_GEAR_NUM;
|
|
|
+ if (len < config_len) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (mode96) {
|
|
|
+ memcpy(&gear_config.gears_96[0], config, len);
|
|
|
+ }else {
|
|
|
+ memcpy(&gear_config.gears_48[0], config, len);
|
|
|
+ }
|
|
|
+ for (int i = 0; i < CONFIG_MAX_GEAR_NUM; i++) {
|
|
|
+ if (gear_config.gears_48[i].n_max_speed > CONFIG_MAX_MOT_RPM) {
|
|
|
+ gear_config.gears_48[i].n_max_speed = CONFIG_MAX_MOT_RPM;
|
|
|
+ }
|
|
|
|
|
|
-void nv_set_hwbrake_mode(u8 mode) {
|
|
|
- foc_params.n_brkShutPower = mode;
|
|
|
-}
|
|
|
+ if (gear_config.gears_48[i].n_max_trq > CONFIG_MAX_TORQUE) {
|
|
|
+ gear_config.gears_48[i].n_max_trq = CONFIG_MAX_TORQUE;
|
|
|
+ }
|
|
|
|
|
|
-void nv_set_throttle_vol(float min, float max) {
|
|
|
- foc_params.n_startThroVol = min;
|
|
|
- foc_params.n_endThroVol = max;
|
|
|
-}
|
|
|
+ if (gear_config.gears_48[i].n_max_idc > CONFIG_MAX_VBUS_CURRENT) {
|
|
|
+ gear_config.gears_48[i].n_max_idc = CONFIG_MAX_VBUS_CURRENT;
|
|
|
+ }
|
|
|
+ if (gear_config.gears_48[i].n_zero_accl == 0) {
|
|
|
+ gear_config.gears_48[i].n_zero_accl = 100;
|
|
|
+ }
|
|
|
+ if (gear_config.gears_48[i].n_accl_time == 0) {
|
|
|
+ gear_config.gears_48[i].n_accl_time = 1;
|
|
|
+ }
|
|
|
|
|
|
-trq2dq_table_t *_trq2dq_table(int idx) {
|
|
|
- trq2dq_table_t *tbl = (trq2dq_table_t *)fmc_get_addr(idx);
|
|
|
+ if (gear_config.gears_96[i].n_max_speed > CONFIG_MAX_MOT_RPM) {
|
|
|
+ gear_config.gears_96[i].n_max_speed = CONFIG_MAX_MOT_RPM;
|
|
|
+ }
|
|
|
|
|
|
- if (tbl->magic != NV_MAGIC) {
|
|
|
- sys_error("trq tlb %d magic error, 0x%x\n", idx, tbl->magic);
|
|
|
- return NULL;
|
|
|
- }
|
|
|
- u16 crc = crc16_get((u8 *)tbl, sizeof(trq2dq_table_t) - 4);
|
|
|
- if (crc != tbl->crc16) {
|
|
|
- sys_error("trq tlb %d crc16 error\n", idx);
|
|
|
- return NULL;
|
|
|
- }
|
|
|
- return tbl;
|
|
|
-}
|
|
|
+ if (gear_config.gears_96[i].n_max_trq > CONFIG_MAX_TORQUE) {
|
|
|
+ gear_config.gears_96[i].n_max_trq = CONFIG_MAX_TORQUE;
|
|
|
+ }
|
|
|
|
|
|
-trq2dq_table_t *nv_get_trq2dq_table(void) {
|
|
|
- trq2dq_table_t *tbl = _trq2dq_table(trq_Tbl_idx0);
|
|
|
- if (tbl == NULL) {
|
|
|
- tbl = _trq2dq_table(trq_Tbl_idx1);
|
|
|
+ if (gear_config.gears_96[i].n_max_idc > CONFIG_MAX_VBUS_CURRENT) {
|
|
|
+ gear_config.gears_96[i].n_max_idc = CONFIG_MAX_VBUS_CURRENT;
|
|
|
+ }
|
|
|
+ if (gear_config.gears_96[i].n_zero_accl == 0) {
|
|
|
+ gear_config.gears_96[i].n_zero_accl = 100;
|
|
|
+ }
|
|
|
+ if (gear_config.gears_96[i].n_accl_time == 0) {
|
|
|
+ gear_config.gears_96[i].n_accl_time = 1;
|
|
|
+ }
|
|
|
+ for (int j = 0; j < GEAR_SPEED_TRQ_NUM; j++) {
|
|
|
+ if (gear_config.gears_48[i].n_torque[j] > 100) {
|
|
|
+ gear_config.gears_48[i].n_torque[j] = 100;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (gear_config.gears_96[i].n_torque[j] > 100) {
|
|
|
+ gear_config.gears_96[i].n_torque[j] = 100;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- return tbl;
|
|
|
-}
|
|
|
|
|
|
-void nv_write_trq_table_begin(int index) {
|
|
|
- fmc_write_trq_table_begin(fmc_get_addr(index==0?trq_Tbl_idx0:trq_Tbl_idx1));
|
|
|
- _write_position = 0;
|
|
|
+ nv_save_gear_configs();
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
-int nv_write_trq_table_continue(uint8_t *data, int len){
|
|
|
- int w_pos = decode_u24(data);
|
|
|
- if ((_write_position + len - 3) > one_page_size * trq_Tbl_size) {
|
|
|
- return -1;
|
|
|
+void* nv_get_gear_config(u8 mode96, int *len) {
|
|
|
+ if (len) {
|
|
|
+ *len = sizeof(mc_gear_t) * CONFIG_MAX_GEAR_NUM;
|
|
|
}
|
|
|
- if (w_pos == _write_position && len > 3) {
|
|
|
- fmc_write_trq_table_continue(data + 3, len - 3);
|
|
|
- _write_position += len - 3;
|
|
|
+ sys_debug("gear0 %d %d\n", mode96, gear_config.gears_96[0].n_max_speed);
|
|
|
+ if (mode96) {
|
|
|
+ return &gear_config.gears_96[0];
|
|
|
+ }else {
|
|
|
+ return &gear_config.gears_48[0];
|
|
|
}
|
|
|
-
|
|
|
- return _write_position;
|
|
|
}
|
|
|
|
|
|
-static int nv_write_trq_table1(void) {
|
|
|
- u8 cache[16];
|
|
|
- int remain = sizeof(trq2dq_table_t);
|
|
|
- u32 faddr = fmc_get_addr(trq_Tbl_idx0);
|
|
|
- fmc_write_trq_table_begin(fmc_get_addr(trq_Tbl_idx1));
|
|
|
-
|
|
|
- while(remain > 0) {
|
|
|
- int len = min(16, sizeof(trq2dq_table_t));
|
|
|
- memcpy(cache, (void *)faddr, len);
|
|
|
- fmc_write_trq_table_continue(cache, len);
|
|
|
- remain -= len;
|
|
|
- faddr += len;
|
|
|
- }
|
|
|
-
|
|
|
- fmc_write_trq_table_end();
|
|
|
|
|
|
- return _trq2dq_table(trq_Tbl_idx1) == NULL ? 1: 0;
|
|
|
+void nv_set_pid(u8 id, pid_conf_t *pid) {
|
|
|
+ foc_params.pid_conf[id] = *pid;
|
|
|
+ nv_save_foc_params();
|
|
|
}
|
|
|
|
|
|
-int nv_write_trq_table_check(u8 *data, int len, int index) {
|
|
|
- uint32_t size, checksum;
|
|
|
- size = decode_u24(data);
|
|
|
- checksum = decode_u32(data + 3);
|
|
|
- u16 magic = NV_MAGIC;
|
|
|
- fmc_write_trq_table_continue((u8 *)&magic, sizeof(magic));
|
|
|
- fmc_write_trq_table_continue((u8 *)&checksum, sizeof(checksum));
|
|
|
- fmc_write_trq_table_end();
|
|
|
-
|
|
|
- u16 fmc_checksum = crc16_get((const u8 *)fmc_get_addr(index==0?trq_Tbl_idx0:trq_Tbl_idx1), size);
|
|
|
- if ((checksum == fmc_checksum) && (NULL != _trq2dq_table(index==0?trq_Tbl_idx0:trq_Tbl_idx1))) {
|
|
|
- if (nv_write_trq_table1()) { //write back error
|
|
|
- return 1;
|
|
|
- }
|
|
|
- return 0;
|
|
|
- }
|
|
|
+void nv_get_pid(u8 id, pid_conf_t *pid) {
|
|
|
+ *pid = foc_params.pid_conf[id];
|
|
|
+}
|
|
|
|
|
|
- return 1;
|
|
|
+void nv_set_hwbrake_mode(u8 mode) {
|
|
|
+ foc_params.n_brkShutPower = mode;
|
|
|
}
|
|
|
|
|
|
+void nv_set_throttle_vol(float min, float max) {
|
|
|
+ foc_params.n_startThroVol = min;
|
|
|
+ foc_params.n_endThroVol = max;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
int nv_write_sn(u8 *data, int len) {
|
|
|
mc_sn_t sn;
|
|
|
memset(&sn, 0, sizeof(sn));
|