Преглед на файлове

速度环

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui преди 3 години
родител
ревизия
88deb0c5d3

+ 15 - 6
Applications/app/key_process.c

@@ -15,6 +15,7 @@ static u8 key_value[3];
 static float foc_current = 0.0f;
 static u8 ctrl_mode = CTRL_MODE_OPEN;
 static float max_speed = 2000;
+static float target_speed = 2000;
 static u32 key_task(void *p) {
 	foc_cmd_body_t foc_cmd;
 	u8 cmd_data[16];
@@ -27,6 +28,7 @@ static u32 key_task(void *p) {
 			foc_cmd.cmd = Foc_Start_Motor;
 			if (PMSM_FOC_Is_Start()) {
 				PMSM_FOC_Set_Torque(foc_current);
+				PMSM_FOC_Set_Speed(0.0f);
 			}else {
 				cmd_data[0] = Foc_Start;
 				foc_send_command(&foc_cmd);
@@ -42,9 +44,12 @@ static u32 key_task(void *p) {
 			if (foc_current < 5.0f) {
 				foc_current += 1.0f;
 			}
+			target_speed = 1000.0f;
 			PMSM_FOC_SpeedLimit(max_speed);
+			PMSM_FOC_Set_Speed(max_speed);
 			PMSM_FOC_Set_Torque(foc_current);
-			PMSM_FOC_SetCtrlMode(CTRL_MODE_TRQ);
+			ctrl_mode = CTRL_MODE_TRQ;
+			PMSM_FOC_SetCtrlMode(ctrl_mode);
 		}
 		key_value[KEY_STOP] = value;
 	}
@@ -53,15 +58,19 @@ static u32 key_task(void *p) {
 	if (value != key_value[KEY_FUNC]) {
 		if (value) {
 			if (ctrl_mode == CTRL_MODE_TRQ) {
-				PMSM_FOC_EnableCruise(true);
 				ctrl_mode = CTRL_MODE_SPD;
+				PMSM_FOC_SetCtrlMode(ctrl_mode);
 			}else if(ctrl_mode == CTRL_MODE_SPD){
-				PMSM_FOC_EnableCruise(false);
-				ctrl_mode = CTRL_MODE_TRQ;
+				//ctrl_mode = CTRL_MODE_TRQ;
+				//PMSM_FOC_EnableCruise(false);
+				PMSM_FOC_SpeedLimit(10000);
+				target_speed += 1000;
+				PMSM_FOC_Set_Speed(target_speed);
+				
 			}else {
-				ctrl_mode = CTRL_MODE_TRQ;
+				//ctrl_mode = CTRL_MODE_TRQ;
 			}
-			//PMSM_FOC_SetCtrlMode(ctrl_mode);
+			
 			//PMSM_FOC_SpeedLimit(max_speed);
 			//max_speed += 1000;
 		}

+ 5 - 1
Applications/foc/core/PMSM_FOC_Core.c

@@ -300,6 +300,7 @@ static __INLINE void PMSM_FOC_idq_Assign(void) {
 	}else if ((_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_TRQ) || (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_SPD)) {
 		torque_lut_get_idq(_gFOC_Ctrl.in.s_targetTorque, _gFOC_Ctrl.in.s_motRPM, &_gFOC_Ctrl.in.s_targetIdq);
 	}
+
 	FOC_Set_iDqRamp(&_gFOC_Ctrl.idq_ctl[0], _gFOC_Ctrl.in.s_targetIdq.d);
 	FOC_Set_iDqRamp(&_gFOC_Ctrl.idq_ctl[1], _gFOC_Ctrl.in.s_targetIdq.q);
 }
@@ -314,13 +315,16 @@ void PMSM_FOC_idqCalc(void) {
 		_gFOC_Ctrl.pi_ctl_trq->min = -refTorque;
 		float errRef = _gFOC_Ctrl.params.s_maxRPM - _gFOC_Ctrl.in.s_motRPM;
 		_gFOC_Ctrl.in.s_targetTorque = PI_Controller_run(_gFOC_Ctrl.pi_ctl_trq, errRef);
-	}else {
+	}else if (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_SPD){
 		_gFOC_Ctrl.pi_ctl_spd->max = _gFOC_Ctrl.params.s_maxIdq;
 		_gFOC_Ctrl.pi_ctl_spd->min = _gFOC_Ctrl.params.s_minIdq;
 		float refSpeed = eCtrl_get_RefSpeed();
 		if (_gFOC_Ctrl.in.b_cruiseEna) {
 			refSpeed = _gFOC_Ctrl.in.s_cruiseRPM;
 		}
+		if ((eCtrl_get_FinalSpeed() == 0) && _gFOC_Ctrl.in.s_motRPM < 10) {
+			_gFOC_Ctrl.pi_ctl_spd->min = 0; //防止倒转
+		}
 		float errRef = refSpeed - _gFOC_Ctrl.in.s_motRPM;
 		_gFOC_Ctrl.in.s_targetTorque = PI_Controller_run(_gFOC_Ctrl.pi_ctl_spd, errRef);		
 	}

+ 2 - 2
Applications/foc/core/PMSM_FOC_Params.h

@@ -26,7 +26,7 @@ static PI_Controller PI_Ctrl_IQ = {
 
 static PI_Controller PI_Ctrl_trq = {
 	.kp = 0.001f,
-	.ki = 0.001f,
+	.ki = 0.01f,
 	.max = (MAX_TORQUE),
 	.min = (-MAX_TORQUE),
 	.DT  = (1.0f/(float)SPD_CTRL_TS),
@@ -35,7 +35,7 @@ static PI_Controller PI_Ctrl_trq = {
 
 static PI_Controller PI_Ctrl_Spd = {
 	.kp = 0.001f,
-	.ki = 0.001f,
+	.ki = 0.01f,
 	.max = (MAX_TORQUE),
 	.min = (-MAX_TORQUE),
 	.DT  = (1.0f/(float)SPD_CTRL_TS),

+ 9 - 6
Applications/foc/foc_config.h

@@ -19,19 +19,22 @@
 #else
 #define MAX_vDC (50)   /* 母线最大电压 V*/
 #endif
+
+#define IDQ_CTRL_TS FOC_PWM_FS
+#define SPD_CTRL_TS 1000
+#define SPD_CTRL_MS (1000/SPD_CTRL_TS * 1000)
+#define VDQ_RAMP_TS 100
+#define VDQ_RAMP_FINAL_TIME 3000
+
 /* 电子刹车,动能回收,加速 */
 #define TORQUE_STEP 1.0f          /* 扭矩斜率给定的step值,单位 A */
 #define SPEED_STEP  20.0f         /* 速度斜率给定的step值,单位 RPM */
 #define DEFAULT_D_TIME 3000       /* 默认的斜率给定时间,越大,越慢到给定值*/
-#define eCTRL_STEP_TS 10          /* 斜率给定的step的时间值,单位 ms */
+#define eCTRL_STEP_TS (SPD_CTRL_MS/1000 + 1)     /* 斜率给定的step的时间值,单位 ms */
 #define eCTRL_Brake_TIME 1500     /* 捏住刹车的时间,超过这个时间启动ebrake,单位 ms */
 #define eCTRL_NEG_TORQUE (-100)   /* ebrake 的最大方向DQ电流,单位 ACKED_KEY*/
 
-#define IDQ_CTRL_TS FOC_PWM_FS
-#define SPD_CTRL_TS 1000
-#define SPD_CTRL_MS (1000/SPD_CTRL_TS * 1000)
-#define VDQ_RAMP_TS 100
-#define VDQ_RAMP_FINAL_TIME 3000
+
 #define CURRENT_BANDWITH 500 /* 电流环带宽 */
 
 #define SVM_Modulation 1.0f //(0.96f)

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

@@ -49,7 +49,7 @@ bool mc_start(u8 mode) {
 		PMSM_FOC_SetErrCode(FOC_Throttle_Err);
 		return false;
 	}
-	eCtrl_init(1, 1000);
+	eCtrl_init(1000, 2000);
 	motor_encoder_start(motor.s_direction);
 	PMSM_FOC_Start(mode);
 	pwm_turn_on_low_side();

+ 2 - 2
Project/GD32_DEMO.uvoptx

@@ -120,8 +120,8 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGUARM</Key>
-          <Name>0</Name>
-        </SetRegEntry>
+          <Name>
+</Name>        </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
           <Key>ARMRTXEVENTFLAGS</Key>