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

电机标定,提前角给定通过rampline设置

Signed-off-by: kevin <huhui@sharkgulf.com>
kevin 2 лет назад
Родитель
Сommit
f6af40d7e8
2 измененных файлов с 6 добавлено и 2 удалено
  1. 4 2
      Applications/foc/core/controller.c
  2. 2 0
      Applications/foc/core/controller.h

+ 4 - 2
Applications/foc/core/controller.c

@@ -48,6 +48,7 @@ bool mot_contrl_enable(mot_contrl_t *ctrl, bool start) {
 		line_ramp_init(&ctrl->target_vel, CONFIG_CRUISE_RAMP_TIME);
 		line_ramp_init(&ctrl->target_current, CONFIG_CURRENT_RAMP_TIME);
 		line_ramp_init(&ctrl->input_torque, CONFIG_DEFAULT_TORQUE_RAMP_TIME);
+		line_ramp_init(&ctrl->ramp_adv_angle, CONFIG_CURRENT_RAMP_TIME);
 		mot_contrl_pid(ctrl);
 		mot_contrl_ulimit(ctrl);
 		mot_contrl_rtlimit(ctrl);
@@ -276,9 +277,9 @@ static void mot_contrl_dq_assign(mot_contrl_t *ctrl) {
 		float target_current = line_ramp_get_interp(&ctrl->target_current);
 		if (ctrl->b_mtpa_calibrate && (ctrl->adv_angle != INVALID_ANGLE)) {
 			float s, c;
-			arm_sin_cos(ctrl->adv_angle + 90.0f, &s, &c);
+			float angle_step = line_ramp_step(&ctrl->ramp_adv_angle);
+			arm_sin_cos(angle_step + 90.0f, &s, &c);
 			ctrl->target_idq.d = target_current * c;
-			
 			if (ctrl->target_idq.d > ctrl->hwlim.fw_id) {
 				ctrl->target_idq.d = ctrl->hwlim.fw_id;
 			}else if (ctrl->target_idq.d < -ctrl->hwlim.fw_id) {
@@ -679,6 +680,7 @@ bool mot_contrl_set_force_torque(mot_contrl_t *ctrl, float torque) {
 
 void mot_contrl_mtpa_calibrate(mot_contrl_t *ctrl, bool enable) {
 	if (enable) {
+		line_ramp_reset(&ctrl->ramp_adv_angle, 0);
 		ctrl->b_mtpa_calibrate = true;
 		ctrl->adv_angle = 0;
 	}else {

+ 2 - 0
Applications/foc/core/controller.h

@@ -157,6 +157,7 @@ typedef struct{
 	lineramp_t 		torque_lim;
 	lineramp_t 		dc_curr_lim;
 	lineramp_t		input_torque;
+	lineramp_t		ramp_adv_angle;
 	float 			phase_a_max;
 	float 			phase_b_max;
 	float 			phase_c_max;
@@ -259,6 +260,7 @@ static __INLINE void mot_contrl_set_angle(mot_contrl_t *ctrl, float angle) {
 
 static __INLINE void mot_contrl_set_adv_angle(mot_contrl_t *ctrl, float angle) {
 	ctrl->adv_angle = (angle);
+	line_ramp_set_target(&ctrl->ramp_adv_angle, angle);
 }
 
 static __INLINE bool mot_contrl_is_auto_holdding(mot_contrl_t *ctrl) {