Преглед изворни кода

add autogen config files for config the motor controller

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui пре 2 година
родитељ
комит
5253c73d22

+ 2 - 1
Applications/app/app.c

@@ -19,7 +19,7 @@
 #include "foc/motor/mot_params_ind.h"
 #include "foc/limit.h"
 #include "foc/mc_error.h"
-
+#include "foc/mc_config.h"
 
 #ifdef CONFIG_DQ_STEP_RESPONSE
 extern float target_d;
@@ -106,6 +106,7 @@ void app_start(void){
 	can_debug(false);
 	can_message_init();
 	nv_storage_init();
+	mc_conf_init();
 	mc_err_block_init();
 	mc_init();
 #ifdef GD32_FOC_DEMO	

+ 9 - 481
Applications/app/nv_storage.c

@@ -5,186 +5,14 @@
 #include "foc/motor/motor_param.h"
 #include "foc/foc_config.h"
 
-#define motorParam_idx_0 (sn_page_index + 1)
-#define motorParam_idx_1 (motorParam_idx_0 + 1)
-#define focParam_idx_0 (motorParam_idx_1 + 1)
-#define focParam_idx_1 (focParam_idx_0 + 1)
+#define mc_config_idx_0 (sn_page_index + 1)
+#define mc_config_idx_1 (mc_config_idx_0 + 1)
 
-#define trq_Tbl_size (4)
-#define trq_Tbl_idx0 (focParam_idx_1 + 1)
-#define trq_Tbl_idx1 (trq_Tbl_idx0 + trq_Tbl_size)
+#define sn_idx_back       (mc_config_idx_1 + 1)
 
-#define gear_config_idx_0 (trq_Tbl_idx1 + trq_Tbl_size)
-#define gear_config_idx_1 (gear_config_idx_0 + 1)
-
-#define sn_idx_back       (gear_config_idx_1 + 1)
-
-#define limiter_cfg_idx_0 (sn_idx_back + 1)
-#define limiter_cfg_idx_1 (limiter_cfg_idx_0 + 1)
-
-#define mc_runtime_red_idx (limiter_cfg_idx_1 + 1)
+#define mc_runtime_red_idx (sn_idx_back + 1)
 #define mc_crit_err_idx (mc_runtime_red_idx + 1)
 
-static motor_params_t m_params;
-static foc_params_t   foc_params;
-static mc_gear_config_t gear_config;
-static mc_limit_t limiter;
-#define NV_MAGIC 0x5AA5
-
-motor_params_t *nv_get_motor_params(void) {
-	return &m_params;
-}
-foc_params_t *nv_get_foc_params(void) {
-	return &foc_params;
-}
-
-mc_gear_config_t *nv_get_gear_configs(void) {
-	return &gear_config;
-}
-
-mc_limit_t *nv_get_limter(void) {
-	return &limiter;
-}
-
-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.mot_nr = MOTOR_NR;
-	m_params.poles = MOTOR_POLES;
-	m_params.r = MOTOR_R;
-	m_params.ld = MOTOR_Ld;
-	m_params.lq = MOTOR_Lq;
-#ifdef MOTOR_Flux
-	m_params.flux_linkage = MOTOR_Flux;
-#else
-	m_params.flux_linkage = 0;
-#endif
-	m_params.offset = MOTOR_ENC_OFFSET;
-	m_params.est_pll_band = 200;
-	m_params.epm_pll_band = 400;
-	m_params.pos_lock_pll_band = 500;
-	m_params.velocity_weight = 190;
-	m_params.velocity_C = 145;
-	m_params.gear_ratio = 6250;//6.25:1
-}
-
-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 = 110;
-	limiter.motor[1].exit_pointer = 97;
-	limiter.motor[1].limit_value = 50;
-	limiter.motor[2].enter_pointer = 97;
-	limiter.motor[2].exit_pointer = 85;
-	limiter.motor[2].limit_value = 80;
-
-	limiter.mos[0].enter_pointer = 110;
-	limiter.mos[0].exit_pointer = 100;
-	limiter.mos[0].limit_value = 0;
-	limiter.mos[1].enter_pointer = 100;
-	limiter.mos[1].exit_pointer = 90;
-	limiter.mos[1].limit_value = 60;
-	limiter.mos[2].enter_pointer = 90;
-	limiter.mos[2].exit_pointer = 80;
-	limiter.mos[2].limit_value = 80;
-
-	limiter.vbus.enter_pointer = 76;
-	limiter.vbus.exit_pointer = 80;
-	limiter.vbus.limit_value = 20;
-}
-
-
-static void nv_default_foc_params(void) {
-	foc_params.s_maxDCVol = CONFIG_MAX_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_maxEpmTorqueLim = CONFIG_DEFAULT_EPM_PHASE_CURR;
-	foc_params.s_maxTorque = CONFIG_MAX_MOTOR_TORQUE;
-	foc_params.s_TorqueBrkLim = CONFIG_DEFAULT_EBRK_TORQUE;
-	foc_params.n_currentBand = CONFIG_CURRENT_BANDWITH;
-	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_startThroVol = CONFIG_THROTTLE_START_VALUE;
-	foc_params.n_endThroVol = CONFIG_THROTTLE_END_VALUE;
-	foc_params.n_autoHold = CONFIG_AUTOHOLD_ENABLE;
-	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;
-	foc_params.f_minThroVol = CONFIG_THROTTLE_MIN_VALUE;
-	foc_params.f_maxThroVol = CONFIG_THROTTLE_MAX_VALUE;
-
-	foc_params.s_maxEpmRPMBck = CONFIG_DEFAULT_EPM_BK_RPM;
-	foc_params.s_maxEpmTorqueLimBck = CONFIG_DEFAULT_EPM_BK_PHASE_CURR;
-
-	foc_params.pid_conf[PID_D_id].kp = (foc_params.n_currentBand * MOTOR_Ld);
-	foc_params.pid_conf[PID_D_id].ki = (MOTOR_R/MOTOR_Ld);
-	foc_params.pid_conf[PID_D_id].kd = 0;
-	
-	foc_params.pid_conf[PID_Q_id].kp = (foc_params.n_currentBand * MOTOR_Lq);
-	foc_params.pid_conf[PID_Q_id].ki = (MOTOR_R/MOTOR_Lq);
-	foc_params.pid_conf[PID_Q_id].kd = 0;
-
-	foc_params.pid_conf[PID_TRQ_id].kp = PI_VEL_LIM_KP;
-	foc_params.pid_conf[PID_TRQ_id].ki = PI_VEL_LIM_KI;
-	foc_params.pid_conf[PID_TRQ_id].kd = PI_VEL_LIM_KD;
-
-	foc_params.pid_conf[PID_Spd_id].kp = PI_VEL_KP;
-	foc_params.pid_conf[PID_Spd_id].ki = PI_VEL_KI;
-	foc_params.pid_conf[PID_Spd_id].kd = PI_VEL_KD;
-
-	foc_params.pid_conf[PID_Pow_id].kp = 5.0f;
-	foc_params.pid_conf[PID_Pow_id].ki = 15.0f;
-	foc_params.pid_conf[PID_Pow_id].kd = 0;
-
-	foc_params.pid_conf[PID_Lock_id].kp = (0.01f);
-	foc_params.pid_conf[PID_Lock_id].ki = (0.20f);
-	foc_params.pid_conf[PID_Lock_id].kd = 0;
-#ifdef CONFIG_SPEED_LADRC
-	foc_params.f_adrc_vel_lim_Wo = CONFIG_LADRC_Wo;
-	foc_params.f_adrc_vel_lim_Wcv = CONFIG_LADRC_Wcv;
-	foc_params.f_adrc_vel_lim_B0 = CONFIG_LADRC_B0;
-	foc_params.f_adrc_vel_Wo = CONFIG_LADRC_Wo;
-	foc_params.f_adrc_vel_Wcv = CONFIG_LADRC_Wcv;
-	foc_params.f_adrc_vel_B0 = CONFIG_LADRC_B0;
-#endif
-}
-
-static void nv_default_gear_config(void) {
-	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 = CONFIG_MAX_MOTOR_TORQUE/2;
-		gear_config.gears_48[i].n_max_idc = 60;
-		gear_config.gears_48[i].n_zero_accl = 500;
-		gear_config.gears_48[i].n_accl_time = 10;
-
-		gear_config.gears_96[i].n_max_speed = 8000;
-		gear_config.gears_96[i].n_max_trq = CONFIG_MAX_MOTOR_TORQUE;
-		gear_config.gears_96[i].n_max_idc = 100;
-		gear_config.gears_96[i].n_zero_accl = 500;
-		gear_config.gears_96[i].n_accl_time = 10;
-
-		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_write_crit_errblock(u8 *data, int len) {
 	fmc_write_data(mc_crit_err_idx, data, len);
 }
@@ -201,285 +29,12 @@ void nv_read_runtime_block(u8 *data, int len) {
 	fmc_read_data(mc_runtime_red_idx, data, len);
 }
 
-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));
-		}
-	}
-}
-
-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) {
-	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));
-}
-
-void nv_read_limit_config(void) {
-	fmc_read_data(limiter_cfg_idx_0, (u8 *)&limiter, sizeof(limiter));
-	u16 crc16 = crc16_get((u8 *)&limiter, sizeof(limiter) - 2);
-	if (limiter.magic != NV_MAGIC || limiter.crc16 != crc16) {
-		sys_debug("lim 0 error\n");
-		fmc_read_data(limiter_cfg_idx_1, (u8 *)&limiter, sizeof(limiter));
-		crc16 = crc16_get((u8 *)&limiter, sizeof(limiter) - 2);
-		if (limiter.magic == NV_MAGIC && limiter.crc16 == crc16) {
-			fmc_write_data(limiter_cfg_idx_0, (u8 *)&limiter, sizeof(limiter));
-			return;
-		}else {
-			sys_debug("lim 1 error\n");
-			nv_default_limter();
-			nv_save_limit_config();
-		}
-	}else {
-		fmc_read_data(limiter_cfg_idx_1, (u8 *)&limiter, sizeof(limiter));
-		crc16 = crc16_get((u8 *)&limiter, sizeof(limiter) - 2);
-		if (limiter.magic != NV_MAGIC || limiter.crc16 != crc16) {
-			sys_debug("lim 1 error\n");
-			fmc_read_data(limiter_cfg_idx_0, (u8 *)&limiter, sizeof(limiter));
-			fmc_write_data(limiter_cfg_idx_1, (u8 *)&limiter, sizeof(limiter));
-		}
-	}
-}
-
-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));
-		}
-	}
-	sys_debug("maxTorque=%f\n", foc_params.s_maxTorque);
-}
-
-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));
-	fmc_write_data(gear_config_idx_1, (u8 *)&gear_config, sizeof(gear_config));
-}
-
-void nv_read_gear_configs(void) {
-	fmc_read_data(gear_config_idx_0, (u8 *)&gear_config, sizeof(gear_config));
-	u16 crc0 = crc16_get((u8 *)&gear_config, sizeof(gear_config) - 2);
-	if (crc0 != gear_config.crc16) {
-		sys_debug("gear 0 error\n");
-		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;
-		}
-		fmc_write_data(gear_config_idx_0, (u8 *)&gear_config, sizeof(gear_config));
-	}else {
-		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("gear 1 error\n");
-			fmc_read_data(gear_config_idx_0, (u8 *)&gear_config, sizeof(gear_config));
-			fmc_write_data(gear_config_idx_1, (u8 *)&gear_config, sizeof(gear_config));
-		}
-	}
-}
-
-#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) {
-		return false;
-	}
-
-	if (mode4896 == 0) { //48vmode
-		gear_cfg = &gear_config.gears_48[gear];
-	}else {
-		gear_cfg = &gear_config.gears_96[gear];
-	}
-	gear_cfg->u_maxRPM = rpm;
-	gear_cfg->u_maxTorque = torque;
-	gear_cfg->u_maxIdc = idc;
-	gear_cfg->u_accTime = acc;
-
-	nv_save_gear_configs();
-	return true;
-}
-
-bool nv_get_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) {
-		return false;
-	}
-
-	if (mode4896 == 0) { //48vmode
-		gear_cfg = &gear_config.gears_48[gear];
-	}else {
-		gear_cfg = &gear_config.gears_96[gear];
-	}
-	*rpm = gear_cfg->u_maxRPM;
-	*torque = gear_cfg->u_maxTorque;
-	*idc = gear_cfg->u_maxIdc;
-	*acc = gear_cfg->u_accTime;
-
-	return true;
-}
-#endif
-
-
-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;
-		}
-
-		if (gear_config.gears_48[i].n_max_trq > CONFIG_MAX_TORQUE) {
-			gear_config.gears_48[i].n_max_trq = CONFIG_MAX_TORQUE;
-		}
-
-		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;
-		}
-
-		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 (gear_config.gears_96[i].n_max_trq > CONFIG_MAX_TORQUE) {
-			gear_config.gears_96[i].n_max_trq = CONFIG_MAX_TORQUE;
-		}
-
-		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;
-			}
-		}
-	}
-
-	nv_save_gear_configs();
-	return true;
+void nv_write_config_block(u8 idx, u8 *data, int len) {
+	fmc_write_data(idx==0?mc_config_idx_0:mc_config_idx_1, data, len);
 }
 
-void* nv_get_gear_config(u8 mode96, int *len) {
-	if (len) {
-		*len = sizeof(mc_gear_t) * CONFIG_MAX_GEAR_NUM;
-	}
-	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];
-	}
-}
-
-
-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_startThroVol = min;
-	foc_params.n_endThroVol = max;
+void nv_read_config_block(u8 idx, u8 *data, int len) {
+	fmc_read_data(idx==0?mc_config_idx_0:mc_config_idx_1, data, len);
 }
 
 
@@ -515,33 +70,6 @@ int nv_read_sn(u8 *data, int len) {
 }
 
 void nv_storage_init(void) {
-	nv_read_motor_params();
-	nv_read_foc_params();
-	nv_read_gear_configs();
-	nv_read_limit_config();
-	sys_debug("encoder_off = %f\n", m_params.offset);
-	if (m_params.mot_nr != MOTOR_NR) {
-		nv_default_motor_params();
-		nv_default_foc_params();
-		nv_save_foc_params();
-		nv_save_motor_params();
-		nv_default_gear_config();
-		nv_save_gear_configs();
-		nv_default_limter();
-		nv_save_limit_config();
-		sys_debug("change motor %x\n", m_params.mot_nr);
-	}
-#if CONFIG_MOT_TYPE==MOTOR_BLUESHARK_NEW1
-	m_params.offset = 0.0f; //编码器做了零位置校准
-#endif
-#if CONFIG_MOT_TYPE==MOTOR_BLUESHARK_ZD_100
-	m_params.offset = 0.0f; //编码器做了零位置校准
-	m_params.est_pll_band = 200;
-	m_params.flux_linkage = MOTOR_Flux;
-#endif
-#if CONFIG_MOT_TYPE==MOTOR_BLUESHARK_A1
-	m_params.offset = 0.0f; //编码器做了零位置校准
-#endif
-	sys_debug("%f -- %f, flux: %f, %d\n", foc_params.n_currentBand, m_params.ld, m_params.flux_linkage, sizeof(m_params));
+
 }
 

+ 4 - 115
Applications/app/nv_storage.h

@@ -1,101 +1,7 @@
 #ifndef _NV_Storage_H__
 #define _NV_Storage_H__
 #include "os/os_types.h"
