Просмотр исходного кода

1. 解决配置接收到后需要更新dq轴电流环参数
2. 最大充电电流名称修改
3. 磁链估计的timer需要用100ms,有些大电机惯量大,启动慢

Signed-off-by: huhui <huhui@sharkgulf.com>

huhui 2 лет назад
Родитель
Сommit
293da4467a

+ 1 - 1
Applications/bsp/at32/board_at_mc105_v3.h

@@ -12,7 +12,7 @@
 #define CONFIG_MIN_DC_VOL   (36.0f)
 
 #define CONFIG_HW_MAX_DC_CURRENT 200.0f
-#define CONFIG_MAX_CHRG_CURRENT (-100.0f)
+#define CONFIG_HW_MAX_CHRG_CURRENT (-100.0f)
 #define CONFIG_HW_MAX_MOTOR_RPM      9000.0f
 #define CONFIG_HW_MAX_PHASE_CURR   500.0F
 #define CONFIG_HW_MAX_PHASE_VOL    (CONFIG_MOS_MAX_VOL - 20.0F)

+ 1 - 1
Applications/bsp/gd32/board_mc100_v1.h

@@ -12,7 +12,7 @@
 #define CONFIG_MIN_DC_VOL   (60.0f)
 
 #define CONFIG_HW_MAX_DC_CURRENT 250.0f
-#define CONFIG_MAX_CHRG_CURRENT (-100.0f)
+#define CONFIG_HW_MAX_CHRG_CURRENT (-100.0f)
 #define CONFIG_HW_MAX_MOTOR_RPM      9000.0f
 #define CONFIG_HW_MAX_PHASE_CURR   500.0F
 #define CONFIG_HW_MAX_PHASE_VOL    (CONFIG_MOS_MAX_VOL - 20.0F)

+ 1 - 1
Applications/bsp/gd32/board_mc105_v3.h

@@ -12,7 +12,7 @@
 #define CONFIG_MIN_DC_VOL   (60.0f)
 
 #define CONFIG_HW_MAX_DC_CURRENT 250.0f
-#define CONFIG_MAX_CHRG_CURRENT (-100.0f)
+#define CONFIG_HW_MAX_CHRG_CURRENT (-100.0f)
 #define CONFIG_HW_MAX_MOTOR_RPM      9000.0f
 #define CONFIG_HW_MAX_PHASE_CURR   500.0F
 #define CONFIG_HW_MAX_PHASE_VOL    (CONFIG_MOS_MAX_VOL - 20.0F)

+ 3 - 4
Applications/foc/commands.c

@@ -337,8 +337,8 @@ static void process_foc_command(foc_cmd_body_t *command) {
 				break;
 			}
 			pid_t pid;
-			u8 id =   decode_u8((u8 *)command->data);
-			memcpy((char *)&pid, (char *)command->data + 1, sizeof(pid_t));
+			u8 id = decode_u8((u8 *)command->data);
+			mc_conf_decode_pid(&pid, (u8 *)command->data + 1);
 			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);
 			mc_conf_set_pid(id, &pid);