-#include "foc/core/PMSM_FOC_Core.h"
-#include "foc/commands.h"
-#pragma  pack (push,1)
-
-typedef struct {
-	float s_PhaseCurrLim;
-	float s_maxDCVol;
-	float s_minDCVol;
-	float s_maxRPM;
-	float s_maxEpmRPM;
-	float s_maxEpmTorqueLim;
-	float s_maxTorque;
-	float s_TorqueBrkLim;
-	float s_iDCeBrkLim;
-	float s_LimitiDC;
-	float n_currentBand; //电流环带宽
-	float n_startThroVol;
-	float n_endThroVol;
-	u8    n_brkShutPower;
-	u8    n_autoHold;
-	u32   n_dec_time;
-	u32   n_ebrk_time;
-	u8    n_FwEnable;
-	pid_conf_t pid_conf[PID_Max_id];
-	float f_minThroVol;
-	float f_maxThroVol;
-
-	float f_adrc_vel_lim_Wo;
-	float f_adrc_vel_lim_Wcv;
-	float f_adrc_vel_lim_B0;
-
-	float f_adrc_vel_Wo;
-	float f_adrc_vel_Wcv;
-	float f_adrc_vel_B0;
-
-	float s_maxEpmRPMBck;
-	float s_maxEpmTorqueLimBck;
-
-	u8    res[256 - 157 - 24 - 8];
-	u16   crc16;
-}foc_params_t;
-
-typedef struct {
-	u8 mot_nr;
-	u8 poles;
-	float r;
-	float ld;
-	float lq;
-	float flux_linkage;
-	float offset;
-	float est_pll_band; //normal工作模式下的pll带宽
-	float pos_lock_pll_band; //电机锁定模式下的pll带宽
-	float epm_pll_band;
-	s16   velocity_weight;//车重, kg
-	s16   velocity_C; //车轮周长, cm
-	s16   gear_ratio; //传动比
-	u8    res[128 - 36 - 6];
-	u16   crc16;
-}motor_params_t;
-
-typedef struct {
-	s16 enter_pointer;
-	s16 exit_pointer;
-	s16 limit_value;
-}nv_limter_t;
-
-#define TEMP_LIMITER_NUM 3
-typedef struct {
-	u16  magic;
-	nv_limter_t motor[TEMP_LIMITER_NUM];
-	nv_limter_t mos[TEMP_LIMITER_NUM];
-	nv_limter_t vbus;
-	u8    res[128 - 46];
-	u16 crc16;
-}mc_limit_t;
-
-#define GEAR_SPEED_TRQ_NUM 10
-typedef struct {
-	u16 n_max_speed; //最大速度, rpm
-	u16 n_max_trq;   //最大扭矩
-	u16 n_max_idc;   //最大母线电流
-	u16 n_zero_accl; //零速启动扭矩给定时间,防止翘头
-	u16 n_accl_time; //加速的扭矩斜坡时间
-	u8  n_torque[GEAR_SPEED_TRQ_NUM]; //1000, 2000, 3000... RPM 最大给定扭矩的百分比(最大扭矩的百分比)
-}mc_gear_t;
-
-#define CONFIG_MAX_GEAR_NUM 4
-typedef struct {
-	mc_gear_t gears_48[CONFIG_MAX_GEAR_NUM];
-	mc_gear_t gears_96[CONFIG_MAX_GEAR_NUM];
-	u16  	  magic;
-	u16       crc16;
-}mc_gear_config_t;
-
-#pragma pack(pop)
+#include "bsp/bsp_driver.h"
 
 typedef struct {
 	u8 sn[32];
@@ -112,32 +18,15 @@ typedef struct {
 }mc_err_red_t;
 
 void nv_storage_init(void);
-motor_params_t *nv_get_motor_params(void);
-foc_params_t *nv_get_foc_params(void);
-mc_gear_config_t *nv_get_gear_configs(void);
-mc_limit_t *nv_get_limter(void);
-void nv_save_angle_offset(float offset);
-void nv_save_motor_params(void);
-void nv_read_motor_params(void);
-void nv_save_foc_params(void);
-void nv_read_foc_params(void);
-void nv_save_hall_table(s32 *hall_table);
-void nv_set_pid(u8 id, pid_conf_t *pid);
-void nv_get_pid(u8 id, pid_conf_t *pid);
-void nv_set_hwbrake_mode(u8 mode);
-void nv_set_throttle_vol(float min, float max);
 int nv_write_sn(u8 *data, int len);
 int nv_read_sn(u8 *data, int len);
-bool nv_set_limit_config(u8 *config, int len);
-void nv_save_limit_config(void);
-void* nv_get_limit_config(int *len);
-bool nv_set_gear_config(u8 mode96, u8 *config, int len);
-void nv_save_gear_configs(void);
-void* nv_get_gear_config(u8 mode96, int *len);
+
 void nv_write_crit_errblock(u8 *data, int len);
 void nv_read_crit_errblock(u8 *data, int len);
 void nv_write_runtime_block(u8 *data, int len);
 void nv_read_runtime_block(u8 *data, int len);
+void nv_write_config_block(u8 idx, u8 *data, int len);
+void nv_read_config_block(u8 idx, u8 *data, int len);
 
 #endif /* _NV_Storage_H__ */
 

+ 331 - 0
Applications/autogen_config.h

@@ -0,0 +1,331 @@
+/* auto gen 2023/8/29 13:54:06*/
+#ifndef _AUTOGEN_CONFIG_H__
+#define _AUTOGEN_CONFIG_H__
+
+#define CONFIG_Version 1
+#define CONFIG_Motor_Poles  5
+#define CONFIG_Motor_Ld  4.5E-05f
+#define CONFIG_Motor_Lq  9.6E-05f
+#define CONFIG_Motor_Rs  0.008f
+#define CONFIG_Motor_Flux  0.019f
+#define CONFIG_Motor_PLLBand  200
+#define CONFIG_Motor_EpmPLL  400
+#define CONFIG_Motor_PosPLL  500
+#define CONFIG_Motor_VelocityW  190
+#define CONFIG_Motor_VelocityC  145
+#define CONFIG_Motor_GearRatio  6.25f
+#define CONFIG_Motor_MaxFwDCurr  100
+#define CONFIG_Foc_MaxDCVol  110
+#define CONFIG_Foc_MinDCVol  70
+#define CONFIG_Foc_MaxPhaseCurr  300
+#define CONFIG_Foc_MaxRPM  9000
+#define CONFIG_Foc_MaxEPMRPM  300
+#define CONFIG_Foc_MaxEPMTorque  100
+#define CONFIG_Foc_MaxEPMRPMBk  170
+#define CONFIG_Foc_MaxEPMTorqueBk  80
+#define CONFIG_Foc_MaxTorque  300
+#define CONFIG_Foc_MaxEbrkTorque  40
+#define CONFIG_Foc_MaxIDC  100
+#define CONFIG_Foc_ThroStartVol  0.85f
+#define CONFIG_Foc_ThroEndVol  4.15f
+#define CONFIG_Foc_ThroMinVol  0.4f
+#define CONFIG_Foc_ThroMaxVol  4.6f
+#define CONFIG_Foc_CurrCtrlBandWith  200
+#define CONFIG_Foc_ThroDecTime  10
+#define CONFIG_Foc_PID_VelLim_Kp 0.5f
+#define CONFIG_Foc_PID_VelLim_Ki 2.5f
+#define CONFIG_Foc_PID_VelLim_Kd 0
+#define CONFIG_Foc_PID_VelCtrl_Kp 0.1f
+#define CONFIG_Foc_PID_VelCtrl_Ki 3.5f
+#define CONFIG_Foc_PID_VelCtrl_Kd 0
+#define CONFIG_Foc_PID_Autohold_Kp 0.01f
+#define CONFIG_Foc_PID_Autohold_Ki 0.2f
+#define CONFIG_Foc_PID_Autohold_Kd 0
+#define CONFIG_Foc_PID_IDCLim_Kp 5
+#define CONFIG_Foc_PID_IDCLim_Ki 15
+#define CONFIG_Foc_PID_IDCLim_Kd 0
+#define CONFIG_Settings_AutoHold  1
+#define CONFIG_Settings_BrkShutPower  1
+#define CONFIG_Settings_TcsEnable  0
+#define CONFIG_Gear0_MaxSpeed 1000
+#define CONFIG_Gear0_MaxTorque 100
+#define CONFIG_Gear0_MaxIdc 30
+#define CONFIG_Gear0_ZeroAccl 500
+#define CONFIG_Gear0_NormalAccl 100
+#define CONFIG_Gear0_Torque0 100
+#define CONFIG_Gear0_Torque1 100
+#define CONFIG_Gear0_Torque2 100
+#define CONFIG_Gear0_Torque3 100
+#define CONFIG_Gear0_Torque4 100
+#define CONFIG_Gear0_Torque5 100
+#define CONFIG_Gear0_Torque6 100
+#define CONFIG_Gear0_Torque7 100
+#define CONFIG_Gear0_Torque8 0
+#define CONFIG_Gear0_Torque9 0
+#define CONFIG_Gear1_MaxSpeed 1000
+#define CONFIG_Gear1_MaxTorque 100
+#define CONFIG_Gear1_MaxIdc 30
+#define CONFIG_Gear1_ZeroAccl 500
+#define CONFIG_Gear1_NormalAccl 100
+#define CONFIG_Gear1_Torque0 100
+#define CONFIG_Gear1_Torque1 100
+#define CONFIG_Gear1_Torque2 100
+#define CONFIG_Gear1_Torque3 100
+#define CONFIG_Gear1_Torque4 100
+#define CONFIG_Gear1_Torque5 100
+#define CONFIG_Gear1_Torque6 100
+#define CONFIG_Gear1_Torque7 100
+#define CONFIG_Gear1_Torque8 0
+#define CONFIG_Gear1_Torque9 0
+#define CONFIG_Gear2_MaxSpeed 1000
+#define CONFIG_Gear2_MaxTorque 100
+#define CONFIG_Gear2_MaxIdc 30
+#define CONFIG_Gear2_ZeroAccl 500
+#define CONFIG_Gear2_NormalAccl 100
+#define CONFIG_Gear2_Torque0 100
+#define CONFIG_Gear2_Torque1 100
+#define CONFIG_Gear2_Torque2 100
+#define CONFIG_Gear2_Torque3 100
+#define CONFIG_Gear2_Torque4 100
+#define CONFIG_Gear2_Torque5 100
+#define CONFIG_Gear2_Torque6 100
+#define CONFIG_Gear2_Torque7 100
+#define CONFIG_Gear2_Torque8 0
+#define CONFIG_Gear2_Torque9 0
+#define CONFIG_Gear3_MaxSpeed 1000
+#define CONFIG_Gear3_MaxTorque 100
+#define CONFIG_Gear3_MaxIdc 30
+#define CONFIG_Gear3_ZeroAccl 500
+#define CONFIG_Gear3_NormalAccl 100
+#define CONFIG_Gear3_Torque0 100
+#define CONFIG_Gear3_Torque1 100
+#define CONFIG_Gear3_Torque2 100
+#define CONFIG_Gear3_Torque3 100
+#define CONFIG_Gear3_Torque4 100
+#define CONFIG_Gear3_Torque5 100
+#define CONFIG_Gear3_Torque6 100
+#define CONFIG_Gear3_Torque7 100
+#define CONFIG_Gear3_Torque8 0
+#define CONFIG_Gear3_Torque9 0
+#define CONFIG_Gear0_MaxSpeed 1000
+#define CONFIG_Gear0_MaxTorque 100
+#define CONFIG_Gear0_MaxIdc 30
+#define CONFIG_Gear0_ZeroAccl 500
+#define CONFIG_Gear0_NormalAccl 100
+#define CONFIG_Gear0_Torque0 100
+#define CONFIG_Gear0_Torque1 100
+#define CONFIG_Gear0_Torque2 100
+#define CONFIG_Gear0_Torque3 100
+#define CONFIG_Gear0_Torque4 100
+#define CONFIG_Gear0_Torque5 100
+#define CONFIG_Gear0_Torque6 100
+#define CONFIG_Gear0_Torque7 100
+#define CONFIG_Gear0_Torque8 0
+#define CONFIG_Gear0_Torque9 0
+#define CONFIG_Gear1_MaxSpeed 1000
+#define CONFIG_Gear1_MaxTorque 100
+#define CONFIG_Gear1_MaxIdc 30
+#define CONFIG_Gear1_ZeroAccl 500
+#define CONFIG_Gear1_NormalAccl 100
+#define CONFIG_Gear1_Torque0 100
+#define CONFIG_Gear1_Torque1 100
+#define CONFIG_Gear1_Torque2 100
+#define CONFIG_Gear1_Torque3 100
+#define CONFIG_Gear1_Torque4 100
+#define CONFIG_Gear1_Torque5 100
+#define CONFIG_Gear1_Torque6 100
+#define CONFIG_Gear1_Torque7 100
+#define CONFIG_Gear1_Torque8 0
+#define CONFIG_Gear1_Torque9 0
+#define CONFIG_Gear2_MaxSpeed 1000
+#define CONFIG_Gear2_MaxTorque 100
+#define CONFIG_Gear2_MaxIdc 30
+#define CONFIG_Gear2_ZeroAccl 500
+#define CONFIG_Gear2_NormalAccl 100
+#define CONFIG_Gear2_Torque0 100
+#define CONFIG_Gear2_Torque1 100
+#define CONFIG_Gear2_Torque2 100
+#define CONFIG_Gear2_Torque3 100
+#define CONFIG_Gear2_Torque4 100
+#define CONFIG_Gear2_Torque5 100
+#define CONFIG_Gear2_Torque6 100
+#define CONFIG_Gear2_Torque7 100
+#define CONFIG_Gear2_Torque8 0
+#define CONFIG_Gear2_Torque9 0
+#define CONFIG_Gear3_MaxSpeed 1000
+#define CONFIG_Gear3_MaxTorque 100
+#define CONFIG_Gear3_MaxIdc 30
+#define CONFIG_Gear3_ZeroAccl 500
+#define CONFIG_Gear3_NormalAccl 100
+#define CONFIG_Gear3_Torque0 100
+#define CONFIG_Gear3_Torque1 100
+#define CONFIG_Gear3_Torque2 100
+#define CONFIG_Gear3_Torque3 100
+#define CONFIG_Gear3_Torque4 100
+#define CONFIG_Gear3_Torque5 100
+#define CONFIG_Gear3_Torque6 100
+#define CONFIG_Gear3_Torque7 100
+#define CONFIG_Gear3_Torque8 0
+#define CONFIG_Gear3_Torque9 0
+#define CONFIG_GearLow0_MaxSpeed 1000
+#define CONFIG_GearLow0_MaxTorque 100
+#define CONFIG_GearLow0_MaxIdc 30
+#define CONFIG_GearLow0_ZeroAccl 500
+#define CONFIG_GearLow0_NormalAccl 100
+#define CONFIG_GearLow0_Torque0 100
+#define CONFIG_GearLow0_Torque1 100
+#define CONFIG_GearLow0_Torque2 100
+#define CONFIG_GearLow0_Torque3 100
+#define CONFIG_GearLow0_Torque4 100
+#define CONFIG_GearLow0_Torque5 100
+#define CONFIG_GearLow0_Torque6 100
+#define CONFIG_GearLow0_Torque7 100
+#define CONFIG_GearLow0_Torque8 0
+#define CONFIG_GearLow0_Torque9 0
+#define CONFIG_GearLow1_MaxSpeed 1000
+#define CONFIG_GearLow1_MaxTorque 100
+#define CONFIG_GearLow1_MaxIdc 30
+#define CONFIG_GearLow1_ZeroAccl 500
+#define CONFIG_GearLow1_NormalAccl 100
+#define CONFIG_GearLow1_Torque0 100
+#define CONFIG_GearLow1_Torque1 100
+#define CONFIG_GearLow1_Torque2 100
+#define CONFIG_GearLow1_Torque3 100
+#define CONFIG_GearLow1_Torque4 100
+#define CONFIG_GearLow1_Torque5 100
+#define CONFIG_GearLow1_Torque6 100
+#define CONFIG_GearLow1_Torque7 100
+#define CONFIG_GearLow1_Torque8 0
+#define CONFIG_GearLow1_Torque9 0
+#define CONFIG_GearLow2_MaxSpeed 1000
+#define CONFIG_GearLow2_MaxTorque 100
+#define CONFIG_GearLow2_MaxIdc 30
+#define CONFIG_GearLow2_ZeroAccl 500
+#define CONFIG_GearLow2_NormalAccl 100
+#define CONFIG_GearLow2_Torque0 100
+#define CONFIG_GearLow2_Torque1 100
+#define CONFIG_GearLow2_Torque2 100
+#define CONFIG_GearLow2_Torque3 100
+#define CONFIG_GearLow2_Torque4 100
+#define CONFIG_GearLow2_Torque5 100
+#define CONFIG_GearLow2_Torque6 100
+#define CONFIG_GearLow2_Torque7 100
+#define CONFIG_GearLow2_Torque8 0
+#define CONFIG_GearLow2_Torque9 0
+#define CONFIG_GearLow3_MaxSpeed 1000
+#define CONFIG_GearLow3_MaxTorque 100
+#define CONFIG_GearLow3_MaxIdc 30
+#define CONFIG_GearLow3_ZeroAccl 500
+#define CONFIG_GearLow3_NormalAccl 100
+#define CONFIG_GearLow3_Torque0 100
+#define CONFIG_GearLow3_Torque1 100
+#define CONFIG_GearLow3_Torque2 100
+#define CONFIG_GearLow3_Torque3 100
+#define CONFIG_GearLow3_Torque4 100
+#define CONFIG_GearLow3_Torque5 100
+#define CONFIG_GearLow3_Torque6 100
+#define CONFIG_GearLow3_Torque7 100
+#define CONFIG_GearLow3_Torque8 0
+#define CONFIG_GearLow3_Torque9 0
+#define CONFIG_GearLow0_MaxSpeed 1000
+#define CONFIG_GearLow0_MaxTorque 100
+#define CONFIG_GearLow0_MaxIdc 30
+#define CONFIG_GearLow0_ZeroAccl 500
+#define CONFIG_GearLow0_NormalAccl 100
+#define CONFIG_GearLow0_Torque0 100
+#define CONFIG_GearLow0_Torque1 100
+#define CONFIG_GearLow0_Torque2 100
+#define CONFIG_GearLow0_Torque3 100
+#define CONFIG_GearLow0_Torque4 100
+#define CONFIG_GearLow0_Torque5 100
+#define CONFIG_GearLow0_Torque6 100
+#define CONFIG_GearLow0_Torque7 100
+#define CONFIG_GearLow0_Torque8 0
+#define CONFIG_GearLow0_Torque9 0
+#define CONFIG_GearLow1_MaxSpeed 1000
+#define CONFIG_GearLow1_MaxTorque 100
+#define CONFIG_GearLow1_MaxIdc 30
+#define CONFIG_GearLow1_ZeroAccl 500
+#define CONFIG_GearLow1_NormalAccl 100
+#define CONFIG_GearLow1_Torque0 100
+#define CONFIG_GearLow1_Torque1 100
+#define CONFIG_GearLow1_Torque2 100
+#define CONFIG_GearLow1_Torque3 100
+#define CONFIG_GearLow1_Torque4 100
+#define CONFIG_GearLow1_Torque5 100
+#define CONFIG_GearLow1_Torque6 100
+#define CONFIG_GearLow1_Torque7 100
+#define CONFIG_GearLow1_Torque8 0
+#define CONFIG_GearLow1_Torque9 0
+#define CONFIG_GearLow2_MaxSpeed 1000
+#define CONFIG_GearLow2_MaxTorque 100
+#define CONFIG_GearLow2_MaxIdc 30
+#define CONFIG_GearLow2_ZeroAccl 500
+#define CONFIG_GearLow2_NormalAccl 100
+#define CONFIG_GearLow2_Torque0 100
+#define CONFIG_GearLow2_Torque1 100
+#define CONFIG_GearLow2_Torque2 100
+#define CONFIG_GearLow2_Torque3 100
+#define CONFIG_GearLow2_Torque4 100
+#define CONFIG_GearLow2_Torque5 100
+#define CONFIG_GearLow2_Torque6 100
+#define CONFIG_GearLow2_Torque7 100
+#define CONFIG_GearLow2_Torque8 0
+#define CONFIG_GearLow2_Torque9 0
+#define CONFIG_GearLow3_MaxSpeed 1000
+#define CONFIG_GearLow3_MaxTorque 100
+#define CONFIG_GearLow3_MaxIdc 30
+#define CONFIG_GearLow3_ZeroAccl 500
+#define CONFIG_GearLow3_NormalAccl 100
+#define CONFIG_GearLow3_Torque0 100
+#define CONFIG_GearLow3_Torque1 100
+#define CONFIG_GearLow3_Torque2 100
+#define CONFIG_GearLow3_Torque3 100
+#define CONFIG_GearLow3_Torque4 100
+#define CONFIG_GearLow3_Torque5 100
+#define CONFIG_GearLow3_Torque6 100
+#define CONFIG_GearLow3_Torque7 100
+#define CONFIG_GearLow3_Torque8 0
+#define CONFIG_GearLow3_Torque9 0
+#define CONFIG_Protect_Motor_Level0_Entry 130
+#define CONFIG_Protect_Motor_Level0_Exit 120
+#define CONFIG_Protect_Motor_Level0_Value 0
+#define CONFIG_Protect_Motor_Level1_Entry 120
+#define CONFIG_Protect_Motor_Level1_Exit 110
+#define CONFIG_Protect_Motor_Level1_Value 34
+#define CONFIG_Protect_Motor_Level2_Entry 110
+#define CONFIG_Protect_Motor_Level2_Exit 100
+#define CONFIG_Protect_Motor_Level2_Value 66
+#define CONFIG_Protect_MosFet_Level0_Entry 100
+#define CONFIG_Protect_MosFet_Level0_Exit 95
+#define CONFIG_Protect_MosFet_Level0_Value 0
+#define CONFIG_Protect_MosFet_Level1_Entry 95
+#define CONFIG_Protect_MosFet_Level1_Exit 90
+#define CONFIG_Protect_MosFet_Level1_Value 34
+#define CONFIG_Protect_MosFet_Level2_Entry 90
+#define CONFIG_Protect_MosFet_Level2_Exit 80
+#define CONFIG_Protect_MosFet_Level2_Value 66
+#define CONFIG_Protect_Voltage_Level0_Entry 60
+#define CONFIG_Protect_Voltage_Level0_Exit 70
+#define CONFIG_Protect_Voltage_Level0_Value 0
+#define CONFIG_EnergyRecovery_Level0_Torque 0
+#define CONFIG_EnergyRecovery_Level0_Time 1000
+#define CONFIG_EnergyRecovery_Level1_Torque 10
+#define CONFIG_EnergyRecovery_Level1_Time 500
+#define CONFIG_EnergyRecovery_Level2_Torque 15
+#define CONFIG_EnergyRecovery_Level2_Time 400
+#define CONFIG_EnergyRecovery_Level3_Torque 20
+#define CONFIG_EnergyRecovery_Level3_Time 300
+#define CONFIG_EnergyRecovery_Level4_Torque 35
+#define CONFIG_EnergyRecovery_Level4_Time 200
+#define CONFIG_EnergyRecovery_Level5_Torque 40
+#define CONFIG_EnergyRecovery_Level5_Time 200
+#define CONFIG_EnergyRecovery_Level6_Torque 45
+#define CONFIG_EnergyRecovery_Level6_Time 200
+#define CONFIG_EnergyRecovery_Level7_Torque 50
+#define CONFIG_EnergyRecovery_Level7_Time 200
+#define CONFIG_EnergyRecovery_Level8_Torque 55
+#define CONFIG_EnergyRecovery_Level8_Time 200
+#define CONFIG_EnergyRecovery_Level9_Torque 60
+#define CONFIG_EnergyRecovery_Level9_Time 200
+#endif /* _AUTOGEN_CONFIG_H__ */ 

+ 61 - 95
Applications/foc/commands.c

@@ -11,6 +11,7 @@
 #include "foc/core/foc_observer.h"
 #include "foc/mc_error.h"
 #include "foc/motor/mot_params_ind.h"
+#include "foc/mc_config.h"
 
 #ifdef CONFIG_DQ_STEP_RESPONSE
 extern float target_d;
@@ -135,7 +136,7 @@ static void process_ext_command(foc_cmd_body_t *command) {
 	
 }
 
-static u8 ignore_with_speed[] = {Foc_Set_Adrc_Params, Foc_Set_Gear_Limit, Foc_Conf_Pid, Foc_Set_Throttle_throld, Foc_Set_Config, Foc_Set_eBrake_Throld, Foc_Set_Limiter_Config, Foc_End_Write_TRQ_Table, Foc_SN_Write};
+static u8 ignore_with_speed[] = {Foc_Set_Adrc_Params, Foc_Set_Gear_Limit, Foc_Conf_Pid, Foc_Set_Throttle_throld, Foc_Set_Config, Foc_Set_eBrake_Throld, Foc_Set_Limiter_Config, Foc_Write_Config, Foc_SN_Write};
 
 static bool _can_process_with_speed(u8 cmd) {
 	int size = ARRAY_SIZE(ignore_with_speed);
@@ -259,7 +260,7 @@ static void process_foc_command(foc_cmd_body_t *command) {
 		{
 			sys_debug("len = %d\n", command->len);
 			u8 mode = decode_u8(command->data);
-			if (!nv_set_gear_config(mode, (u8 *)command->data+1, command->len-1)){
+			if (!mc_conf_set_gear(mode, (u8 *)command->data+1, command->len-1)){
 				erroCode = FOC_Param_Err;
 			}
 			break;
@@ -267,13 +268,11 @@ static void process_foc_command(foc_cmd_body_t *command) {
 		case Foc_Get_Gear_Limit:
 		{
 			u8  mode = decode_u8(command->data);
-			int config_len = 0;
-			void *config = nv_get_gear_config(mode, &config_len);
-			u8 *data = os_alloc(config_len + 3);
+			u8 *data = os_alloc(256 + 3);
+			int config_len = mc_conf_get_gear(mode, data + 3);
 			data[0] = command->cmd;
 			data[1] = CAN_MY_ADDRESS;
 			data[2] = 0;
-			memcpy(data + 3, config, config_len);
 			can_send_response(command->can_src, data, config_len + 3);
 			os_free(data);
 			return;
@@ -337,20 +336,20 @@ static void process_foc_command(foc_cmd_body_t *command) {
 				erroCode = FOC_Param_Err;
 				break;
 			}
-			pid_conf_t pid;
+			pid_t pid;
 			u8 id =   decode_u8((u8 *)command->data);
 			memcpy((char *)&pid, (char *)command->data + 1, sizeof(pid_conf_t));
 			sys_debug("set id = %d, kp = %f, ki = %f, kd = %f\n", id, pid.kp, pid.ki, pid.kd);
 			PMSM_FOC_SetPid(id, pid.kp, pid.ki, pid.kd);
-			nv_set_pid(id, &pid);
+			mc_conf_set_pid(id, &pid);
 			break;
 		}
 		case Foc_Get_Pid:
 		{
-			pid_conf_t pid;
+			pid_t pid;
 			u8 id =   decode_u8((u8 *)command->data);
-			if (id < PID_Max_id) {
-				nv_get_pid(id, &pid);
+			if (id < PID_Max_ID) {
+				mc_conf_get_pid(id, &pid);
 				erroCode = id;
 				memcpy(response+3, &pid, sizeof(pid));
 				len = sizeof(pid) + 3;
@@ -367,23 +366,24 @@ static void process_foc_command(foc_cmd_body_t *command) {
 				erroCode = FOC_Param_Err;
 				break;
 			}
+			/*
 			nv_get_foc_params()->f_adrc_vel_lim_Wo = decode_float(command->data);
 			nv_get_foc_params()->f_adrc_vel_lim_Wcv = decode_float((u8 *)command->data + 4);
 			nv_get_foc_params()->f_adrc_vel_lim_B0 = decode_float((u8 *)command->data + 8);
 			nv_get_foc_params()->f_adrc_vel_Wo = decode_float((u8 *)command->data + 12);
 			nv_get_foc_params()->f_adrc_vel_Wcv = decode_float((u8 *)command->data + 16);
 			nv_get_foc_params()->f_adrc_vel_B0 = decode_float((u8 *)command->data + 20);
-			nv_save_foc_params();
+			nv_save_foc_params(); */
 			break;
 		}
 		case Foc_Get_Adrc_Params:
 		{
-			encode_float(response+3, nv_get_foc_params()->f_adrc_vel_lim_Wo);
+			/*encode_float(response+3, nv_get_foc_params()->f_adrc_vel_lim_Wo);
 			encode_float(response+7, nv_get_foc_params()->f_adrc_vel_lim_Wcv);
 			encode_float(response+11, nv_get_foc_params()->f_adrc_vel_lim_B0);
 			encode_float(response+15, nv_get_foc_params()->f_adrc_vel_Wo);
 			encode_float(response+19, nv_get_foc_params()->f_adrc_vel_Wcv);
-			encode_float(response+23, nv_get_foc_params()->f_adrc_vel_B0);
+			encode_float(response+23, nv_get_foc_params()->f_adrc_vel_B0); */
 			len += 24;
 			break;
 		}
@@ -480,87 +480,56 @@ static void process_foc_command(foc_cmd_body_t *command) {
 			}else {
 				u16 start = decode_u16((u8 *)command->data);
 				u16 end = decode_u16((u8 *)command->data + 2);
-				nv_get_foc_params()->n_startThroVol = (float)start/100.0f;
-				nv_get_foc_params()->n_endThroVol = (float)end/100.0f;
-				nv_save_foc_params();
+				mc_conf()->c.thro_start_vol = (float)start/100.0f;
+				mc_conf()->c.thro_end_vol = (float)end/100.0f;
+				mc_conf_save();
 			}
 			break;
 		}
-		case Foc_Get_Config:
+		case Foc_Set_Config:
 		{
-			int config_len = 128;
-			int len = 0;
-			u8 *config = os_alloc(config_len);
-			if (config == NULL) {
-				erroCode = FOC_MEM_Err;
-				break;
+			u8 conf_cmd = decode_u8(command->data);
+			if (conf_cmd == 1) { //start
+				int len = decode_u16((u8 *)command->data+1);
+				if (!mc_conf_begin_recv(len)) {
+					erroCode = FOC_MEM_Err;
+				}
+			}else if (conf_cmd == 2) { //finish
+				u16 crc = decode_u16((u8 *)command->data+1);
+				if (!mc_conf_finish_recv(crc)) {
+					erroCode = FOC_CRC_Err;
+				}else {
+					//shark_timer_post(&_reboot_timer, 200);
+				}
+			}else if (conf_cmd == 0) { //recv config data
+				int offset = decode_u16((u8 *)command->data+1);
+				if (!mc_conf_recv_data((u8 *)command->data + 3, offset, command->len - 3)){
+					erroCode = FOC_Param_Err;
+				}
+			}else {
+				erroCode = FOC_Unknow_Cmd;
 			}
-			config[0] = command->cmd;
-			config[1] = CAN_MY_ADDRESS;
-			config[2] = 0;
-			len = 3;
-			encode_s16(config+len, (s16)nv_get_foc_params()->s_PhaseCurrLim);
-			len += 2;
-			encode_s16(config+len, (s16)nv_get_foc_params()->s_maxDCVol);
-			len += 2;
-			encode_s16(config+len, (s16)nv_get_foc_params()->s_minDCVol);
-			len += 2;
-			encode_s16(config+len, (s16)nv_get_foc_params()->s_maxRPM);
-			len += 2;
-			encode_s16(config+len, (s16)nv_get_foc_params()->s_maxEpmRPM);
-			len += 2;
-			encode_s16(config+len, (s16)nv_get_foc_params()->s_maxEpmTorqueLim);
-			len += 2;
-			encode_s16(config+len, (s16)nv_get_foc_params()->s_maxTorque);
-			len += 2;
-			encode_s16(config+len, (s16)nv_get_foc_params()->s_TorqueBrkLim);
-			len += 2;
-			encode_s16(config+len, (s16)nv_get_foc_params()->s_iDCeBrkLim);
-			len += 2;
-			encode_s16(config+len, (s16)nv_get_foc_params()->s_LimitiDC);
-			len += 2;
-			encode_s16(config+len, (s16)(nv_get_foc_params()->n_startThroVol * 100.0f));
-			len += 2;
-			encode_s16(config+len, (s16)(nv_get_foc_params()->n_endThroVol * 100.0f));
-			len += 2;
-			encode_u8(config+len, (u8)nv_get_foc_params()->n_brkShutPower);
-			len += 1;
-			encode_u8(config+len, (u8)nv_get_foc_params()->n_autoHold);
-			len += 1;
-			encode_u32(config+len, nv_get_foc_params()->n_dec_time);
-			len += 4;
-			encode_u32(config+len, nv_get_foc_params()->n_ebrk_time);
-			len += 4;
-			encode_s16(config+len, nv_get_foc_params()->s_maxEpmRPMBck);
-			len += 2;
-			encode_s16(config+len, nv_get_foc_params()->s_maxEpmTorqueLimBck);
-			len += 2;
-			can_send_response(command->can_src, config, len);
-			os_free(config);
-			return;
+			break;
 		}
-		case Foc_Set_Config:
+		case Foc_Get_Config:
 		{
-			if (mc_is_start()) {
-				erroCode = FOC_NotAllowed;
-			}else if (command->len < 28) {
+			
+			int offset = decode_u16((u8 *)command->data);
+			if (offset == 0) {
+				response[4] = 1;
+			}else {
+				response[4] = 0;
+			}
+			int ret = mc_conf_send_data(response + 4, offset, sizeof(response) - 4);
+			if (ret == -2) {
+				erroCode = FOC_MEM_Err;
+			}else if (ret == -1) {
 				erroCode = FOC_Param_Err;
+			}else if (ret == 0){
+				response[4] = 2;
+				len += mc_conf_finish_send(response + 4);
 			}else {
-				nv_get_foc_params()->s_TorqueBrkLim = decode_s16((u8 *)command->data);
-				nv_get_foc_params()->s_iDCeBrkLim = decode_s16((u8 *)command->data + 2);
-				nv_get_foc_params()->s_LimitiDC = decode_s16((u8 *)command->data + 4);
-				nv_get_foc_params()->n_startThroVol = (float)decode_s16((u8 *)command->data + 6)/100.0f;
-				nv_get_foc_params()->n_endThroVol = (float)decode_s16((u8 *)command->data + 8)/100.0f;
-				nv_get_foc_params()->s_maxEpmRPM = decode_s16((u8 *)command->data + 10);
-				nv_get_foc_params()->s_maxEpmTorqueLim = decode_s16((u8 *)command->data + 12);
-				nv_get_foc_params()->n_brkShutPower = decode_u8((u8 *)command->data + 14);
-				nv_get_foc_params()->n_autoHold = decode_u8((u8 *)command->data + 15);
-				nv_get_foc_params()->n_dec_time = decode_u32((u8 *)command->data + 16);
-				nv_get_foc_params()->n_ebrk_time = decode_u32((u8 *)command->data + 20);
-				nv_get_foc_params()->s_maxEpmRPMBck = decode_s16((u8 *)command->data + 24);
-				nv_get_foc_params()->s_maxEpmTorqueLimBck = decode_s16((u8 *)command->data + 26);
-				nv_save_foc_params();
-				shark_timer_post(&_reboot_timer, 200);
+				len += ret;
 			}
 			break;
 		}
@@ -572,11 +541,10 @@ static void process_foc_command(foc_cmd_body_t *command) {
 		}
 		case Foc_Set_eBrake_Throld:
 		{
-			if (command->len >= 4) {
+			if (command->len >= 1) {
 
-				s16 torque = decode_s16((u8 *)command->data);
-				u16 time = decode_u16((u8 *)command->data + 2);
-				mc_set_ebrk_level(torque, time);
+				u8 level = decode_u8((u8 *)command->data);
+				mc_set_ebrk_level(level);
 			}
 			break;
 		}
@@ -604,20 +572,18 @@ static void process_foc_command(foc_cmd_body_t *command) {
 		case Foc_Set_Limiter_Config:
 		{
 			sys_debug("limter %d\n", command->len);
-			if (!nv_set_limit_config((u8 *)command->data, command->len)) {
+			if (!mc_conf_set_limter((u8 *)command->data, command->len)) {
 				erroCode = FOC_Param_Err;
 			}
 			break;
 		}
 		case Foc_Get_Limiter_Config:
 		{
-			int config_len;
-			u8 *config = nv_get_limit_config(&config_len);
-			u8 *data = os_alloc(config_len + 3);
+			u8 *data = os_alloc(256 + 3);
+			int config_len = mc_conf_get_limter(data + 3);
 			data[0] = command->cmd;
 			data[1] = CAN_MY_ADDRESS;
 			data[2] = 0;
-			memcpy(data + 3, config, config_len);
 			can_send_response(command->can_src, data, config_len+3);
 			os_free(data);
 			return;

+ 2 - 1
Applications/foc/commands.h

@@ -37,7 +37,8 @@ typedef enum {
 	Foc_Enc_Zero_Cali_Result,
 	Foc_Set_Limiter_Config,
 	Foc_Get_Limiter_Config,
-	Foc_End_Write_TRQ_Table,
+	Foc_Write_Config,
+	Foc_Read_Config,
 	Foc_SN_Write, //66
 	Foc_SN_Read,
 	Foc_Set_DQ_Current, //0x44

+ 4 - 4
Applications/foc/core/F_Calc.c

@@ -2,7 +2,7 @@
 #include "foc/core/PMSM_FOC_Core.h"
 #include "libs/logger.h"
 #include "math/fast_math.h"
-#include "app/nv_storage.h"
+#include "foc/mc_config.h"
 
 static float F_Te = 0.0f; //电磁转矩生成的力
 static float F_Air = 0.0f; //空气阻力
@@ -16,9 +16,9 @@ static bool _init = false;
 void F_all_Calc(void) {
 	if (!_init) {
 		_init = true;
-		C = (float)nv_get_motor_params()->velocity_C / 100.0f;
-		M = (float)nv_get_motor_params()->velocity_weight;
-		gear_ratio = (float)nv_get_motor_params()->gear_ratio / 1000.0f;
+		C = (float)mc_conf()->m.wheel_c / 100.0f;
+		M = (float)mc_conf()->m.velocity_w;
+		gear_ratio = (float)mc_conf()->m.gear_ratio;
 	}
 	float kmph = PMSM_FOC_GetSpeed() / gear_ratio * C * 60.0f / 1000.0f;
 	if (mot_vel == 0.0f) {

+ 38 - 38
Applications/foc/core/PMSM_FOC_Core.c

@@ -1,6 +1,7 @@
 #include "arm_math.h"
 #include "PMSM_FOC_Core.h"
 #include "foc/foc_config.h"
+#include "foc/mc_config.h"
 #include "foc/motor/motor_param.h"
 #include "foc/core/e_ctrl.h"
 #include "foc/core/etcs.h"
@@ -150,50 +151,50 @@ static void PMSM_FOC_Reset_PID(void) {
 
 static void PMSM_FOC_Conf_PID(void) {
 	float slow_ctrl_ts = (1.0f/(float)CONFIG_SPD_CTRL_TS);
-	gFoc_Ctrl.pi_id.kp = nv_get_foc_params()->pid_conf[PID_D_id].kp;
-	gFoc_Ctrl.pi_id.ki = nv_get_foc_params()->pid_conf[PID_D_id].ki;
-	gFoc_Ctrl.pi_id.kd = nv_get_foc_params()->pid_conf[PID_D_id].kd;
+	gFoc_Ctrl.pi_id.kp = mc_conf()->c.pid[PID_ID_ID].kp;
+	gFoc_Ctrl.pi_id.ki = mc_conf()->c.pid[PID_ID_ID].ki;
+	gFoc_Ctrl.pi_id.kd = mc_conf()->c.pid[PID_ID_ID].kd;
 	gFoc_Ctrl.pi_id.DT = (1.0f/(float)CONFIG_IDQ_CTRL_TS);
 
-	gFoc_Ctrl.pi_iq.kp = nv_get_foc_params()->pid_conf[PID_Q_id].kp;
-	gFoc_Ctrl.pi_iq.ki = nv_get_foc_params()->pid_conf[PID_Q_id].ki;
-	gFoc_Ctrl.pi_iq.kd = nv_get_foc_params()->pid_conf[PID_Q_id].kd;
+	gFoc_Ctrl.pi_iq.kp = mc_conf()->c.pid[PID_IQ_ID].kp;
+	gFoc_Ctrl.pi_iq.ki = mc_conf()->c.pid[PID_IQ_ID].ki;
+	gFoc_Ctrl.pi_iq.kd = mc_conf()->c.pid[PID_IQ_ID].kd;
 	gFoc_Ctrl.pi_iq.DT = (1.0f/(float)CONFIG_IDQ_CTRL_TS);
 
-	gFoc_Ctrl.pi_power.kp = nv_get_foc_params()->pid_conf[PID_Pow_id].kp;
-	gFoc_Ctrl.pi_power.ki = nv_get_foc_params()->pid_conf[PID_Pow_id].ki;
-	gFoc_Ctrl.pi_power.kd = nv_get_foc_params()->pid_conf[PID_Pow_id].kd;
+	gFoc_Ctrl.pi_power.kp = mc_conf()->c.pid[PID_IDCLim_ID].kp;
+	gFoc_Ctrl.pi_power.ki = mc_conf()->c.pid[PID_IDCLim_ID].ki;
+	gFoc_Ctrl.pi_power.kd = mc_conf()->c.pid[PID_IDCLim_ID].kd;
 	gFoc_Ctrl.pi_power.DT = slow_ctrl_ts;
 
-	gFoc_Ctrl.pi_lock.kp = nv_get_foc_params()->pid_conf[PID_Lock_id].kp;
-	gFoc_Ctrl.pi_lock.ki = nv_get_foc_params()->pid_conf[PID_Lock_id].ki;
-	gFoc_Ctrl.pi_lock.kd = nv_get_foc_params()->pid_conf[PID_Lock_id].kd;
+	gFoc_Ctrl.pi_lock.kp = mc_conf()->c.pid[PID_AutoHold_ID].kp;
+	gFoc_Ctrl.pi_lock.ki = mc_conf()->c.pid[PID_AutoHold_ID].ki;
+	gFoc_Ctrl.pi_lock.kd = mc_conf()->c.pid[PID_AutoHold_ID].kd;
 	gFoc_Ctrl.pi_lock.DT = slow_ctrl_ts;
 
 #ifdef CONFIG_SPEED_LADRC
 	ladrc_init(&gFoc_Ctrl.vel_lim_adrc, slow_ctrl_ts, nv_get_foc_params()->f_adrc_vel_lim_Wo, nv_get_foc_params()->f_adrc_vel_lim_Wcv, nv_get_foc_params()->f_adrc_vel_lim_B0);
 	ladrc_init(&gFoc_Ctrl.vel_adrc, slow_ctrl_ts, nv_get_foc_params()->f_adrc_vel_Wo, nv_get_foc_params()->f_adrc_vel_Wcv, nv_get_foc_params()->f_adrc_vel_B0);
 #else
-	gFoc_Ctrl.pi_vel_lim.kp = nv_get_foc_params()->pid_conf[PID_TRQ_id].kp;
-	gFoc_Ctrl.pi_vel_lim.ki = nv_get_foc_params()->pid_conf[PID_TRQ_id].ki;
-	gFoc_Ctrl.pi_vel_lim.kd = nv_get_foc_params()->pid_conf[PID_TRQ_id].kd;
+	gFoc_Ctrl.pi_vel_lim.kp = mc_conf()->c.pid[PID_VelLim_ID].kp;
+	gFoc_Ctrl.pi_vel_lim.ki = mc_conf()->c.pid[PID_VelLim_ID].ki;
+	gFoc_Ctrl.pi_vel_lim.kd = mc_conf()->c.pid[PID_VelLim_ID].kd;
 	gFoc_Ctrl.pi_vel_lim.DT = slow_ctrl_ts;
-	gFoc_Ctrl.pi_vel.kp = nv_get_foc_params()->pid_conf[PID_Spd_id].kp;
-	gFoc_Ctrl.pi_vel.ki = nv_get_foc_params()->pid_conf[PID_Spd_id].ki;
-	gFoc_Ctrl.pi_vel.kd = nv_get_foc_params()->pid_conf[PID_Spd_id].kd;
+	gFoc_Ctrl.pi_vel.kp = mc_conf()->c.pid[PID_Vel_ID].kp;
+	gFoc_Ctrl.pi_vel.ki = mc_conf()->c.pid[PID_Vel_ID].ki;
+	gFoc_Ctrl.pi_vel.kd = mc_conf()->c.pid[PID_Vel_ID].kd;
 	gFoc_Ctrl.pi_vel.DT = slow_ctrl_ts;
 #endif
 }
 
 static void PMSM_FOC_UserInit(void) {
 	memset(&gFoc_Ctrl.userLim, 0, sizeof(gFoc_Ctrl.userLim));
-	gFoc_Ctrl.userLim.s_iDCLim = min(nv_get_foc_params()->s_LimitiDC, gFoc_Ctrl.hwLim.s_iDCMax);
-	gFoc_Ctrl.userLim.s_motRPMLim = min(nv_get_foc_params()->s_maxRPM, gFoc_Ctrl.hwLim.s_motRPMMax);
-	gFoc_Ctrl.userLim.s_torqueLim = nv_get_foc_params()->s_maxTorque;//MAX_TORQUE;
-	gFoc_Ctrl.userLim.s_PhaseCurrLim = min(nv_get_foc_params()->s_PhaseCurrLim, gFoc_Ctrl.hwLim.s_PhaseCurrMax);
-	gFoc_Ctrl.userLim.s_vDCMaxLim = nv_get_foc_params()->s_maxDCVol;
-	gFoc_Ctrl.userLim.s_vDCMinLim = nv_get_foc_params()->s_minDCVol;
-	gFoc_Ctrl.userLim.s_iDCeBrkLim = nv_get_foc_params()->s_iDCeBrkLim;
+	gFoc_Ctrl.userLim.s_iDCLim = min(mc_conf()->c.max_idc, gFoc_Ctrl.hwLim.s_iDCMax);
+	gFoc_Ctrl.userLim.s_motRPMLim = min(mc_conf()->c.max_rpm, gFoc_Ctrl.hwLim.s_motRPMMax);
+	gFoc_Ctrl.userLim.s_torqueLim = mc_conf()->c.max_torque;//MAX_TORQUE;
+	gFoc_Ctrl.userLim.s_PhaseCurrLim = min(mc_conf()->c.max_phase_curr, gFoc_Ctrl.hwLim.s_PhaseCurrMax);
+	gFoc_Ctrl.userLim.s_vDCMaxLim = mc_conf()->c.max_dc_vol;
+	gFoc_Ctrl.userLim.s_vDCMinLim = mc_conf()->c.min_dc_vol;
+	gFoc_Ctrl.userLim.s_iDCeBrkLim = 0xFF;
 	gFoc_Ctrl.userLim.s_PhaseVoleBrkLim = gFoc_Ctrl.hwLim.s_PhaseVolMax;
 }
 
@@ -234,14 +235,13 @@ void PMSM_FOC_CoreInit(void) {
 	gFoc_Ctrl.userLim.s_TorqueBrkLim = mc_get_ebrk_torque();
 	gFoc_Ctrl.params.n_modulation = CONFIG_SVM_MODULATION;//SVM_Modulation;
 	gFoc_Ctrl.params.n_PhaseFilterCeof = CONFIG_CURR_LP_CEOF;
-	gFoc_Ctrl.params.n_poles = nv_get_motor_params()->poles;//MOTOR_POLES;
-	gFoc_Ctrl.params.lq = nv_get_motor_params()->lq;
-	gFoc_Ctrl.params.ld = nv_get_motor_params()->ld;
-	gFoc_Ctrl.params.flux = nv_get_motor_params()->flux_linkage;
+	gFoc_Ctrl.params.n_poles = mc_conf()->m.poles;//MOTOR_POLES;
+	gFoc_Ctrl.params.lq = mc_conf()->m.lq;
+	gFoc_Ctrl.params.ld = mc_conf()->m.lq;
+	gFoc_Ctrl.params.flux = mc_conf()->m.flux;
 	gFoc_Ctrl.in.s_manualAngle = INVALID_ANGLE;
 	gFoc_Ctrl.in.s_dqAngle     = INVALID_ANGLE;
-	gFoc_Ctrl.in.b_fwEnable = nv_get_foc_params()->n_FwEnable;
-	gFoc_Ctrl.in.s_vDC = nv_get_foc_params()->s_maxDCVol;//(CONFIG_RATED_DC_VOL);
+	gFoc_Ctrl.in.s_vDC = sample_vbus_raw();//(CONFIG_RATED_DC_VOL);
 	gFoc_Ctrl.in.s_angleLast = INVALID_ANGLE;
 	gFoc_Ctrl.out.n_RunMode = CTRL_MODE_OPEN;
 	gFoc_Ctrl.out.f_vdqRation = 0;
@@ -1397,26 +1397,26 @@ bool PMSM_FOC_AutoHoldding(void) {
 
 static PI_Controller *_pid(u8 id) {
 	PI_Controller *pi = NULL;
-	if (id == PID_D_id) {
+	if (id == PID_ID_ID) {
 		pi = &gFoc_Ctrl.pi_id;
-	}else if (id == PID_Q_id) {
+	}else if (id == PID_IQ_ID) {
 		pi = &gFoc_Ctrl.pi_iq;
-	}else if (id == PID_TRQ_id) {
+	}else if (id == PID_VelLim_ID) {
 #ifndef CONFIG_SPEED_LADRC
 		pi = &gFoc_Ctrl.pi_vel_lim;
 #endif
-	}else if (id == PID_Spd_id) {
+	}else if (id == PID_Vel_ID) {
 #ifndef CONFIG_SPEED_LADRC
 		pi = &gFoc_Ctrl.pi_vel;
 #endif
-	}else if (id == PID_Lock_id) {
+	}else if (id == PID_AutoHold_ID) {
 		pi = &gFoc_Ctrl.pi_lock;
 	}
 	return pi;
 }
 
 void PMSM_FOC_SetPid(u8 id, float kp, float ki, float kd) {
-	if (id > PID_Max_id) {
+	if (id > PID_Max_ID) {
 		return;
 	}
 	PI_Controller *pi = _pid(id);
@@ -1428,7 +1428,7 @@ void PMSM_FOC_SetPid(u8 id, float kp, float ki, float kd) {
 }
 
 void PMSM_FOC_GetPid(u8 id, float *kp, float *ki, float *kd) {
-	if (id > PID_Max_id) {
+	if (id > PID_Max_ID) {
 		return;
 	}
 	PI_Controller *pi = _pid(id);

+ 0 - 11
Applications/foc/core/PMSM_FOC_Core.h

@@ -249,17 +249,6 @@ typedef struct {
 #define SECTOR_6  2u
 #endif
 
-typedef enum {
-	PID_D_id,
-	PID_Q_id,
-	PID_Spd_id,
-	PID_TRQ_id,
-	PID_Pow_id,
-	PID_Lock_id,
-	PID_FW_id,
-	PID_Max_id
-}PID_id_t;
-
 PMSM_FOC_Ctrl *PMSM_FOC_Get(void);
 void PMSM_FOC_CoreInit(void);
 bool PMSM_FOC_Schedule(void);

+ 1 - 1
Applications/foc/core/foc_observer.c

@@ -30,7 +30,7 @@ void foc_observer_init(void) {
 #endif
 }
 
-#define RPM_2_degree(rpm)  ((rpm) * 6.0f * nv_get_motor_params()->poles * FOC_CTRL_US)
+#define RPM_2_degree(rpm)  ((rpm) * 6.0f * mc_conf()->m.poles * FOC_CTRL_US)
 
 float foc_observer_update(float uAlp, float uBeta, float iAlp, float iBeta){
 	foc_obser.sensorless_est_angle = foc_obser.sensorless_angle + RPM_2_degree(foc_obser.sensorless_speed);

+ 6 - 6
Applications/foc/core/ladrc_observer.c

@@ -1,5 +1,5 @@
 #include "ladrc_observer.h"
-#include "app/nv_storage.h"
+#include "foc/mc_config.h"
 #include "math/fast_math.h"
 #include "libs/logger.h"
 
@@ -26,11 +26,11 @@ void ladrc_observer_init(float Wo, float vel_min, float lpf_cut_off) {
 	observer.vel_min = vel_min;
 	observer.ts = CONFIG_SENSORLESS_TS;
 	observer.lpf_ceof = lpf_cut_off * observer.ts;
-	observer.ld = nv_get_motor_params()->ld;
-	observer.lq = nv_get_motor_params()->lq;
-	observer.r = nv_get_motor_params()->r;
-	observer.poles = nv_get_motor_params()->poles;
-	observer.max_eVel = CONFIG_MAX_MOT_RPM/30.0f * M_PI * nv_get_motor_params()->poles;
+	observer.ld = mc_conf()->m.ld;
+	observer.lq = mc_conf()->m.lq;
+	observer.r = mc_conf()->m.rs;
+	observer.poles = mc_conf()->m.poles;
+	observer.max_eVel = CONFIG_MAX_MOT_RPM/30.0f * M_PI * mc_conf()->m.poles;
 	observer.max_z1 = CONFIG_MAX_PHASE_CURR * 10.0f;
 	observer.max_z2 = CONFIG_MAX_ACTIVE_EMF / observer.ld;
 	observer.Vel_El = 0;

+ 6 - 6
Applications/foc/core/smo_observer.c

@@ -1,4 +1,4 @@
-#include "app/nv_storage.h"
+#include "foc/mc_config.h"
 #include "math/fast_math.h"
 #include "PMSM_FOC_Core.h"
 #include "smo_observer.h"
@@ -16,15 +16,15 @@ void smo_observer_init(float pll_bandwith, float lpf_wc, float Ksmo, float Ksta)
 	smo.bandwith = pll_bandwith;
 	smo.pll_kp = pll_bandwith * 2;
 	smo.pll_ki = SQ(pll_bandwith);
-	smo.pll_max_rad_pers = CONFIG_MAX_MOT_RPM/30.0f * M_PI * nv_get_motor_params()->poles;
+	smo.pll_max_rad_pers = CONFIG_MAX_MOT_RPM/30.0f * M_PI * mc_conf()->m.poles;
 	smo.lpf_wc = lpf_wc;
 	smo.lpf_ceof = (lpf_wc*smo.ts);
 	smo.Ksmo = Ksmo;
 	smo.Ksta = Ksta;
-	smo.motor_r = nv_get_motor_params()->r;
-	smo.motor_ld = nv_get_motor_params()->ld;
-	smo.motor_lq = nv_get_motor_params()->lq;
-	smo.motor_poles = nv_get_motor_params()->poles;
+	smo.motor_r = mc_conf()->m.rs;
+	smo.motor_ld = mc_conf()->m.ld;
+	smo.motor_lq = mc_conf()->m.lq;
+	smo.motor_poles = mc_conf()->m.poles;
 	smo.dir_ccw = true;
 	PLL_Reset(&smo.pll, 0);
 	smo.pll.DT = smo.ts;

+ 11 - 11
Applications/foc/core/thro_torque.c

@@ -30,23 +30,23 @@ static __INLINE float gear_rpm_torque(u8 trq, s16 max) {
 }
 
 float thro_torque_gear_map(s16 rpm, u8 gear) {
-	mc_gear_t *_current_gear = mc_get_gear_config_by_gear(gear);
+	gear_t *_current_gear = mc_get_gear_config_by_gear(gear);
 	if (_current_gear == NULL) {
 		return 0;
 	}
 
-	if (rpm > _current_gear->n_max_speed) {
-		rpm = _current_gear->n_max_speed;
+	if (rpm > _current_gear->max_speed) {
+		rpm = _current_gear->max_speed;
 	}
 	if (rpm <= 1000) {
-		return gear_rpm_torque(_current_gear->n_torque[0], _current_gear->n_max_trq);
+		return gear_rpm_torque(_current_gear->torque[0], _current_gear->max_trq);
 	}
 
-	for (int i = 1; i < GEAR_SPEED_TRQ_NUM; i++) {
+	for (int i = 1; i < CONFIG_GEAR_SPEED_TRQ_NUM; i++) {
 		if (rpm <= 1000 * (i + 1)) { //线性插值
-			float trq1 = gear_rpm_torque(_current_gear->n_torque[i-1], _current_gear->n_max_trq);
+			float trq1 = gear_rpm_torque(_current_gear->torque[i-1], _current_gear->max_trq);
 			float min_rpm = (i * 1000);
-			float trq2 = gear_rpm_torque(_current_gear->n_torque[i], _current_gear->n_max_trq);
+			float trq2 = gear_rpm_torque(_current_gear->torque[i], _current_gear->max_trq);
 			float max_rpm = (i + 1) * 1000;
 			if (trq1 > trq2) {
 				return f_map_inv((float)rpm, min_rpm, max_rpm, trq2, trq1);
@@ -55,7 +55,7 @@ float thro_torque_gear_map(s16 rpm, u8 gear) {
 			}
 		}
 	}
-	return gear_rpm_torque(_current_gear->n_torque[GEAR_SPEED_TRQ_NUM-1], _current_gear->n_max_trq);
+	return gear_rpm_torque(_current_gear->torque[CONFIG_GEAR_SPEED_TRQ_NUM-1], _current_gear->max_trq);
 }
 
 /* 获取油门开度 */
@@ -102,7 +102,7 @@ static float _thro_torque_for_accelerate(float ration) {
 	if (ABS(torque_acc_) < 5) {
 		torque_acc_ = 0;
 	}else {
-		float acc_t = mc_get_gear_config()->n_accl_time;
+		float acc_t = mc_get_gear_config()->accl_time;
 		step = torque_acc_ / (acc_t + 0.00001f);
 	}
 	step_towards(&_torque.torque_acc_, torque_acc_, step);
@@ -153,9 +153,9 @@ static void thro_torque_request(void) {
 			*  加速时间缓慢变小可以防止突然大扭矩加速
 			*/
 			u16 now_ramp_time = eCtrl_get_torque_acc_time();
-			u16 next_ramp_time = mc_get_gear_config()->n_accl_time;
+			u16 next_ramp_time = mc_get_gear_config()->accl_time;
 			if (curr_rpm < CONFIG_ZERO_SPEED_RAMP_RMP) {
-				next_ramp_time = mc_get_gear_config()->n_zero_accl;
+				next_ramp_time = mc_get_gear_config()->zero_accl;
 			}
 			if (next_ramp_time == 0) {
 				next_ramp_time = 100;

+ 1 - 26
Applications/foc/foc_config.h

@@ -3,27 +3,8 @@
 #include "math/fast_math.h"
 #include "bsp/bsp.h"
 
-#define CONFIG_DEFAULT_IDC_LIM CONFIG_MAX_VBUS_CURRENT
-#define CONFIG_DEFAULT_RPM_LIM CONFIG_MAX_MOT_RPM
-
-#define CONFIG_DEFAULT_EPM_PHASE_CURR 100
-#define CONFIG_DEFAULT_EPM_RPM        200
-
-#define CONFIG_DEFAULT_EPM_BK_PHASE_CURR 50
-#define CONFIG_DEFAULT_EPM_BK_RPM        170
-
-#define CONFIG_DEFAULT_EBRK_TORQUE 0 //0:means disable ebrake
-#define CONFIG_DEFAULT_EBRK_IDC_LIM 15
+#define CONFIG_ACC_MIN_VOL 30
 #define CONFIG_SVM_MODULATION       1.0f//(1.0F/SQRT3_BY_2)
-#define CONFIG_BRK_SHUT_POWER_ENABLE 1
-#define CONFIG_AUTOHOLD_ENABLE 1
-#define CONFIG_DEFAULT_FW_ENABLE 1
-/* 转把 */
-#define CONFIG_THROTTLE_MIN_VALUE 0.4F   /* 转把最小电压,低于这个值,不给启动 */
-#define CONFIG_THROTTLE_START_VALUE 1.0f /* 转把启动电压 */
-#define CONFIG_THROTTLE_END_VALUE 4.0f /* 转把停止电压 */
-#define CONFIG_THROTTLE_MAX_VALUE 4.6F /* 转把最大电压,大于这个值,不给启动 */
-
 #define CONFIG_MIN_CRUISE_RPM 	  1000   /* 能启动定速巡航的最小速度 */
 #define CONFIG_CRUISE_EXIT_RPM    700    /* 自动推出定速巡航的最小速度*/
 #define CONFIG_MIN_RPM_FOR_EBRAKE 800 //进入电流回收的最小转速
@@ -41,8 +22,6 @@
 /* 电子刹车,动能回收,加速 */
 #define CONFIG_eCTRL_STEP_TS CONFIG_SPD_CTRL_MS     /* 斜率给定的step的时间值,单位 ms */
 #define CONFIG_eCTRL_Brake_TIME 1500     /* 捏住刹车的时间,超过这个时间启动ebrake,单位 ms */
-#define CONFIG_ACC_TIME 200
-#define CONFIG_DEC_TIME 10
 #define CONFIG_EBRK_RAMP_TIME 50
 #define CONFIG_AUTOHOLD_DETECT_TIME 2000
 
@@ -63,12 +42,8 @@
 
 #define CURRENT_LOOP_RAMP_COUNT 15 //1ms 完成ramp给定
 
-#define CONFIG_TORQUE_MODE_MIN_RPM 600
-
 #define CONFIG_CRUISE_ENABLE_ACCL 1 //定速巡航可以加速,油门回退,继续定速巡航
 
-#define CONFIG_TCS_ENABLE     false
-
 #define CONFIG_MAX_NEG_TORQUE 0.0F
 
 #define CONFIG_ENABLE_IAB_REC 1   // for phase current debug

+ 15 - 15
Applications/foc/limit.c

@@ -14,20 +14,20 @@ static bool _can_recovery = true;
 static s16 mot_temp, mos_temp;
 
 static void limiter_init(void) {
-	mc_limit_t *limiter = nv_get_limter();
-	for (int i = 0; i < TEMP_LIMITER_NUM; i++) {
-		motor_temp_lim[i].enter_pointer = limiter->motor[i].enter_pointer;
-		motor_temp_lim[i].exit_pointer = limiter->motor[i].exit_pointer;
-		motor_temp_lim[i].limit_value = limiter->motor[i].limit_value;
+	
+	for (int i = 0; i < CONFIG_TEMP_PROT_NUM; i++) {
+		motor_temp_lim[i].enter_pointer = mc_conf()->p_mot[i].enter_pointer;
+		motor_temp_lim[i].exit_pointer = mc_conf()->p_mot[i].exit_pointer;
+		motor_temp_lim[i].limit_value = mc_conf()->p_mot[i].limit_value;
 		sys_debug("%d-%d-%d\n", motor_temp_lim[i].enter_pointer, motor_temp_lim[i].exit_pointer, motor_temp_lim[i].limit_value);
-		mos_temp_lim[i].enter_pointer = limiter->mos[i].enter_pointer;
-		mos_temp_lim[i].exit_pointer = limiter->mos[i].exit_pointer;
-		mos_temp_lim[i].limit_value = limiter->mos[i].limit_value;
+		mos_temp_lim[i].enter_pointer = mc_conf()->p_mos[i].enter_pointer;
+		mos_temp_lim[i].exit_pointer = mc_conf()->p_mos[i].exit_pointer;
+		mos_temp_lim[i].limit_value = mc_conf()->p_mos[i].limit_value;
 		sys_debug("%d-%d-%d\n", mos_temp_lim[i].enter_pointer, mos_temp_lim[i].exit_pointer, mos_temp_lim[i].limit_value);
 	}
-	vol_under_lim[0].enter_pointer = limiter->vbus.enter_pointer;
-	vol_under_lim[0].exit_pointer = limiter->vbus.exit_pointer;
-	vol_under_lim[0].limit_value = limiter->vbus.limit_value;
+	vol_under_lim[0].enter_pointer = mc_conf()->p_vol.enter_pointer;
+	vol_under_lim[0].exit_pointer = mc_conf()->p_vol.exit_pointer;
+	vol_under_lim[0].limit_value = mc_conf()->p_vol.limit_value;
 	//sys_debug("%d-%d-%d\n", vol_under_lim[0].enter_pointer, vol_under_lim[0].exit_pointer, vol_under_lim[0].limit_value);
 	mot_temp = sample_motor_temp();
 	mos_temp = sample_mos_temp();
@@ -121,7 +121,7 @@ static u16 _motor_limit(void) {
 			}else if (_can_recovery){
 				mc_clr_critical_error(FOC_CRIT_MOTOR_TEMP_Lim);
 			}
-			mc_gear_t *gear = mc_get_gear_config();
+			gear_t *gear = mc_get_gear_config();
 
 			float prv_lim_value;
 			float next_lim_tmp;
@@ -139,7 +139,7 @@ static u16 _motor_limit(void) {
 			float delta_value = (prv_lim_value - (float)lim->limit_value);
 			float curr_value = prv_lim_value - (float)(temp - lim->enter_pointer)/delta_tmp * delta_value;
 			curr_value = fclamp(curr_value, 0, prv_lim_value);
-			lim_value = (u16)(((float)gear->n_max_trq * curr_value) / 100.0f);
+			lim_value = (u16)(((float)gear->max_trq * curr_value) / 100.0f);
 			mc_set_motor_lim_level(i + 1);
 			return lim_value;
 		}else {
@@ -178,7 +178,7 @@ static u16 _mos_limit(void) {
 			}else if (_can_recovery){
 				mc_clr_critical_error(FOC_CRIT_MOS_TEMP_Lim);
 			}
-			mc_gear_t *gear = mc_get_gear_config();
+			gear_t *gear = mc_get_gear_config();
 
 			float prv_lim_value;
 			float next_lim_tmp;
@@ -196,7 +196,7 @@ static u16 _mos_limit(void) {
 			float delta_value = (prv_lim_value - (float)lim->limit_value);
 			float curr_value = prv_lim_value - (float)(temp - lim->enter_pointer)/delta_tmp * delta_value;
 			curr_value = fclamp(curr_value, 0, prv_lim_value);
-			lim_value = (u16)(((float)gear->n_max_trq * curr_value) / 100.0f);
+			lim_value = (u16)(((float)gear->max_trq * curr_value) / 100.0f);
 			mc_set_mos_lim_level(i + 1);
 			return lim_value;
 		}else {

+ 524 - 0
Applications/foc/mc_config.c

@@ -0,0 +1,524 @@
+#include "foc/mc_config.h"
+#include "libs/utils.h"
+#include "libs/crc16.h"
+#include "app/nv_storage.h"
+
+mc_config conf;
+
+void mc_conf_default(void);
+
+static u8 *conf_buff = NULL;
+static int conf_len = 0;
+static int conf_idx = 0;
+
+bool mc_conf_begin_recv(int len) {
+	if (conf_buff) {
+		os_free(conf_buff);
+		conf_buff = NULL;
+	}
+	if (len > sizeof(mc_config)) {
+		return false;
+	}
+	conf_len = len;
+	conf_idx = 0;
+	conf_buff = os_alloc(len);
+	return conf_buff != NULL;
+}
+
+bool mc_conf_recv_data(u8 *buff, int offset, int len) {
+	if (offset != conf_idx || conf_buff == NULL) {
+		return false;
+	}
+	if (offset + len > conf_len) {
+		return false;
+	}
+	memcpy(conf_buff + offset, buff, len);
+	conf_idx = offset + len;
+	return true;
+}
+
+bool mc_conf_finish_recv(u16 crc) {
+	if (crc != crc16_get(conf_buff, conf_len)) {
+		return false;
+	}
+	mc_conf_decode_configs();
+	
+	conf.crc = crc16_get((u8 *)&conf, (u8 *)&conf.crc - (u8 *)&conf);
+
+	mc_conf_save();
+
+	if (conf_buff) {
+		os_free(conf_buff);
+		conf_buff = NULL;
+	}
+	return true;
+}
+static u16 crc16;
+bool mc_conf_begin_send(void) {
+	if (conf_buff) {
+		return true;
+	}
+	
+	conf_idx = 0;
+	conf_buff = os_alloc(sizeof(mc_config));
+	if (conf_buff) {
+		conf_len = mc_conf_encode_configs(conf_buff);
+		crc16 = crc16_get(conf_buff, conf_len);
+	}
+	return conf_buff != NULL;
+}
+
+
+int mc_conf_send_data(u8 *buff, int offset, int len) {
+	if (offset == 0 && !mc_conf_begin_send()) {
+		return -2;
+	}
+	if (conf_len == conf_idx) {
+		return 0;
+	}
+	if (offset != conf_idx || conf_buff == NULL) {
+		return -1;
+	}
+	len = min(len, conf_len - conf_idx);
+	memcpy(buff, conf_buff + offset, len);
+	conf_idx = (offset + len);
+	return len;
+}
+
+int mc_conf_finish_send(u8 *buff) {
+	if (conf_buff) {
+		os_free(conf_buff);
+		conf_buff = NULL;
+	}
+	encode_u16(buff, crc16);
+	return sizeof(u16);
+}
+
+void mc_conf_save(void) {
+	nv_write_config_block(0, (u8 *)&conf, sizeof(conf));
+	nv_write_config_block(1, (u8 *)&conf, sizeof(conf));
+}
+
+void mc_conf_load(void) {
+	mc_config temp;
+	nv_read_config_block(0, (u8 *)&temp, sizeof(temp));
+	u16 crc16 = crc16_get((u8 *)&temp, (u8 *)&temp.crc - (u8 *)&temp);
+	bool idx0_success = crc16 == temp.crc;
+	if (idx0_success) {
+		memcpy(&conf, &temp, sizeof(temp));
+	}
+	nv_read_config_block(1, (u8 *)&temp, sizeof(temp));
+	crc16 = crc16_get((u8 *)&temp, (u8 *)&temp.crc - (u8 *)&temp);
+	if (crc16 == temp.crc && !idx0_success) {
+		memcpy(&conf, &temp, sizeof(temp));
+		nv_write_config_block(0, (u8 *)&temp, sizeof(temp));
+	}else if (crc16 != temp.crc) {
+		if (idx0_success) {
+			nv_write_config_block(1, (u8 *)&conf, sizeof(conf));
+		}else {
+			mc_conf_default();
+			nv_write_config_block(0, (u8 *)&conf, sizeof(conf));
+			nv_write_config_block(1, (u8 *)&conf, sizeof(conf));
+		}
+	}
+}
+
+#define Gear_torque(l, t) conf.g_n[l].torque[t] = CONFIG_Gear##l##_Torque##t
+#define Gear_Config_default(l) \
+	do { \
+		conf.g_n[l].max_speed = CONFIG_Gear##l##_MaxSpeed;\
+		conf.g_n[l].max_idc = CONFIG_Gear##l##_MaxIdc;\
+		conf.g_n[l].max_trq = CONFIG_Gear##l##_MaxTorque;\
+		conf.g_n[l].zero_accl = CONFIG_Gear##l##_ZeroAccl;\
+		conf.g_n[l].accl_time = CONFIG_Gear##l##_NormalAccl;\
+		Gear_torque(l,0);Gear_torque(l,1);Gear_torque(l,2);Gear_torque(l,3);Gear_torque(l,4); \
+		Gear_torque(l,5);Gear_torque(l,6);Gear_torque(l,7);Gear_torque(l,8);Gear_torque(l,9); \
+	}while(0);
+
+#define GearLow_torque(l, t) conf.g_n[l].torque[t] = CONFIG_GearLow##l##_Torque##t
+#define GearLow_Config_default(l) \
+		do { \
+			conf.g_l[l].max_speed = CONFIG_GearLow##l##_MaxSpeed;\
+			conf.g_l[l].max_idc = CONFIG_GearLow##l##_MaxIdc;\
+			conf.g_l[l].max_trq = CONFIG_GearLow##l##_MaxTorque;\
+			conf.g_l[l].zero_accl = CONFIG_GearLow##l##_ZeroAccl;\
+			conf.g_l[l].accl_time = CONFIG_GearLow##l##_NormalAccl;\
+			GearLow_torque(l,0);GearLow_torque(l,1);GearLow_torque(l,2);GearLow_torque(l,3);GearLow_torque(l,4); \
+			GearLow_torque(l,5);GearLow_torque(l,6);GearLow_torque(l,7);GearLow_torque(l,8);GearLow_torque(l,9); \
+		}while(0);
+
+
+#define Limter_Config_default(item, type, n) \
+	do { \
+		conf.item[n].enter_pointer = CONFIG_Protect_##type##_Level##n##_Entry;\
+		conf.item[n].exit_pointer = CONFIG_Protect_##type##_Level##n##_Exit;\
+		conf.item[n].limit_value = CONFIG_Protect_##type##_Level##n##_Value;\
+	}while(0);
+
+#define EnReco_Config_default(n) \
+	do {\
+		conf.e_r[n].torque = CONFIG_EnergyRecovery_Level##n##_Torque;\
+		conf.e_r[n].time = CONFIG_EnergyRecovery_Level##n##_Time;\
+	}while(0);
+
+void mc_conf_default(void) {
+	conf.version = 0;
+	conf.m.poles = CONFIG_Motor_Poles;
+	conf.m.ld = CONFIG_Motor_Ld;
+	conf.m.lq = CONFIG_Motor_Lq;
+	conf.m.rs = CONFIG_Motor_Rs;
+	conf.m.nor_pll_band = CONFIG_Motor_PLLBand;
+	conf.m.epm_pll_band = CONFIG_Motor_EpmPLL;
+	conf.m.pos_pll_band = CONFIG_Motor_PosPLL;
+	conf.m.velocity_w = CONFIG_Motor_VelocityW;
+	conf.m.wheel_c = CONFIG_Motor_VelocityC;
+	conf.m.gear_ratio = CONFIG_Motor_GearRatio;
+	conf.m.max_fw_id = CONFIG_Motor_MaxFwDCurr;
+
+	conf.c.max_dc_vol = CONFIG_Foc_MaxDCVol;
+	conf.c.min_dc_vol = CONFIG_Foc_MinDCVol;
+	conf.c.max_phase_curr = CONFIG_Foc_MaxPhaseCurr;
+	conf.c.max_torque = CONFIG_Foc_MaxTorque;
+	conf.c.max_rpm = CONFIG_Foc_MaxRPM;
+	conf.c.max_epm_rpm = CONFIG_Foc_MaxEPMRPM;
+	conf.c.max_epm_torque = CONFIG_Foc_MaxEPMTorque;
+	conf.c.max_epm_back_rpm = CONFIG_Foc_MaxEPMRPMBk;
+	conf.c.max_epm_back_torque = CONFIG_Foc_MaxEPMTorqueBk;
+	conf.c.max_ebrk_torque = CONFIG_Foc_MaxEbrkTorque;
+	conf.c.max_idc = CONFIG_Foc_MaxIDC;
+	conf.c.dq_loop_bandwith = CONFIG_Foc_CurrCtrlBandWith;
+	conf.c.thro_start_vol = CONFIG_Foc_ThroStartVol;
+	conf.c.thro_end_vol = CONFIG_Foc_ThroEndVol;
+	conf.c.thro_max_vol = CONFIG_Foc_ThroMaxVol;
+	conf.c.thro_min_vol = CONFIG_Foc_ThroMinVol;
+	conf.c.thro_dec_time = CONFIG_Foc_ThroDecTime;
+
+	conf.c.pid[PID_IQ_ID].kp = (float)conf.c.dq_loop_bandwith * 2.0f * 3.14f * conf.m.ld;
+	conf.c.pid[PID_IQ_ID].ki = conf.m.rs / conf.m.ld;
+	conf.c.pid[PID_IQ_ID].kd = 0;
+
+	conf.c.pid[PID_IQ_ID].kp = (float)conf.c.dq_loop_bandwith * 2.0f * 3.14f * conf.m.lq;
+	conf.c.pid[PID_IQ_ID].ki = conf.m.rs / conf.m.lq;
+	conf.c.pid[PID_IQ_ID].kd = 0;
+
+	conf.c.pid[PID_VelLim_ID].kp = CONFIG_Foc_PID_VelLim_Kp;
+	conf.c.pid[PID_VelLim_ID].ki = CONFIG_Foc_PID_VelLim_Ki;
+	conf.c.pid[PID_VelLim_ID].kd = CONFIG_Foc_PID_VelLim_Kd;
+
+	conf.c.pid[PID_Vel_ID].kp = CONFIG_Foc_PID_VelCtrl_Kp;
+	conf.c.pid[PID_Vel_ID].ki = CONFIG_Foc_PID_VelCtrl_Ki;
+	conf.c.pid[PID_Vel_ID].kd = CONFIG_Foc_PID_VelCtrl_Kd;
+
+	conf.c.pid[PID_AutoHold_ID].kp = CONFIG_Foc_PID_Autohold_Kp;
+	conf.c.pid[PID_AutoHold_ID].kp = CONFIG_Foc_PID_Autohold_Ki;
+	conf.c.pid[PID_AutoHold_ID].ki = CONFIG_Foc_PID_Autohold_Kd;
+
+	conf.c.pid[PID_IDCLim_ID].kp = CONFIG_Foc_PID_IDCLim_Kp;
+	conf.c.pid[PID_IDCLim_ID].ki = CONFIG_Foc_PID_IDCLim_Ki;
+	conf.c.pid[PID_IDCLim_ID].kd = CONFIG_Foc_PID_IDCLim_Kd;
+
+	conf.s.auto_hold = CONFIG_Settings_AutoHold;
+	conf.s.brk_shut_power = CONFIG_Settings_BrkShutPower;
+	conf.s.tcs_enable = CONFIG_Settings_TcsEnable;
+
+	Gear_Config_default(0);
+	Gear_Config_default(1);
+	Gear_Config_default(2);
+	Gear_Config_default(3);
+	GearLow_Config_default(0);
+	GearLow_Config_default(1);
+	GearLow_Config_default(2);
+	GearLow_Config_default(3);
+
+	Limter_Config_default(p_mot, Motor, 0);
+	Limter_Config_default(p_mot, Motor, 1);
+	Limter_Config_default(p_mot, Motor,2);
+
+	Limter_Config_default(p_mos, MosFet, 0);
+	Limter_Config_default(p_mos, MosFet, 1);
+	Limter_Config_default(p_mos, MosFet, 2);
+
+	conf.p_vol.enter_pointer = CONFIG_Protect_Voltage_Level0_Entry;
+	conf.p_vol.exit_pointer = CONFIG_Protect_Voltage_Level0_Exit;
+	conf.p_vol.limit_value = CONFIG_Protect_Voltage_Level0_Value;
+
+	EnReco_Config_default(0);
+	EnReco_Config_default(1);
+	EnReco_Config_default(2);
+	EnReco_Config_default(3);
+	EnReco_Config_default(4);
+	EnReco_Config_default(5);
+	EnReco_Config_default(6);
+	EnReco_Config_default(7);
+	EnReco_Config_default(8);
+	EnReco_Config_default(9);
+
+	conf.crc = crc16_get((u8 *)&conf, (u8 *)&conf.crc - (u8 *)&conf);
+}
+
+
+void mc_conf_init(void) {
+	mc_conf_load();
+}
+
+int mc_conf_decode_motor(u8 *buff) {
+	u8 *ori = buff;
+	conf.m.poles = decode_u8(buff++);
+	conf.m.ld = decode_float(buff);buff += 4;
+	conf.m.lq = decode_float(buff);buff += 4;
+	conf.m.rs = decode_float(buff);buff += 4;
+	conf.m.flux = decode_float(buff);buff +=4;
+	conf.m.nor_pll_band = (float)decode_u16(buff); buff += 2;
+	conf.m.epm_pll_band = (float)decode_u16(buff); buff += 2;
+	conf.m.pos_pll_band = (float)decode_u16(buff); buff += 2;
+	conf.m.velocity_w = decode_u16(buff);buff += 2;
+	conf.m.wheel_c = decode_u16(buff);buff += 2;
+	conf.m.gear_ratio = decode_float(buff);buff += 4;
+	conf.m.max_fw_id = decode_u16(buff); buff += 2;
+	return buff - ori;
+}
+
+int mc_conf_encode_motor(u8 *buff) {
+	u8 *ori = buff;
+	encode_u8(buff++, conf.m.poles);
+	encode_float(buff, conf.m.ld);buff += 4;
+	encode_float(buff, conf.m.lq);buff += 4;
+	encode_float(buff, conf.m.rs);buff += 4;
+	encode_float(buff, conf.m.flux);buff +=4;
+	encode_u16(buff, (u16)conf.m.nor_pll_band); buff += 2;
+	encode_u16(buff, (u16)conf.m.epm_pll_band); buff += 2;
+	encode_u16(buff, (u16)conf.m.pos_pll_band); buff += 2;
+	encode_u16(buff, conf.m.velocity_w);buff += 2;
+	encode_u16(buff, conf.m.wheel_c);buff += 2;
+	encode_float(buff, conf.m.gear_ratio);buff += 4;
+	encode_u16(buff, conf.m.max_fw_id); buff += 4;
+	return buff - ori;
+}
+
+
+int mc_conf_decode_pid(pid_t *pid, u8 *buff) {
+	u8 *ori = buff;
+	pid->kp = decode_float(buff);buff += 4;
+	pid->ki = decode_float(buff);buff += 4;
+	pid->kd = decode_float(buff);buff += 4;
+	return buff - ori;
+}
+
+int mc_conf_encode_pid(pid_t *pid, u8 *buff) {
+	u8 *ori = buff;
+	encode_float(buff, pid->kp);buff += 4;
+	encode_float(buff, pid->ki);buff += 4;
+	encode_float(buff, pid->kd);buff += 4;
+	return buff - ori;
+}
+
+int mc_conf_decode_controler(u8 *buff) {
+	u8 *ori = buff;
+	conf.c.max_dc_vol = decode_s16(buff);buff += 2;
+	conf.c.min_dc_vol = decode_s16(buff);buff += 2;
+	conf.c.max_phase_curr = decode_s16(buff);buff += 2;
+	conf.c.max_torque = decode_s16(buff);buff += 2;
+	conf.c.max_rpm = decode_s16(buff);buff += 2;
+	conf.c.max_epm_rpm = decode_s16(buff);buff += 2;
+	conf.c.max_epm_torque = decode_s16(buff);buff += 2;
+	conf.c.max_epm_back_rpm = decode_s16(buff);buff += 2;
+	conf.c.max_epm_back_torque = decode_s16(buff);buff += 2;
+	conf.c.max_ebrk_torque = decode_s16(buff);buff += 2;
+	conf.c.max_idc = decode_s16(buff);buff += 2;
+	conf.c.dq_loop_bandwith = decode_s16(buff);buff += 2;
+	conf.c.thro_start_vol = decode_float(buff);buff += 4;
+	conf.c.thro_end_vol = decode_float(buff);buff += 4;
+	conf.c.thro_max_vol = decode_float(buff);buff += 4;
+	conf.c.thro_min_vol = decode_float(buff);buff += 4;
+	conf.c.thro_dec_time = decode_u16(buff);buff += 2;
+	buff += mc_conf_decode_pid(&conf.c.pid[PID_VelLim_ID], buff);
+	buff += mc_conf_decode_pid(&conf.c.pid[PID_Vel_ID], buff);
+	buff += mc_conf_decode_pid(&conf.c.pid[PID_AutoHold_ID], buff);
+	buff += mc_conf_decode_pid(&conf.c.pid[PID_IDCLim_ID], buff);
+	return buff - ori;
+}
+
+int mc_conf_encode_controler(u8 *buff) {
+	u8 *ori = buff;
+	encode_s16(buff, conf.c.max_dc_vol);buff += 2;
+	encode_s16(buff, conf.c.min_dc_vol);buff += 2;
+	encode_s16(buff, conf.c.max_phase_curr);buff += 2;
+	encode_s16(buff, conf.c.max_torque);buff += 2;
+	encode_s16(buff, conf.c.max_rpm);buff += 2;
+	encode_s16(buff, conf.c.max_epm_rpm);buff += 2;
+	encode_s16(buff, conf.c.max_epm_torque);buff += 2;
+	encode_s16(buff, conf.c.max_epm_back_rpm);buff += 2;
+	encode_s16(buff, conf.c.max_epm_back_torque);buff += 2;
+	encode_s16(buff, conf.c.max_ebrk_torque);buff += 2;
+	encode_s16(buff, conf.c.max_idc);buff += 2;
+	encode_s16(buff, conf.c.dq_loop_bandwith);buff += 2;
+	encode_float(buff, conf.c.thro_start_vol);buff += 4;
+	encode_float(buff, conf.c.thro_end_vol);buff += 4;
+	encode_float(buff, conf.c.thro_max_vol);buff += 4;
+	encode_float(buff, conf.c.thro_min_vol);buff += 4;
+	encode_u16(buff, conf.c.thro_dec_time);buff += 2;
+	buff += mc_conf_encode_pid(&conf.c.pid[PID_VelLim_ID], buff);
+	buff += mc_conf_encode_pid(&conf.c.pid[PID_Vel_ID], buff);
+	buff += mc_conf_encode_pid(&conf.c.pid[PID_AutoHold_ID], buff);
+	buff += mc_conf_encode_pid(&conf.c.pid[PID_IDCLim_ID], buff);
+	return buff - ori;
+}
+
+
+int mc_conf_decode_setting(u8 *buff) {
+	u8 *ori = buff;
+	conf.s.auto_hold = decode_u8(buff++)==1?true:false;
+	conf.s.brk_shut_power = decode_u8(buff++)==1?true:false;
+	conf.s.tcs_enable = decode_u8(buff++)==1?true:false;
+	return buff - ori;
+}
+
+int mc_conf_encode_setting(u8 *buff) {
+	u8 *ori = buff;
+	encode_u8(buff++, conf.s.auto_hold?1:0);
+	encode_u8(buff++, conf.s.brk_shut_power?1:0);
+	encode_u8(buff++, conf.s.tcs_enable?1:0);
+	return buff - ori;
+}
+
+
+int mc_conf_decode_gear(gear_t *g , u8 *buff) {
+	u8 *ori = buff;
+	for (int i = 0; i < CONFIG_MAX_GEARS; i++) {
+		g[i].max_speed = decode_s16(buff); buff += 2;
+		g[i].max_trq = decode_s16(buff); buff += 2;
+		g[i].max_idc = decode_s16(buff); buff += 2;
+		g[i].zero_accl = decode_u16(buff); buff += 2;
+		g[i].accl_time = decode_u16(buff); buff += 2;
+		for (int j = 0; j < CONFIG_GEAR_SPEED_TRQ_NUM; j++) {
+			g[i].torque[j] = decode_u8(buff++);
+		}
+	}
+	return buff - ori;
+}
+
+int mc_conf_encode_gear(gear_t *g, u8 *buff) {
+	u8 *ori = buff;
+	for (int i = 0; i < CONFIG_MAX_GEARS; i++) {
+		encode_s16(buff, g[i].max_speed); buff += 2;
+		encode_s16(buff, g[i].max_trq); buff += 2;
+		encode_s16(buff, g[i].max_idc); buff += 2;
+		encode_u16(buff, g[i].zero_accl); buff += 2;
+		encode_u16(buff, g[i].accl_time); buff += 2;
+		for (int j = 0; j < CONFIG_GEAR_SPEED_TRQ_NUM; j++) {
+			encode_u8(buff++, g[i].torque[j]);
+		}
+	}
+	return buff - ori;
+}
+
+
+int mc_conf_decode_limiter(limiter_t *l, int size, u8 *buff) {
+	u8 *ori = buff;
+	for (int i = 0; i < size; i++) {
+		l->enter_pointer = decode_s16(buff);buff += 2;
+		l->exit_pointer = decode_s16(buff);buff += 2;
+		l->limit_value = decode_s16(buff);buff += 2;
+	}
+	return buff - ori;
+}
+
+int mc_conf_encode_limiter(limiter_t *l, int size, u8 *buff) {
+	u8 *ori = buff;
+	for (int i = 0; i < size; i++) {
+		encode_s16(buff, l->enter_pointer);buff += 2;
+		encode_s16(buff, l->exit_pointer);buff += 2;
+		encode_s16(buff, l->limit_value);buff += 2;
+	}
+	return buff - ori;
+}
+
+
+int mc_conf_decode_engreco(u8 *buff) {
+	u8 *ori = buff;
+	for (int i = 0; i < CONFIG_EBRK_LVL_NUM; i++) {
+		conf.e_r[i].torque = decode_s16(buff); buff += 2;
+		conf.e_r[i].time = decode_s16(buff); buff += 2;
+	}
+	return buff - ori;
+}
+
+int mc_conf_encode_engreco(u8 *buff) {
+	u8 *ori = buff;
+	for (int i = 0; i < CONFIG_EBRK_LVL_NUM; i++) {
+		encode_s16(buff, conf.e_r[i].torque); buff += 2;
+		encode_s16(buff, conf.e_r[i].time); buff += 2;
+	}
+	return buff - ori;
+}
+
+void mc_conf_decode_configs(void) {
+	u8 *buff = conf_buff;
+	conf.version = decode_u8(buff++);
+	buff += mc_conf_decode_motor(buff);
+	buff += mc_conf_decode_controler(buff);
+	buff += mc_conf_decode_setting(buff);
+	buff += mc_conf_decode_gear(conf.g_n, buff);
+	buff += mc_conf_decode_gear(conf.g_l, buff);
+	buff += mc_conf_decode_limiter(conf.p_mot, CONFIG_TEMP_PROT_NUM, buff);
+	buff += mc_conf_decode_limiter(conf.p_mos, CONFIG_TEMP_PROT_NUM, buff);
+	buff += mc_conf_decode_limiter(&conf.p_vol, 1, buff);
+	buff += mc_conf_decode_engreco(buff);
+}
+
+int mc_conf_encode_configs(u8 *buff) {
+	u8 *ori = buff;
+	encode_u8(buff++, conf.version);
+	buff += mc_conf_encode_motor(buff);
+	buff += mc_conf_encode_controler(buff);
+	buff += mc_conf_encode_setting(buff);
+	buff += mc_conf_encode_gear(conf.g_n, buff);
+	buff += mc_conf_encode_gear(conf.g_l, buff);
+	buff += mc_conf_encode_limiter(conf.p_mot, CONFIG_TEMP_PROT_NUM, buff);
+	buff += mc_conf_encode_limiter(conf.p_mos, CONFIG_TEMP_PROT_NUM, buff);
+	buff += mc_conf_encode_limiter(&conf.p_vol, 1, buff);
+	buff += mc_conf_encode_engreco(buff);
+	return buff - ori;
+}
+
+void mc_conf_set_pid(u8 id, pid_t *pid) {
+	conf.c.pid[id] = *pid;
+}
+
+void mc_conf_get_pid(u8 id, pid_t *pid) {
+	*pid = conf.c.pid[id];
+}
+
+bool mc_conf_set_gear(u8 mode, u8 *data, int len) {
+	gear_t *g = conf.g_n;
+	if (mode == 0) {
+		g = conf.g_l;
+	}
+	if (mc_conf_decode_gear(g, data) > len) {
+		return false;
+	}
+	return true;
+}
+
+int mc_conf_get_gear(u8 mode, u8 *data) {
+	gear_t *g = conf.g_n;
+	if (mode == 0) {
+		g = conf.g_l;
+	}
+	return mc_conf_decode_gear(g, data);
+}
+
+bool mc_conf_set_limter(u8 *data, int len) {
+	int l = mc_conf_decode_limiter(conf.p_mot, CONFIG_TEMP_PROT_NUM, data);
+	l += mc_conf_decode_limiter(conf.p_mos, CONFIG_TEMP_PROT_NUM, data + l);
+	l += mc_conf_decode_limiter(&conf.p_vol, 1, data + l);
+	return len>=l;
+}
+
+int mc_conf_get_limter(u8 *data) {
+	u8 *ori = data;
+	data += mc_conf_decode_limiter(conf.p_mot, CONFIG_TEMP_PROT_NUM, data);
+	data += mc_conf_decode_limiter(conf.p_mos, CONFIG_TEMP_PROT_NUM, data);
+	data += mc_conf_decode_limiter(&conf.p_vol, 1, data);
+	return data-ori;
+}

+ 127 - 0
Applications/foc/mc_config.h

@@ -0,0 +1,127 @@
+#ifndef _MC_CONFIG_H__
+#define _MC_CONFIG_H__
+
+#include "os/os_types.h"
+#include "autogen_config.h"
+
+#define CONFIG_MAX_GEARS 4
+#define CONFIG_TEMP_PROT_NUM 3
+#define CONFIG_GEAR_SPEED_TRQ_NUM 10
+#define CONFIG_EBRK_LVL_NUM 10
+
+typedef enum {
+	PID_ID_ID,
+	PID_IQ_ID,
+	PID_Vel_ID,
+	PID_VelLim_ID,
+	PID_IDCLim_ID,
+	PID_AutoHold_ID,
+	PID_Max_ID
+}PID_id_t;
+
+typedef struct
+{
+	u8 poles;
+	float ld;
+	float lq;
+	float rs;
+	float flux;
+	float nor_pll_band;
+	float epm_pll_band;
+	float pos_pll_band;
+	int velocity_w;
+	int wheel_c;
+	float gear_ratio;
+	u16	max_fw_id;
+}motor_t;
+
+typedef struct {
+	float kp;
+	float ki;
+	float kd;
+}pid_t;
+
+typedef struct {
+	s16 max_dc_vol;
+	s16 min_dc_vol;
+	s16 max_phase_curr;
+	s16 max_torque;
+	s16 max_rpm;
+	s16 max_epm_rpm;
+	s16 max_epm_torque;
+	s16 max_epm_back_rpm;
+	s16 max_epm_back_torque;
+	s16 max_ebrk_torque;
+	s16 max_idc;
+	s16 dq_loop_bandwith;
+	float thro_start_vol;
+	float thro_end_vol;
+	float thro_min_vol;
+	float thro_max_vol;
+	u16   thro_dec_time;
+	pid_t pid[PID_Max_ID];
+}controller_t;
+
+typedef struct {
+	bool auto_hold;
+	bool brk_shut_power;
+	bool tcs_enable;
+}settings_t;
+
+typedef struct {
+	s16 max_speed; //最大速度, rpm
+	s16 max_trq;   //最大扭矩
+	s16 max_idc;   //最大母线电流
+	u16 zero_accl; //零速启动扭矩给定时间,防止翘头
+	u16 accl_time; //加速的扭矩斜坡时间
+	u8  torque[CONFIG_GEAR_SPEED_TRQ_NUM]; //1000, 2000, 3000... RPM 最大给定扭矩的百分比(最大扭矩的百分比)
+}gear_t;
+
+typedef struct {
+	s16 enter_pointer;
+	s16 exit_pointer;
+	s16 limit_value;
+}limiter_t;
+
+typedef struct {
+	s16 torque;
+	u16 time;
+}eng_reco_l_t;
+
+typedef struct {
+	u8 version;
+	motor_t m;
+	controller_t c;
+	settings_t s;
+	gear_t g_n[CONFIG_MAX_GEARS];
+	gear_t g_l[CONFIG_MAX_GEARS];
+	limiter_t p_mot[CONFIG_TEMP_PROT_NUM];
+	limiter_t p_mos[CONFIG_TEMP_PROT_NUM];
+	limiter_t p_vol;
+	eng_reco_l_t e_r[CONFIG_EBRK_LVL_NUM];
+	u16 crc;
+}mc_config;
+
+extern mc_config conf;
+bool mc_conf_begin_recv(int len);
+bool mc_conf_recv_data(u8 *buff, int offset, int len);
+bool mc_conf_finish_recv(u16 crc);
+bool mc_conf_begin_send(void);
+int mc_conf_send_data(u8 *buff, int offset, int len);
+int mc_conf_finish_send(u8 *buff);
+void mc_conf_load(void);
+void mc_conf_decode_configs(void);
+int mc_conf_encode_configs(u8 *buff);
+void mc_conf_save(void);
+void mc_conf_set_pid(u8 id, pid_t *pid);
+void mc_conf_get_pid(u8 id, pid_t *pid);
+bool mc_conf_set_gear(u8 mode, u8 *data, int len);
+int mc_conf_get_gear(u8 mode, u8 *data);
+bool mc_conf_set_limter(u8 *data, int len);
+int mc_conf_get_limter(u8 *data);
+void mc_conf_init(void);
+static mc_config *mc_conf(void) {
+	return &conf;
+}
+#endif /* _MC_CONFIG_H__ */
+

+ 1 - 0
Applications/foc/mc_error.c

@@ -2,6 +2,7 @@
 #include "libs/logger.h"
 #include "app/nv_storage.h"
 #include "libs/crc16.h"
+#include "libs/utils.h"
 
 static u8 page_buff[one_page_size];
 static u8 page_buff_runtime[one_page_size];

+ 7 - 7
Applications/foc/motor/encoder.c

@@ -3,7 +3,7 @@
 #include "foc/motor/encoder.h"
 #include "foc/motor/motor_param.h"
 #include "libs/logger.h"
-#include "app/nv_storage.h"
+#include "foc/mc_config.h"
 #include "math/fast_math.h"
 #if CONFIG_MOT_TYPE==MOTOR_BLUESHARK_OLD
 #include "encoder_off2.h"
@@ -43,7 +43,7 @@ static void _init_pll(void) {
 	g_encoder.est_pll.DT = FOC_CTRL_US;
 	g_encoder.est_pll.max_wp = g_encoder.cpr;
 	g_encoder.pll_bandwidth = 0;
-	g_encoder.pll_bandwidth_shadow = nv_get_motor_params()->est_pll_band;
+	g_encoder.pll_bandwidth_shadow = mc_conf()->m.nor_pll_band;
 	encoder_pll_update_gain();
 	PLL_Reset(&g_encoder.est_pll, (float)_abi_count());
 }
@@ -66,7 +66,7 @@ void encoder_set_bandwidth(float bandwidth) {
 void encoder_init_clear(void) {
 	g_encoder.cpr = ENC_MAX_RES;
 	g_encoder.enc_offset = 0;
-	g_encoder.motor_poles = nv_get_motor_params()->poles;
+	g_encoder.motor_poles = mc_conf()->m.poles;
 	g_encoder.b_index_found = false;
 	g_encoder.direction = POSITIVE;
 	g_encoder.abi_angle = 0.0f;
@@ -93,18 +93,18 @@ void encoder_lock_position(bool enable) {
 	if (g_encoder.b_lock_pos != enable) {
 		g_encoder.b_lock_pos = enable;
 		if (enable) {
-			encoder_set_bandwidth(nv_get_motor_params()->pos_lock_pll_band);
+			encoder_set_bandwidth(mc_conf()->m.pos_pll_band);
 		}else {
-			encoder_set_bandwidth(nv_get_motor_params()->est_pll_band);
+			encoder_set_bandwidth(mc_conf()->m.nor_pll_band);
 		}
 	}
 }
 
 void encoder_epm_pll_band(bool epm) {
 	if (epm) {
-		encoder_set_bandwidth(nv_get_motor_params()->epm_pll_band);
+		encoder_set_bandwidth(mc_conf()->m.epm_pll_band);
 	}else {
-		encoder_set_bandwidth(nv_get_motor_params()->est_pll_band);
+		encoder_set_bandwidth(mc_conf()->m.nor_pll_band);
 	}
 }
 

+ 57 - 56
Applications/foc/motor/motor.c

@@ -38,7 +38,7 @@ static void _encoder_zero_off_timer_handler(shark_timer_t *);
 static shark_timer_t _encoder_zero_off_timer = TIMER_INIT(_encoder_zero_off_timer, _encoder_zero_off_timer_handler);
 static void _led_off_timer_handler(shark_timer_t *);
 static shark_timer_t _led_off_timer = TIMER_INIT(_led_off_timer, _led_off_timer_handler);
-static motor_t motor = {
+static m_contrl_t motor = {
 	.s_direction = POSITIVE,
 	.n_gear = 0,
 	.b_is96Mode = false,
@@ -47,19 +47,18 @@ static motor_t motor = {
 	.motor_lim = 0,
 	.b_ind_start = false,
 	.u_set.idc_lim = IDC_USER_LIMIT_NONE,
-	.u_set.ebrk_torque = IDC_USER_LIMIT_NONE,
-	.u_set.ebrk_time = MAX_U16,
-	.u_set.n_brkShutPower = MAX_U8,
-	.u_set.b_tcs = CONFIG_TCS_ENABLE,
+	.u_set.ebrk_lvl = 0,
+	.u_set.n_brkShutPower = CONFIG_Settings_BrkShutPower,
+	.u_set.b_tcs = CONFIG_Settings_TcsEnable,
 };
 /* 无感运行的挡位,限制速度,母线电流,最大扭矩 */
-static mc_gear_t sensorless_gear = {
-	.n_max_speed = CONFIG_SENSORLESS_MAX_SPEED,
-	.n_max_trq = CONFIG_SENSORLESS_MAX_TORQUE,
-	.n_max_idc = CONFIG_SENSORLESS_MAX_IDC,
-	.n_zero_accl = 1500,
-	.n_accl_time = 1500,
-	.n_torque = {100, 80, 60, 0, 0, 0, 0, 0, 0, 0},
+static gear_t sensorless_gear = {
+	.max_speed = CONFIG_SENSORLESS_MAX_SPEED,
+	.max_trq = CONFIG_SENSORLESS_MAX_TORQUE,
+	.max_idc = CONFIG_SENSORLESS_MAX_IDC,
+	.zero_accl = 1500,
+	.accl_time = 1500,
+	.torque = {100, 80, 60, 0, 0, 0, 0, 0, 0, 0},
 };
 static runtime_node_t mc_error;
 
@@ -95,19 +94,19 @@ static void MC_Check_MosVbusThrottle(void) {
 	float abc[3];
 	get_phase_vols_filtered(abc);
 	int vbus_vol = get_vbus_int();
-	if (vbus_vol > nv_get_foc_params()->s_maxDCVol) {
+	if (vbus_vol > mc_conf()->c.max_dc_vol) {
 		mc_set_critical_error(FOC_CRIT_OV_Vol_Err);
 	}
-	if (vbus_vol <= nv_get_foc_params()->s_minDCVol) {
+	if (vbus_vol <= mc_conf()->c.min_dc_vol) {
 		mc_set_critical_error(FOC_CRIT_UN_Vol_Err);
 	}
 
 	vbus_vol = get_acc_vol();
 	sys_debug("acc vol %d\n", vbus_vol);
-	if (vbus_vol >= nv_get_foc_params()->s_maxDCVol) {
+	if (vbus_vol >= mc_conf()->c.max_dc_vol) {
 		mc_set_critical_error(FOC_CRIT_ACC_OV_Err);
 	}
-	if (vbus_vol <= nv_get_foc_params()->s_minDCVol) {
+	if (vbus_vol <= CONFIG_ACC_MIN_VOL) {
 		mc_set_critical_error(FOC_CRIT_ACC_Un_Err);
 	}
 	if (throttle_is_all_error()) {
@@ -208,7 +207,7 @@ static void _mc_internal_init(u8 mode, bool start) {
 	motor.b_limit_pending = false;
 	motor.f_epm_trq = 0;
 	motor.f_epm_vel = 0;
-	motor.s_vbus_hw_min = nv_get_foc_params()->s_minDCVol;
+	motor.s_vbus_hw_min = mc_conf()->c.min_dc_vol;
 }
 
 static void _led_off_timer_handler(shark_timer_t *t) {
@@ -217,26 +216,26 @@ static void _led_off_timer_handler(shark_timer_t *t) {
 
 
 static void mc_gear_vmode_changed(void) {
-	mc_gear_t *gears = mc_get_gear_config();
+	gear_t *gears = mc_get_gear_config();
 	if (gears != &sensorless_gear) {
-		sensorless_gear.n_max_trq = gears->n_max_trq;
+		sensorless_gear.max_trq = gears->max_trq;
 	}else { //slowly changed
 		eRamp_set_time(&(PMSM_FOC_Get()->rtLim.rpmLimRamp), CONFIG_SENSORLESS_RAMP_TIME, CONFIG_SENSORLESS_RAMP_TIME);
 		eRamp_set_time(&(PMSM_FOC_Get()->rtLim.DCCurrLimRamp), CONFIG_SENSORLESS_RAMP_TIME, CONFIG_SENSORLESS_RAMP_TIME);
 	}
-	PMSM_FOC_SpeedLimit(gears->n_max_speed);
-	PMSM_FOC_DCCurrLimit(min(gears->n_max_idc, motor.u_set.idc_lim));
-	PMSM_FOC_TorqueLimit(gears->n_max_trq);
+	PMSM_FOC_SpeedLimit(gears->max_speed);
+	PMSM_FOC_DCCurrLimit(min(gears->max_idc, motor.u_set.idc_lim));
+	PMSM_FOC_TorqueLimit(gears->max_trq);
 }
 
 static s16 mc_get_gear_idc_limit(void) {
 	if (!foc_observer_is_encoder()) {
-		return sensorless_gear.n_max_idc;
+		return sensorless_gear.max_idc;
 	}
 	if (motor.b_is96Mode) {
-		return nv_get_gear_configs()->gears_96[motor.n_gear].n_max_idc;
+		return mc_conf()->g_n[motor.n_gear].max_idc;
 	}else {
-		return nv_get_gear_configs()->gears_48[motor.n_gear].n_max_idc;
+		return mc_conf()->g_l[motor.n_gear].max_idc;
 	}
 }
 
@@ -251,7 +250,7 @@ void mc_init(void) {
 	thro_torque_init();
 	mc_detect_vbus_mode();
 	PMSM_FOC_CoreInit();
-	eCtrl_init(mc_get_gear_config()->n_zero_accl, nv_get_foc_params()->n_dec_time);
+	eCtrl_init(mc_get_gear_config()->zero_accl, mc_conf()->c.thro_dec_time);
 	mc_gpio_init();
 	MC_Check_MosVbusThrottle();
 	sched_timer_enable(CONFIG_SPD_CTRL_US);
@@ -261,24 +260,24 @@ void mc_init(void) {
 	shark_timer_post(&_led_off_timer, 5000);
 }
 
-motor_t * mc_params(void) {
+m_contrl_t * mc_params(void) {
 	return &motor;
 }
 
-mc_gear_t *mc_get_gear_config_by_gear(u8 n_gear) {
-	mc_gear_t *gears;
+gear_t *mc_get_gear_config_by_gear(u8 n_gear) {
+	gear_t *gears;
 	if (!foc_observer_is_encoder()) { //无感模式,受限运行
 		return &sensorless_gear;
 	}
 	if (motor.b_is96Mode) {
-		gears = &nv_get_gear_configs()->gears_96[0];
+		gears = &mc_conf()->g_n[0];
 	}else {
-		gears = &nv_get_gear_configs()->gears_48[0];
+		gears = &mc_conf()->g_l[0];
 	}
 	return &gears[n_gear];
 }
 
-mc_gear_t *mc_get_gear_config(void) {
+gear_t *mc_get_gear_config(void) {
 	return mc_get_gear_config_by_gear(motor.n_gear);
 }
 
@@ -363,7 +362,7 @@ bool mc_start(u8 mode) {
 
 	thro_torque_reset();
 	mc_gear_vmode_changed();
-	eCtrl_init(mc_get_gear_config()->n_zero_accl, nv_get_foc_params()->n_dec_time);
+	eCtrl_init(mc_get_gear_config()->zero_accl, mc_conf()->c.thro_dec_time);
 	motor_encoder_start(true);
 	PMSM_FOC_Start(mode);
 	PMSM_FOC_RT_LimInit();
@@ -437,7 +436,7 @@ void mc_set_motor_lim_level(u8 l) {
 }
 
 bool mc_set_gear(u8 gear) {
-	if (gear >= CONFIG_MAX_GEAR_NUM) {
+	if (gear >= CONFIG_MAX_GEARS) {
 		PMSM_FOC_SetErrCode(FOC_Param_Err);
 		return false;
 	}
@@ -466,7 +465,7 @@ bool mc_hwbrk_can_shutpower(void) {
 	if (motor.u_set.n_brkShutPower != MAX_U8) {
 		return (motor.u_set.n_brkShutPower != 0);
 	}
-	return (nv_get_foc_params()->n_brkShutPower != 0);
+	return (mc_conf()->s.brk_shut_power != 0);
 }
 
 bool mc_enable_cruise(bool enable) {
@@ -510,12 +509,14 @@ void mc_set_idc_limit(s16 limit) {
 	PMSM_FOC_DCCurrLimit(limit);
 }
 
-void mc_set_ebrk_level(s16 trq, u16 time) {
-	motor.u_set.ebrk_torque = MAX(0, trq);
-	motor.u_set.ebrk_time = MAX(1, time);
-
-	eCtrl_Set_eBrk_RampTime(mc_get_ebrk_time());
-	PMSM_FOC_SetEbrkTorque(mc_get_ebrk_torque());
+bool mc_set_ebrk_level(u8 level) {
+	if (level < CONFIG_EBRK_LVL_NUM) {
+		motor.u_set.ebrk_lvl = level;
+		eCtrl_Set_eBrk_RampTime(mc_get_ebrk_time());
+		PMSM_FOC_SetEbrkTorque(mc_get_ebrk_torque());
+		return true;
+	}
+	return false;
 }
 
 void mc_enable_brkshutpower(u8 shut) {
@@ -528,14 +529,17 @@ void mc_enable_tcs(bool enable) {
 }
 
 s16 mc_get_ebrk_torque(void) {
-	return min(motor.u_set.ebrk_torque, nv_get_foc_params()->s_TorqueBrkLim);
+	if (motor.u_set.ebrk_lvl < CONFIG_EBRK_LVL_NUM) {
+		return min(mc_conf()->e_r[motor.u_set.ebrk_lvl].torque, mc_conf()->c.max_ebrk_torque);
+	}
+	return 0;
 }
 
 u16 mc_get_ebrk_time(void) {
-	if (motor.u_set.ebrk_time == MAX_U16) {
-		return (u16)nv_get_foc_params()->n_ebrk_time;
+	if (motor.u_set.ebrk_lvl < CONFIG_EBRK_LVL_NUM) {
+		return (u16)mc_conf()->e_r[motor.u_set.ebrk_lvl].time;
 	}
-	return motor.u_set.ebrk_time;
+	return 0xFFFF;
 }
 
 bool mc_set_foc_mode(u8 mode) {
@@ -592,7 +596,7 @@ bool mc_start_epm(bool epm) {
 		eCtrl_set_TgtSpeed(0);
 		motor.mode = CTRL_MODE_SPD;
 		motor.epm_dir = EPM_Dir_None;
-		PMSM_FOC_TorqueLimit(nv_get_foc_params()->s_maxEpmTorqueLimBck);
+		PMSM_FOC_TorqueLimit(mc_conf()->c.max_epm_torque);
 		PMSM_FOC_SetCtrlMode(CTRL_MODE_SPD);
 	}else {
 		motor.epm_dir = EPM_Dir_None;
@@ -657,7 +661,7 @@ bool mc_start_epm_move(EPM_Dir_t dir, bool is_command) {
 #ifdef CONFIG_SPEED_LADRC
 		PMSM_FOC_Change_VelLoop_Params(nv_get_foc_params()->f_adrc_vel_Wcv, nv_get_foc_params()->f_adrc_vel_B0);
 #else
-		PMSM_FOC_Change_VelLoop_Params(nv_get_foc_params()->pid_conf[PID_Spd_id].kp, nv_get_foc_params()->pid_conf[PID_Spd_id].ki);
+		PMSM_FOC_Change_VelLoop_Params(mc_conf()->c.pid[PID_Vel_ID].kp, mc_conf()->c.pid[PID_Vel_ID].ki);
 #endif
 		PMSM_FOC_Set_Speed(0);
 	}
@@ -826,9 +830,6 @@ static void _encoder_zero_off_timer_handler(shark_timer_t *t){
 	PMSM_FOC_Stop();
 	_mc_internal_init(CTRL_MODE_OPEN, false);
 	motor.b_calibrate = false;
-	if (phase != INVALID_ANGLE) {
-		nv_save_angle_offset(phase);
-	}
 }
 
 bool mc_encoder_zero_calibrate(s16 vd) {
@@ -915,7 +916,7 @@ bool mc_auto_hold(bool hold) {
 	if (motor.b_auto_hold == hold) {
 		return true;
 	}
-	if (nv_get_foc_params()->n_autoHold == 0) {
+	if (!mc_conf()->s.auto_hold) {
 		PMSM_FOC_SetErrCode(FOC_NotAllowed);
 		return false;
 	}
@@ -1272,7 +1273,7 @@ static bool mc_run_stall_process(u8 run_mode) {
 }
 
 static void mc_autohold_process(void) {
-	if (nv_get_foc_params()->n_autoHold == 0) {
+	if (!mc_conf()->s.auto_hold) {
 		if (PMSM_FOC_AutoHoldding()) {
 			mc_auto_hold(false);
 		}
@@ -1317,12 +1318,12 @@ static void mc_process_epm_move(void) {
 	if (!motor.b_epm || (motor.epm_dir == EPM_Dir_None)){
 		return;
 	}
-	float target_vel = nv_get_foc_params()->s_maxEpmRPM;
-	float target_trq = nv_get_foc_params()->s_maxEpmTorqueLim;
+	float target_vel = mc_conf()->c.max_epm_rpm;
+	float target_trq = mc_conf()->c.max_epm_torque;
 	float step = 0.05f;
 	if (motor.epm_dir == EPM_Dir_Back) {
-		target_vel = -nv_get_foc_params()->s_maxEpmRPMBck;
-		target_trq = nv_get_foc_params()->s_maxEpmTorqueLimBck;
+		target_vel = -mc_conf()->c.max_epm_back_rpm;
+		target_trq = mc_conf()->c.max_epm_back_torque;
 	}else if (!motor.b_epm_cmd_move) {
 		target_vel = thro_get_ration(throttle_get_signal()) * 2.0f * (float)target_vel;
 		step = 0.07f;

+ 8 - 9
Applications/foc/motor/motor.h

@@ -4,7 +4,7 @@
 #include "foc/core/PMSM_FOC_Core.h"
 #include "foc/motor/hall.h"
 #include "foc/motor/encoder.h"
-#include "app/nv_storage.h"
+#include "foc/mc_config.h"
 
 #define IDC_USER_LIMIT_NONE ((s16)0x3fff)
 
@@ -18,8 +18,7 @@ typedef struct {
 
 typedef struct {
 	s16 idc_lim;
-	s16 ebrk_torque;
-	u16 ebrk_time;
+	u8  ebrk_lvl;
 	u8  n_brkShutPower;
 	bool  b_tcs;
 }user_rt_set;
@@ -53,7 +52,7 @@ typedef struct {
 	bool   b_is96Mode;
 	u8     n_gear;
 	bool   b_limit_pending;
-	mc_gear_t *gear_cfg;
+	gear_t *gear_cfg;
 	u32    n_autohold_time;
 	bool   b_wait_brk_release;
 	u8     mos_lim;
@@ -61,9 +60,9 @@ typedef struct {
 	s16    s_vbus_hw_min;
 	user_rt_set u_set; //用户运行时设置
 	fan_t  fan[2];
-}motor_t;
+}m_contrl_t;
 
-motor_t * mc_params(void);
+m_contrl_t * mc_params(void);
 void mc_init(void);
 bool mc_start(u8 mode);
 bool mc_stop(void);
@@ -96,13 +95,13 @@ bool mc_enable_cruise(bool enable);
 bool mc_is_cruise_enabled(void);
 bool mc_set_cruise_speed(bool rpm_abs, float target_rpm);
 void mc_set_idc_limit(s16 limit);
-mc_gear_t *mc_get_gear_config(void);
-mc_gear_t *mc_get_gear_config_by_gear(u8 n_gear);
+gear_t *mc_get_gear_config(void);
+gear_t *mc_get_gear_config_by_gear(u8 n_gear);
 void mc_set_motor_lim_level(u8 l);
 void mc_set_mos_lim_level(u8 l);
 void motor_debug(void);
 int mc_get_phase_errinfo_block(u8 *data, int dlen);
-void mc_set_ebrk_level(s16 trq, u16 time);
+bool mc_set_ebrk_level(u8 level);
 s16 mc_get_ebrk_torque(void);
 u16 mc_get_ebrk_time(void);
 bool mc_critical_err_is_set(u8 err);

+ 6 - 5
Applications/foc/motor/throttle.c

@@ -1,9 +1,10 @@
 #include "foc/foc_config.h"
+#include "foc/core/PMSM_FOC_Core.h"
 #include "foc/samples.h"
 #include "math/fast_math.h"
 #include "bsp/bsp_driver.h"
 #include "libs/logger.h"
-#include "app/nv_storage.h"
+#include "foc/mc_config.h"
 #include "foc/motor/throttle.h"
 #include "foc/mc_error.h"
 
@@ -16,8 +17,8 @@ static int _detect_release_cnt = 0;
 #define CONFIG_SAFE_INV_V   0.06f
 
 void throttle_init(void) {
-	_start_v = nv_get_foc_params()->n_startThroVol;
-	_end_v   = nv_get_foc_params()->n_endThroVol;
+	_start_v = mc_conf()->c.thro_start_vol;
+	_end_v   = mc_conf()->c.thro_end_vol;
 }
 
 bool throttle1_is_error(void) {
@@ -115,7 +116,7 @@ void throttle_force_detect(void) {
 void throttle_detect(bool ready) {
 	float thr_5v = get_thro_5v_float();
 	float thr_sig = get_throttle_float();
-	if (thr_sig <= nv_get_foc_params()->f_minThroVol || thr_sig >=nv_get_foc_params()->f_maxThroVol) {
+	if (thr_sig <= mc_conf()->c.thro_min_vol || thr_sig >= mc_conf()->c.thro_max_vol) {
 		err_mask |= THRO1_SIG_ERR_BIT;
 	}
 	if (thr_5v <= 4.5f || thr_5v >= 5.5f) {
@@ -127,7 +128,7 @@ void throttle_detect(bool ready) {
 		err_mask |= THRO2_5V_ERR_BIT;
 	}else {
 		float thr2_sig = get_thro2_5v_float() - get_throttle2_float();
-		if (thr2_sig <= nv_get_foc_params()->f_minThroVol || thr2_sig >=nv_get_foc_params()->f_maxThroVol) {
+		if (thr2_sig <= mc_conf()->c.thro_min_vol || thr2_sig >= mc_conf()->c.thro_max_vol) {
 			err_mask |= THRO2_SIG_ERR_BIT;
 		}else {
 			if (ABS(thr2_sig - thr_sig) > 0.5f) {

+ 63 - 51
Project/MC105_V3_Z100.uvoptx

@@ -503,17 +503,29 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>27</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Applications\foc\mc_config.c</PathWithFileName>
+      <FilenameWithoutPath>mc_config.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
     <GroupName>Proto</GroupName>
-    <tvExp>0</tvExp>
+    <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -525,7 +537,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -537,7 +549,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -549,7 +561,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -569,7 +581,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -581,7 +593,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -593,7 +605,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>33</FileNumber>
+      <FileNumber>34</FileNumber>
       <FileType>4</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -605,7 +617,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>34</FileNumber>
+      <FileNumber>35</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -625,7 +637,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>35</FileNumber>
+      <FileNumber>36</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -637,7 +649,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>36</FileNumber>
+      <FileNumber>37</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -649,7 +661,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>37</FileNumber>
+      <FileNumber>38</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -661,7 +673,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>38</FileNumber>
+      <FileNumber>39</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -673,7 +685,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>39</FileNumber>
+      <FileNumber>40</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -685,7 +697,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>40</FileNumber>
+      <FileNumber>41</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -697,7 +709,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>41</FileNumber>
+      <FileNumber>42</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -709,7 +721,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>42</FileNumber>
+      <FileNumber>43</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -721,7 +733,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>43</FileNumber>
+      <FileNumber>44</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -733,7 +745,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>44</FileNumber>
+      <FileNumber>45</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -745,7 +757,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>45</FileNumber>
+      <FileNumber>46</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -757,7 +769,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>46</FileNumber>
+      <FileNumber>47</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -769,7 +781,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>47</FileNumber>
+      <FileNumber>48</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -781,7 +793,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>48</FileNumber>
+      <FileNumber>49</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -801,7 +813,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>49</FileNumber>
+      <FileNumber>50</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -813,7 +825,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>50</FileNumber>
+      <FileNumber>51</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -825,7 +837,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>51</FileNumber>
+      <FileNumber>52</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -837,7 +849,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>52</FileNumber>
+      <FileNumber>53</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -849,7 +861,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>53</FileNumber>
+      <FileNumber>54</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -861,7 +873,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>54</FileNumber>
+      <FileNumber>55</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -881,7 +893,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>55</FileNumber>
+      <FileNumber>56</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -893,7 +905,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>56</FileNumber>
+      <FileNumber>57</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -905,7 +917,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>57</FileNumber>
+      <FileNumber>58</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -925,7 +937,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>58</FileNumber>
+      <FileNumber>59</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -937,7 +949,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>59</FileNumber>
+      <FileNumber>60</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -949,7 +961,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>60</FileNumber>
+      <FileNumber>61</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -961,7 +973,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>61</FileNumber>
+      <FileNumber>62</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -973,7 +985,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>62</FileNumber>
+      <FileNumber>63</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -985,7 +997,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>63</FileNumber>
+      <FileNumber>64</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -997,7 +1009,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>64</FileNumber>
+      <FileNumber>65</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1009,7 +1021,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>65</FileNumber>
+      <FileNumber>66</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1021,7 +1033,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>66</FileNumber>
+      <FileNumber>67</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1033,7 +1045,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>67</FileNumber>
+      <FileNumber>68</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1045,7 +1057,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>68</FileNumber>
+      <FileNumber>69</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1057,7 +1069,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>69</FileNumber>
+      <FileNumber>70</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1069,7 +1081,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>70</FileNumber>
+      <FileNumber>71</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1081,7 +1093,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>71</FileNumber>
+      <FileNumber>72</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1093,7 +1105,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>72</FileNumber>
+      <FileNumber>73</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1105,7 +1117,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>73</FileNumber>
+      <FileNumber>74</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1125,7 +1137,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>74</FileNumber>
+      <FileNumber>75</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1137,7 +1149,7 @@
     </File>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>75</FileNumber>
+      <FileNumber>76</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1149,7 +1161,7 @@
     </File>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>76</FileNumber>
+      <FileNumber>77</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>

+ 5 - 0
Project/MC105_V3_Z100.uvprojx

@@ -523,6 +523,11 @@
               <FileType>1</FileType>
               <FilePath>..\Applications\foc\motor\throttle.c</FilePath>
             </File>
+            <File>
+              <FileName>mc_config.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Applications\foc\mc_config.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>

+ 81 - 15
mc_config.yml

@@ -13,7 +13,7 @@ Motor:
   VelocityW: 190  #kg
   VelocityC: 145  #cm
   GearRatio: 6.25 # 1:6.25
-  MaxFwDCurr: 100.0
+  MaxFwDCurr: 100
 Foc:
   MaxDCVol: 110
   MinDCVol: 70
@@ -30,27 +30,28 @@ Foc:
   ThroEndVol: 4.15
   ThroMinVol: 0.4
   ThroMaxVol: 4.6
-  CurrCtrlBandWith: 1256.0
+  CurrCtrlBandWith: 200
+  ThroDecTime: 10
   PID:  #pid controller
     VelLim:
-      Kp: 0
-      Ki: 0
-      Kd: 0
+      Kp: 0.5
+      Ki: 2.5
+      Kd: 0.0
     VelCtrl:
-      Kp: 0
-      Ki: 0
-      Kd: 0
+      Kp: 0.1
+      Ki: 3.5
+      Kd: 0.0
     Autohold:
-      Kp: 0
-      Ki: 0
-      Kd: 0
+      Kp: 0.01
+      Ki: 0.2
+      Kd: 0.0
     IDCLim:
-      Kp: 0
-      Ki: 0
-      Kd: 0
+      Kp: 5.0
+      Ki: 15.0
+      Kd: 0.0
 Settings:
   AutoHold: 1
-  BrkShutPower: 0
+  BrkShutPower: 1
   TcsEnable: 0
 Gear:
   - MaxSpeed: 1000
@@ -117,6 +118,71 @@ Gear:
       - 100
       - 0
       - 0
+GearLow:
+  - MaxSpeed: 1000
+    MaxTorque: 100
+    MaxIdc: 30
+    ZeroAccl: 500
+    NormalAccl: 100
+    Torque:
+      - 100
+      - 100
+      - 100
+      - 100
+      - 100
+      - 100
+      - 100
+      - 100
+      - 0
+      - 0
+  - MaxSpeed: 1000
+    MaxTorque: 100
+    MaxIdc: 30
+    ZeroAccl: 500
+    NormalAccl: 100
+    Torque:
+      - 100
+      - 100
+      - 100
+      - 100
+      - 100
+      - 100
+      - 100
+      - 100
+      - 0
+      - 0
+  - MaxSpeed: 1000
+    MaxTorque: 100
+    MaxIdc: 30
+    ZeroAccl: 500
+    NormalAccl: 100
+    Torque:
+      - 100
+      - 100
+      - 100
+      - 100
+      - 100
+      - 100
+      - 100
+      - 100
+      - 0
+      - 0
+  - MaxSpeed: 1000
+    MaxTorque: 100
+    MaxIdc: 30
+    ZeroAccl: 500
+    NormalAccl: 100
+    Torque:
+      - 100
+      - 100
+      - 100
+      - 100
+      - 100
+      - 100
+      - 100
+      - 100
+      - 0
+      - 0
 Protect:
   Motor:
     - Entry: 130