@@ -351,8 +351,7 @@ static void process_foc_command(foc_cmd_body_t *command) {
 			if (id < PID_Max_ID) {
 				mc_conf_get_pid(id, &pid);
 				erroCode = id;
-				memcpy(response+3, &pid, sizeof(pid));
-				len = sizeof(pid) + 3;
+				len += mc_conf_encode_pid(&pid, response + 3);
 				sys_debug("get id = %d, kp = %f, ki = %f, kd = %f\n", id, pid.kp, pid.ki, pid.kd);
 			}else {
 				erroCode = 1;

+ 15 - 6
Applications/foc/mc_config.c

@@ -206,9 +206,9 @@ void mc_conf_default(void) {
 	conf.c.thro_dec_time = CONFIG_Foc_ThroDecTime;
 	conf.c.max_autohold_torque = CONFIG_Foc_MaxAutoHoldTorque;
 
-	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_ID_ID].kp = (float)conf.c.dq_loop_bandwith * 2.0f * 3.14f * conf.m.ld;
+	conf.c.pid[PID_ID_ID].ki = conf.m.rs / conf.m.ld;
+	conf.c.pid[PID_ID_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;
@@ -277,7 +277,7 @@ void mc_conf_init(void) {
 		mc_conf_default();
 		mc_conf_save();
 	}
-	sys_debug("mc conf size %d\n", sizeof(mc_config));
+	sys_debug("mc conf band %d, pid: %f, %f, %f, %f\n", conf.c.dq_loop_bandwith, conf.c.pid[PID_ID_ID].kp, conf.c.pid[PID_ID_ID].ki, conf.c.pid[PID_IQ_ID].kp, conf.c.pid[PID_IQ_ID].ki);
 }
 
 int mc_conf_decode_motor(u8 *buff) {
@@ -350,14 +350,23 @@ int mc_conf_decode_controler(u8 *buff) {
 	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_max_vol = decode_float(buff);buff += 4;
 	conf.c.thro_dec_time = decode_u16(buff);buff += 2;
 	conf.c.max_torque = min(conf.c.max_torque, conf.m.max_torque);
 	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);
+
+	conf.c.pid[PID_ID_ID].kp = (float)conf.c.dq_loop_bandwith * 2.0f * 3.14f * conf.m.ld;
+	conf.c.pid[PID_ID_ID].ki = conf.m.rs / conf.m.ld;
+	conf.c.pid[PID_ID_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;
+
 	return buff - ori;
 }
 
@@ -378,8 +387,8 @@ int mc_conf_encode_controler(u8 *buff) {
 	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_float(buff, conf.c.thro_max_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);

+ 2 - 0
Applications/foc/mc_config.h

@@ -122,6 +122,8 @@ 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);
+int mc_conf_decode_pid(pid_t *pid, u8 *buff);
+int mc_conf_encode_pid(pid_t *pid, u8 *buff);
 static mc_config *mc_conf(void) {
 	return &conf;
 }

+ 2 - 1
Applications/foc/motor/encoder.c

@@ -65,7 +65,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.enc_offset = 0;//-103.0F;
 	g_encoder.motor_poles = mc_conf()->m.poles;
 	g_encoder.b_index_found = false;
 	g_encoder.direction = POSITIVE;
@@ -307,6 +307,7 @@ float encoder_get_theta(bool detect_err) {
 	g_encoder.last_us = task_get_usecond();
 
 	g_encoder.position += (g_encoder.est_vel_counts/g_encoder.cpr) * FOC_CTRL_US;
+
 	return g_encoder.abi_angle;
 }
 

+ 1 - 1
Applications/foc/motor/mot_params_ind.c

@@ -306,7 +306,7 @@ static void _flux_ind_timer_handler(shark_timer_t *t) {
 			_pending_flux_mc_stop = true;
 		}
 	}else {
-		shark_timer_post(&_flux_ind_timer, 10);
+		shark_timer_post(&_flux_ind_timer, 100);
 	}
 }
 

+ 13 - 8
Applications/foc/motor/motor.c

@@ -58,7 +58,7 @@ static gear_t sensorless_gear = {
 	.max_idc = CONFIG_SENSORLESS_MAX_IDC,
 	.zero_accl = 1500,
 	.accl_time = 1500,
-	.torque = {100, 80, 60, 0, 0, 0, 0, 0, 0, 0},
+	.torque = {100, 80, 60, 50, 40, 30, 0, 0, 0, 0},
 };
 static runtime_node_t mc_error;
 
@@ -223,9 +223,10 @@ static void mc_gear_vmode_changed(void) {
 		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->max_speed);
-	PMSM_FOC_DCCurrLimit(min(gears->max_idc, motor.u_set.idc_lim));
-	PMSM_FOC_TorqueLimit(gears->max_trq);
+	PMSM_FOC_SpeedLimit((float)gears->max_speed);
+	PMSM_FOC_DCCurrLimit((float)min(gears->max_idc, motor.u_set.idc_lim));
+	PMSM_FOC_TorqueLimit((float)gears->max_trq);
+	sys_debug("change %d, %d, %d\n", gears->max_idc, gears->max_speed, gears->max_trq);
 }
 
 static s16 mc_get_gear_idc_limit(void) {
@@ -1418,7 +1419,11 @@ static bool mc_can_stop_foc(void) {
 }
 
 static bool mc_can_restart_foc(void) {
-	return (!PMSM_FOC_Is_Start()) && (!mc_throttle_released() || (motor.epm_dir != EPM_Dir_None)) && (!mc_critical_can_not_run());
+	bool can_start = (!PMSM_FOC_Is_Start()) && (!mc_throttle_released() || (motor.epm_dir != EPM_Dir_None)) && (!mc_critical_can_not_run());
+	if (!foc_observer_is_encoder() && !foc_observer_sensorless_stable()){
+		can_start = false;
+	}
+	return can_start;
 }
 
 #endif
@@ -1470,7 +1475,7 @@ void Sched_MC_mTask(void) {
 	/* 母线电流,实际采集的相电流矢量大小的计算 */
 	PMSM_FOC_Calc_Current();
 
-	if ((PMSM_FOC_GetVbusCurrent() > (CONFIG_HW_MAX_DC_CURRENT * 1.1f)) || (PMSM_FOC_GetVbusCurrent() < CONFIG_MAX_CHRG_CURRENT)) {
+	if ((PMSM_FOC_GetVbusCurrent() > (CONFIG_HW_MAX_DC_CURRENT * 1.1f)) || (PMSM_FOC_GetVbusCurrent() < CONFIG_HW_MAX_CHRG_CURRENT)) {
 		vbus_err_cnt ++;
 		if (vbus_err_cnt >= 5) {
 			if (mc_set_critical_error(FOC_CRIT_IDC_OV)) {
@@ -1487,9 +1492,9 @@ void Sched_MC_mTask(void) {
 		return;
 	}
 	bool sensor_less = !foc_observer_is_encoder();
-	if (mc_detect_vbus_mode() || (limted == FOC_LIM_CHANGE_L) || (!_sensorless_run && sensor_less)) {
+	if (mc_detect_vbus_mode() || (limted == FOC_LIM_CHANGE_L) || (_sensorless_run != sensor_less)) {
 		mc_gear_vmode_changed();
-		if (foc_observer_sensorless_stable()) {//unstable 记录在ADC中断处理中
+		if (sensor_less && foc_observer_sensorless_stable()) {//unstable 记录在ADC中断处理中
 			if (motor_encoder_may_error() == ENCODER_PWM_ERR) {
 				mc_set_critical_error(FOC_CRIT_Encoder_Err);
 				mc_crit_err_add(FOC_CRIT_Encoder_Err, (s16)enc_pwm_err_ms, enc_delta_err2);