Bläddra i källkod

加入扭矩环,扭矩环限速

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 3 år sedan
förälder
incheckning
9e86eea4b9

+ 5 - 2
Applications/app/key_process.c

@@ -14,6 +14,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 u32 key_task(void *p) {
 	foc_cmd_body_t foc_cmd;
 	u8 cmd_data[16];
@@ -40,7 +41,7 @@ static u32 key_task(void *p) {
 			if (foc_current < 2.0f) {
 				foc_current += 0.1f;
 			}
-			PMSM_FOC_Set_Current(foc_current);
+			PMSM_FOC_Set_Torque(foc_current);
 		}
 		key_value[KEY_STOP] = value;
 	}
@@ -49,11 +50,13 @@ static u32 key_task(void *p) {
 	if (value != key_value[KEY_FUNC]) {
 		if (value) {
 			if (ctrl_mode == CTRL_MODE_OPEN) {
-				ctrl_mode = CTRL_MODE_CURRENT;
+				ctrl_mode = CTRL_MODE_TRQ;
 			}else {
 				ctrl_mode = CTRL_MODE_OPEN;
 			}
 			PMSM_FOC_SetCtrlMode(ctrl_mode);
+			PMSM_FOC_SpeedLimit(max_speed);
+			//max_speed += 10;
 		}
 		key_value[KEY_FUNC] = value;
 	}

+ 12 - 0
Applications/foc/core/PI_Controller.h

@@ -28,6 +28,8 @@ static __INLINE s16q5_t PI_Controller_run(PI_Controller *pi, s16q5_t err) {
 typedef struct {
 	float  kp;
 	float  ki;
+	float  kp_s;
+	float  ki_s;
 	float  max;
 	float  min;
 	float  Ui;
@@ -51,6 +53,16 @@ static __INLINE float PI_Controller_run(PI_Controller *pi, float err) {
 	return (MATH_sat(out, pi->min, pi->max));
 }
 
+static __INLINE float PI_Controller_RunSerial(PI_Controller *pi, float err) {
+	float kp_err = (err) * pi->kp_s;//S16_mul(err,pi->kp, 5);
+	float ki_err = (kp_err) * pi->ki_s;
+	float integral = ki_err * pi->DT;
+	pi->Ui = MATH_sat(pi->Ui + integral, pi->min, pi->max);
+	float out = pi->Ui + kp_err;
+	return (MATH_sat(out, pi->min, pi->max));
+}
+
+
 #endif
 #endif	/*_PI_Contrller_H__*/
 

+ 48 - 47
Applications/foc/core/PMSM_FOC_Core.c

@@ -7,6 +7,7 @@
 #include "foc/motor/current.h"
 #include "foc/motor/hall.h"
 #include "foc/core/svpwm.h"
+#include "foc/core/torque_lut.h"
 #include "foc/samples.h"
 #include "bsp/pwm.h"
 #include "libs/logger.h"
@@ -34,15 +35,22 @@ static __INLINE void Park(AB_t *alpha_beta, float angle, DQ_t *dq) {
 	dq->q = -alpha_beta->a * s + alpha_beta->b * c;
 }
 
+//#define VD_PRIO_HIGH
 static __INLINE float Circle_Limitation(DQ_t *vdq, float vDC, float module, DQ_t *out) {
 	float sq_vdq = vdq->d * vdq->d + vdq->q * vdq->q;
 	float vDC_m = vDC * module;
 	float sq_vDC = vDC_m * vDC_m;
 	if (sq_vdq > sq_vDC) {
+#ifdef VD_PRIO_HIGH		
+		out->d = vdq->d;
+		out->q = sqrtf(sq_vDC - out->d*out->d);
+		return 1.1f;
+#else
 		float r = sqrtf(sq_vDC / sq_vdq);
 		out->d = vdq->d * r;
 		out->q = vdq->q * r;
 		return r;
+#endif
 	}
 	out->d = vdq->d;
 	out->q = vdq->q;
@@ -118,7 +126,7 @@ void PMSM_FOC_CoreInit(void) {
 	_gFOC_Ctrl.params.s_maxiDC = (MAX_iDC);
 	_gFOC_Ctrl.params.s_maxRPM = (MAX_SPEED);
 	_gFOC_Ctrl.params.n_modulation = SVM_Modulation;
-	_gFOC_Ctrl.params.n_PhaseFilterCeof = (0.1f);
+	_gFOC_Ctrl.params.n_PhaseFilterCeof = (0.2f);
 	_gFOC_Ctrl.params.maxvDQ.d = MAX_vDC;
 	_gFOC_Ctrl.params.minvDQ.d = -MAX_vDC;
 	_gFOC_Ctrl.params.maxvDQ.q = MAX_vDC;
@@ -128,7 +136,7 @@ void PMSM_FOC_CoreInit(void) {
 	_gFOC_Ctrl.params.n_poles = MOTOR_POLES;
 	_gFOC_Ctrl.out.n_RunMode = CTRL_MODE_OPEN;
 	_gFOC_Ctrl.out.f_vdqRation = 0;
-	_gFOC_Ctrl.in.s_manualAngle = 0x3D00;
+	_gFOC_Ctrl.in.s_manualAngle = INVALID_ANGLE;
 	_gFOC_Ctrl.in.s_vDC = (MAX_vDC);
 	
 	FOC_DqRamp_init(&_gFOC_Ctrl.idq_ctl[0], 1);
@@ -141,7 +149,7 @@ void PMSM_FOC_CoreInit(void) {
 
 //#define PHASE_LFP
 static __INLINE void PMSM_FOC_Update_Hardware(void) {
-	if ((_gFOC_Ctrl.in.s_manualAngle != 0x3D00) && !_gFOC_Ctrl.in.b_MTPA_calibrate) {
+	if (!_gFOC_Ctrl.in.b_MTPA_calibrate && (_gFOC_Ctrl.in.s_manualAngle != INVALID_ANGLE)) {
 		_gFOC_Ctrl.in.s_motAngle = _gFOC_Ctrl.in.s_manualAngle;
 		_gFOC_Ctrl.in.s_hallAngle = hall_sensor_get_theta();
 	}else {
@@ -199,11 +207,11 @@ void PMSM_FOC_Schedule(void) {
 
 		float target_d = FOC_Get_DqRamp(&_gFOC_Ctrl.idq_ctl[0]);
 		float err = target_d - _gFOC_Ctrl.out.s_RealIdq.d;
-		_gFOC_Ctrl.in.s_targetVdq.d = PI_Controller_run(_gFOC_Ctrl.pi_ctl_id, err);
+		_gFOC_Ctrl.in.s_targetVdq.d = PI_Controller_RunSerial(_gFOC_Ctrl.pi_ctl_id, err);
 
 		float target_q = FOC_Get_DqRamp(&_gFOC_Ctrl.idq_ctl[1]);
-		err = target_q - (_gFOC_Ctrl.out.s_RealIdq.q);
-		_gFOC_Ctrl.in.s_targetVdq.q = PI_Controller_run(_gFOC_Ctrl.pi_ctl_iq, err);
+		err = target_q - _gFOC_Ctrl.out.s_RealIdq.q;
+		_gFOC_Ctrl.in.s_targetVdq.q = PI_Controller_RunSerial(_gFOC_Ctrl.pi_ctl_iq, err);
 
 	}else {
 		_gFOC_Ctrl.in.s_targetVdq.d = FOC_Get_DqRamp(&_gFOC_Ctrl.vdq_ctl[0]);
@@ -222,10 +230,11 @@ void PMSM_FOC_Schedule(void) {
 
 	if (_gFOC_Ctrl.ctrl_count % 5 == 0) {
 		//plot_1data16(FtoS16x1000(PMSM_FOC_Get_iDC()));
-		plot_2data16(FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.d), FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.q));
-		//plot_1data16(_gFOC_Ctrl.in.s_motRPM);
+		//plot_3data16(_gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
+		//plot_2data16(FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.d), FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.q));
+		plot_1data16(_gFOC_Ctrl.in.s_motRPM);
 		//plot_2data16(FtoS16(_gFOC_Ctrl.in.s_hallAngle), FtoS16(_gFOC_Ctrl.in.s_motAngle));
-		//plot_3data16(FtoS16x1000(iabc[0]), FtoS16x1000(_gFOC_Ctrl.in.s_targetVdq.d), FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.d));
+		//plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x1000(_gFOC_Ctrl.out.s_OutVdq.d), FtoS16x1000(_gFOC_Ctrl.out.s_OutVdq.q));
 		//plot_3data16(FtoS16x1000(iabc[0]), FtoS16x1000(iabc[1]), FtoS16(_gFOC_Ctrl.in.s_hallAngle)*10);
 		//plot_1data16(FtoS16(_gFOC_Ctrl.in.s_hallAngle));
 	}	
@@ -256,53 +265,39 @@ u8 PMSM_FOC_CtrlMode(void) {
 	return _gFOC_Ctrl.out.n_RunMode;
 }
 
-/* MPTA, 弱磁, 功率限制 */
+/* MPTA, 弱磁, 功率限制,主要是分配DQ轴电流 */
 static __INLINE void PMSM_FOC_idq_Assign(void) {
-	if (_gFOC_Ctrl.in.b_MTPA_calibrate) {
-		float s, c;
-		normal_sincosf(degree_2_pi(_gFOC_Ctrl.in.s_manualAngle + 90.0f), &s, &c);
-		_gFOC_Ctrl.in.s_targetIdq.d = _gFOC_Ctrl.in.s_targetCurrent * c;
-		_gFOC_Ctrl.in.s_targetIdq.q = _gFOC_Ctrl.in.s_targetCurrent * s;
-	}else {
-		_gFOC_Ctrl.in.s_targetIdq.d = 0;
-		_gFOC_Ctrl.in.s_targetIdq.q = _gFOC_Ctrl.in.s_targetCurrent;
+	if (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_CURRENT) {
+		if (_gFOC_Ctrl.in.b_MTPA_calibrate && (_gFOC_Ctrl.in.s_manualAngle != INVALID_ANGLE)) {
+			float s, c;
+			normal_sincosf(degree_2_pi(_gFOC_Ctrl.in.s_manualAngle + 90.0f), &s, &c);
+			_gFOC_Ctrl.in.s_targetIdq.d = _gFOC_Ctrl.in.s_targetCurrent * c;
+			_gFOC_Ctrl.in.s_targetIdq.q = _gFOC_Ctrl.in.s_targetCurrent * s;
+		}else {
+			_gFOC_Ctrl.in.s_targetIdq.d = 0;
+			_gFOC_Ctrl.in.s_targetIdq.q = _gFOC_Ctrl.in.s_targetCurrent;
+		}
+	}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);
 }
 
-static __INLINE void PMSM_FOC_Update_PI_Spd(void) {
-	/* update speed pi ctrl */
-	if (_gFOC_Ctrl.params.s_maxIdq != _gFOC_Ctrl.pi_ctl_spd->max) {
-		_gFOC_Ctrl.pi_ctl_spd->max = _gFOC_Ctrl.params.s_maxIdq;
-	}
-	if (_gFOC_Ctrl.params.s_minIdq != _gFOC_Ctrl.pi_ctl_spd->min) {
-		_gFOC_Ctrl.pi_ctl_spd->min = _gFOC_Ctrl.params.s_minIdq;
-	}
-}
-
-static __INLINE void PMSM_FOC_Update_PI_Trq(void) {
-	/* update speed pi ctrl */
-	float trqIs = _gFOC_Ctrl.in.s_targetTrque;
-	if (trqIs != _gFOC_Ctrl.pi_ctl_trq->max) {
-		_gFOC_Ctrl.pi_ctl_trq->max = trqIs;
-	}
-}
-
-
 /*called in media task */
 void PMSM_FOC_idqCalc(void) {
 	if (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_CURRENT) {
 		_gFOC_Ctrl.in.s_targetCurrent = eCtrl_get_RefCurrent();
 	}else if (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_TRQ) {
-		PMSM_FOC_Update_PI_Trq();
+		_gFOC_Ctrl.pi_ctl_trq->max = eCtrl_get_RefTorque();
+		_gFOC_Ctrl.pi_ctl_trq->min = -eCtrl_get_RefTorque();
 		float errRef = _gFOC_Ctrl.params.s_maxRPM - _gFOC_Ctrl.in.s_motRPM;
-		_gFOC_Ctrl.in.s_targetCurrent = PI_Controller_run(_gFOC_Ctrl.pi_ctl_trq, errRef);
+		_gFOC_Ctrl.in.s_targetTorque = PI_Controller_run(_gFOC_Ctrl.pi_ctl_trq, errRef);
 	}else {
-		float errRef = min(eCtrl_get_RefSpeed(), _gFOC_Ctrl.params.s_maxRPM) - _gFOC_Ctrl.in.s_motRPM;
-		PMSM_FOC_Update_PI_Spd();
-		_gFOC_Ctrl.in.s_targetCurrent = PI_Controller_run(_gFOC_Ctrl.pi_ctl_spd, errRef);
-		
+		_gFOC_Ctrl.pi_ctl_spd->max = _gFOC_Ctrl.params.s_maxIdq;
+		_gFOC_Ctrl.pi_ctl_spd->min = _gFOC_Ctrl.params.s_minIdq;
+		float errRef = eCtrl_get_RefSpeed() - _gFOC_Ctrl.in.s_motRPM;
+		_gFOC_Ctrl.in.s_targetTorque = PI_Controller_run(_gFOC_Ctrl.pi_ctl_spd, errRef);		
 	}
 	PMSM_FOC_idq_Assign();
 }
@@ -375,7 +370,7 @@ bool PMSM_FOC_Set_Speed(float rpm) {
 	if (_gFOC_Ctrl.in.b_cruiseEna) {
 		return false;
 	}
-	eCtrl_set_TgtSpeed(rpm);
+	eCtrl_set_TgtSpeed(min(rpm, _gFOC_Ctrl.params.s_maxRPM));
 	return true;
 }
 
@@ -384,8 +379,8 @@ bool PMSM_FOC_Set_Current(float is) {
 	return true;
 }
 
-bool PMSM_FOC_Set_Trque(float trq) {
-	_gFOC_Ctrl.in.s_targetTrque = trq;
+bool PMSM_FOC_Set_Torque(float trq) {
+	eCtrl_set_TgtTorque(trq);
 	return true;
 }
 
@@ -399,7 +394,13 @@ bool PMSM_FOC_Set_CruiseSpeed(float rpm) {
 }
 
 void PMSM_FOC_MTPA_Calibrate(bool enable) {
-	_gFOC_Ctrl.in.b_MTPA_calibrate = enable;
+	if (enable) {
+		_gFOC_Ctrl.in.b_MTPA_calibrate = true;
+		_gFOC_Ctrl.in.s_manualAngle = 0;
+	}else {
+		_gFOC_Ctrl.in.s_manualAngle = INVALID_ANGLE;
+		_gFOC_Ctrl.in.b_MTPA_calibrate = false;
+	}
 }
 
 void PMSM_FOC_Set_Angle(float angle) {

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

@@ -35,7 +35,7 @@ typedef struct {
 	float 	s_targetCurrent;
 	DQ_t    s_targetIdq;
 	DQ_t    s_targetVdq;
-	float   s_targetTrque;
+	float   s_targetTorque; //限速后的实际扭矩
 	float 	s_vDC;
 	u8      n_ctlMode;
 	bool    b_motEnable;
@@ -138,7 +138,7 @@ void PMSM_FOC_SetCtrlMode(u8 mode);
 void PMSM_FOC_SetOpenVdq(float vd, float vq);
 bool PMSM_FOC_EnableCruise(bool enable);
 bool PMSM_FOC_Set_Speed(float rpm);
-bool PMSM_FOC_Set_Trque(float trque);
+bool PMSM_FOC_Set_Torque(float trque);
 bool PMSM_FOC_Set_Current(float current);
 bool PMSM_FOC_Set_CruiseSpeed(float rpm);
 float PMSM_FOC_GetSpeed(void);

+ 17 - 11
Applications/foc/core/PMSM_FOC_Params.h

@@ -5,6 +5,8 @@
 static PI_Controller PI_Ctrl_ID = {
 	.kp = (CURRENT_BANDWITH * MOTOR_Ld),
 	.ki = (CURRENT_BANDWITH * MOTOR_R),
+	.kp_s = (CURRENT_BANDWITH * MOTOR_Ld),
+	.ki_s = (MOTOR_R/MOTOR_Ld),
 	.max = (MAX_vDC),
 	.min = (-MAX_vDC),
 	.DT  = (1.0f/(float)IDQ_CTRL_TS),
@@ -14,35 +16,39 @@ static PI_Controller PI_Ctrl_ID = {
 static PI_Controller PI_Ctrl_IQ = {
 	.kp = (CURRENT_BANDWITH * MOTOR_Lq),
 	.ki = (CURRENT_BANDWITH * MOTOR_R),
+	.kp_s = (CURRENT_BANDWITH * MOTOR_Lq),
+	.ki_s = (MOTOR_R/MOTOR_Lq),
 	.max = (MAX_vDC),
 	.min = (-MAX_vDC),
 	.DT  = (1.0f/(float)IDQ_CTRL_TS),
 	.Ui = 0,
 };
 
-static PI_Controller PI_Ctrl_Spd = {
-	.kp = (0.001f),
-	.ki = (0.003f),
-	.max = (MAX_iDQ),
-	.min = (-MAX_iDQ),
+static PI_Controller PI_Ctrl_trq = {
+	.kp = 0.001f,
+	.ki = 0.001f,
+	.max = (MAX_TORQUE),
+	.min = (-MAX_TORQUE),
 	.DT  = (1.0f/(float)SPD_CTRL_TS),
 	.Ui = 0,
 };
 
-static PI_Controller PI_Ctrl_fw = {
-	.kp = (0.001f),
+static PI_Controller PI_Ctrl_Spd = {
+	.kp = (0.01f),
 	.ki = (0.003f),
-	.max = (20),
-	.min = (0),
+	.max = (MAX_TORQUE),
+	.min = (-MAX_TORQUE),
 	.DT  = (1.0f/(float)SPD_CTRL_TS),
 	.Ui = 0,
 };
 
-static PI_Controller PI_Ctrl_trq = {
+static PI_Controller PI_Ctrl_fw = {
 	.kp = (0.001f),
 	.ki = (0.003f),
-	.max = (MAX_iDQ),
+	.max = (20),
 	.min = (0),
 	.DT  = (1.0f/(float)SPD_CTRL_TS),
 	.Ui = 0,
 };
+
+

+ 28 - 9
Applications/foc/core/e_ctrl.c

@@ -6,6 +6,7 @@
 static e_Ctrl g_eCtrl;
 static void _eCtrl_set_TgtCurrent(float c);
 static void _eCtrl_set_TgtSpeed(float s);
+static void _eCtrl_set_TgtTorque(float t);
 
 void eCtrl_init(u16 ebrk_time, u16 accl_time){
 	g_eCtrl.ebrk_time = ebrk_time;
@@ -19,7 +20,7 @@ void eCtrl_init(u16 ebrk_time, u16 accl_time){
 	g_eCtrl.ebrk_shadow = g_eCtrl.ebrk_time;
 	g_eCtrl.accl_shadow = g_eCtrl.accl_time;
 
-	eRamp_init(&g_eCtrl.torque);
+	eRamp_init(&g_eCtrl.current);
 	eRamp_init(&g_eCtrl.speed);
 }
 
@@ -30,8 +31,13 @@ void eCtrl_set_accl_brk(u16 accl_time, u16 ebrk_time) {
 
 
 void eCtrl_set_TgtCurrent(float c) {
-	g_eCtrl.torque_shadow = c;
+	g_eCtrl.current_shadow = c;
 }
+
+void eCtrl_set_TgtTorque(float t) {
+	g_eCtrl.torque_shadow = t;
+}
+
 void eCtrl_set_TgtSpeed(float s) {
 	g_eCtrl.speed_shadow = s;
 }
@@ -43,14 +49,18 @@ void eCtrl_Running(void) {
 		g_eCtrl.accl_time = g_eCtrl.accl_shadow;
 		etime_changed = true;
 	}
-	if (g_eCtrl.torque_shadow != g_eCtrl.torque.target || etime_changed) {
-		_eCtrl_set_TgtCurrent(g_eCtrl.torque_shadow);
+	if (g_eCtrl.current_shadow != g_eCtrl.current.target || etime_changed) {
+		_eCtrl_set_TgtCurrent(g_eCtrl.current_shadow);
 	}
 	if (g_eCtrl.speed_shadow != g_eCtrl.speed.target || etime_changed) {
 		_eCtrl_set_TgtSpeed(g_eCtrl.speed_shadow);
 	}
-	eRamp_running(&g_eCtrl.torque);
+	if (g_eCtrl.torque_shadow != g_eCtrl.torque.target || etime_changed) {
+		_eCtrl_set_TgtTorque(g_eCtrl.torque_shadow);
+	}	
+	eRamp_running(&g_eCtrl.current);
 	eRamp_running(&g_eCtrl.speed);
+	eRamp_running(&g_eCtrl.torque);
 }
 
 static void _eCtrl_set_target(e_Ramp *ramp, float c) {
@@ -78,29 +88,38 @@ static void _eCtrl_set_target(e_Ramp *ramp, float c) {
 
 }
 static void _eCtrl_set_TgtCurrent(float c) {
-	_eCtrl_set_target(&g_eCtrl.torque, c);
+	_eCtrl_set_target(&g_eCtrl.current, c);
 }
 
 static void _eCtrl_set_TgtSpeed(float s) {
 	_eCtrl_set_target(&g_eCtrl.speed, s);
 }
 
-
+static void _eCtrl_set_TgtTorque(float t) {
+	_eCtrl_set_target(&g_eCtrl.torque, t);
+}
 
 float eCtrl_get_RefSpeed(void) {
 	return eRamp_get_intepolation(&g_eCtrl.speed);
 }
 
 float eCtrl_get_RefCurrent(void) {
-	return eRamp_get_intepolation(&g_eCtrl.torque);
+	return eRamp_get_intepolation(&g_eCtrl.current);
 }
 
+float eCtrl_get_RefTorque(void) {
+	return eRamp_get_intepolation(&g_eCtrl.torque);
+}
 
 float eCtrl_get_FinalSpeed(void) {
 	return eRamp_get_target(&g_eCtrl.speed);
 }
 
 float eCtrl_get_FinalCurrent(void) {
+	return eRamp_get_target(&g_eCtrl.current);
+}
+
+float eCtrl_get_FinalTorque(void) {
 	return eRamp_get_target(&g_eCtrl.torque);
 }
 
@@ -120,7 +139,7 @@ void eCtrl_brake_signal(bool hw_brake) {
 				ebrk_torque = eCTRL_NEG_TORQUE;
 			}
 		}
-		eCtrl_set_TgtCurrent(ebrk_torque);
+		eCtrl_set_TgtTorque(ebrk_torque);
 		eCtrl_set_TgtSpeed(ebrk_speed);
 	}
 }

+ 5 - 0
Applications/foc/core/e_ctrl.h

@@ -15,10 +15,12 @@ typedef struct {
 	u16  accl_time; //加速时间(ms),时间越短,加速性能越好
 	bool hw_brake;
 	u64  brake_ts;//检测到刹车开始时间
+	e_Ramp current;
 	e_Ramp torque;
 	e_Ramp speed;
 	u16  ebrk_shadow;
 	u16  accl_shadow;
+	float current_shadow;
 	float torque_shadow;
 	float speed_shadow;
 }e_Ctrl;
@@ -61,11 +63,14 @@ void eCtrl_init(u16 ebrk_time, u16 accl_time);
 void eCtrl_set_accl_brk(u16 accl_time, u16 ebrk_time);
 void eCtrl_brake_signal(bool hw_brake);
 void eCtrl_set_TgtCurrent(float c);
+void eCtrl_set_TgtTorque(float t);
 void eCtrl_set_TgtSpeed(float s);
 float eCtrl_get_RefSpeed(void);
 float eCtrl_get_RefCurrent(void);
+float eCtrl_get_RefTorque(void);
 float eCtrl_get_FinalSpeed(void);
 float eCtrl_get_FinalCurrent(void);
+float eCtrl_get_FinalTorque(void);
 void eCtrl_Running(void);
 
 #endif /* EBRAKE_CTRL_H__ */

+ 13 - 0
Applications/foc/core/torque_lut.c

@@ -0,0 +1,13 @@
+#include "foc/core/torque_lut.h"
+/*
+通过查表获取对应扭矩和速度时的Id和IQ的分配
+*/
+void torque_lut_init(void) {
+
+}
+
+void torque_lut_get_idq(float torque, float rpm, DQ_t *dq_out) {
+	dq_out->d = 0;
+	dq_out->q = torque;
+}
+

+ 10 - 0
Applications/foc/core/torque_lut.h

@@ -0,0 +1,10 @@
+#ifndef _TORQUE_LUT_H__
+#define _TORQUE_LUT_H__
+#include "os/os_types.h"
+#include "foc/core/PMSM_FOC_Core.h"
+
+void torque_lut_init(void);
+void torque_lut_get_idq(float torque, float rpm, DQ_t *dq_out);
+
+#endif /*_TORQUE_LUT_H__ */
+

+ 3 - 2
Applications/foc/foc_config.h

@@ -13,6 +13,7 @@
 #define MAX_SPEED          8200 /* 最大转速 RPM*/
 #define MAX_iDC            45   /* 最大母线电流 A*/
 #define MIN_CRUISE_RPM 	   1000     /* 能启动定速巡航的最小速度 */
+#define MAX_TORQUE         30
 #ifdef GD32_FOC_DEMO
 #define MAX_vDC (24)   /* 母线最大电压 V*/
 #else
@@ -31,9 +32,9 @@
 #define SPD_CTRL_MS (1000/SPD_CTRL_TS * 100)
 #define VDQ_RAMP_TS 100
 #define VDQ_RAMP_FINAL_TIME 3000
-#define CURRENT_BANDWITH 100 /* 电流环带宽 */
+#define CURRENT_BANDWITH 1000 /* 电流环带宽 */
 
-#define SVM_Modulation (0.96f)
+#define SVM_Modulation (0.85f)
 
 #endif /* _FOC_CONFIG_H__ */
 

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

@@ -196,7 +196,7 @@ void phase_current_point(void *p){
 	out->n_Sample1 = FOC_PWM_Half_Period + 1;
 	out->n_Sample2 = FOC_PWM_Half_Period + 1;
 
-	if (get_mid_duty(max_hi_side, out) == -1) {
+	if (get_mid_duty(max_hi_side, out) != 0) {
 		u32 mid_hi_side;
 		out->n_Sample1 = FOC_PWM_Half_Period + 1;
 		out->n_Sample2 = FOC_PWM_Half_Period + 1;		

+ 5 - 3
Applications/foc/motor/hall.c

@@ -19,7 +19,9 @@ static u32 _hall_detect_task(void *args);
 static void _hall_init_el_angle(void);
 
 
-#define HALL_PLACE_OFFSET (230) //(345) //315
+//#define HALL_PLACE_OFFSET (360-25)//(230) //(345) //315
+#define HALL_PLACE_OFFSET (230)
+
 /* 
 4,5,1,3,2,6,4
 */
@@ -88,7 +90,7 @@ static void hall_sensor_default(void) {
 	memset(&_sensor_hander, 0, sizeof(_sensor_hander));
 	_sensor_hander.phase_offset = HALL_PLACE_OFFSET;//mc_config_get()->hall_offset;
 	for (int i = 0; i < 8; i++) {
-		_sensor_hander.angle_table[i] = S32Q19(mc_config_get()->hall_table[i]);
+		_sensor_hander.angle_table[i] = (mc_config_get()->hall_table[i]);
 	}
 	_sensor_hander.manual_angle = 0x3FF;
 	_hall_init_el_angle();
@@ -205,7 +207,7 @@ bool hall_detect_angle_finish(void) {
 			fast_norm_angle(&ang);
 			_sensor_hander.angle_table[i] = (ang);
 		} else {
-			_sensor_hander.angle_table[i] = S32Q19(0x3FF);
+			_sensor_hander.angle_table[i] = (0x3FF);
 			fails++;
 		}
 	}

+ 5 - 3
Applications/foc/motor/motor.c

@@ -110,7 +110,9 @@ void mc_hall_calibrate(s16 vd) {
 	for (int i = 0; i < 50; i++) {
 		for (s16 angle = 0; angle < 360; angle++) {
 			PMSM_FOC_Set_Angle(angle);
-			hall_detect_offset(angle);
+			if (i > 10 && i < 40) {
+				hall_detect_offset(angle);
+			}
 			delay_ms(1);
 		}
 	}
@@ -208,7 +210,7 @@ void TIMER_UP_IRQHandler(void){
 	time_measure_start(&g_meas_timeup);
 }
 
-measure_time_t g_meas_foc = {.exec_max_time = 20, .intval_max_time = 50,  .intval_low_err = 0, .intval_hi_err = 0, .first = true,};
+measure_time_t g_meas_foc = {.exec_max_time = 20, .intval_max_time = 62,  .intval_low_err = 0, .intval_hi_err = 0, .first = true,};
 #define TIME_MEATURE_START() time_measure_start(&g_meas_foc)
 #define TIME_MEATURE_END() time_measure_end(&g_meas_foc)
 
@@ -248,7 +250,7 @@ void Sched_MC_mTask(void) {
 				PMSM_FOC_Set_Speed(speed_Ref);
 			}else if (runMode == CTRL_MODE_TRQ) {
 				float torque_idq = _get_idq_from_throttle();
-				PMSM_FOC_Set_Trque(torque_idq);
+				PMSM_FOC_Set_Torque(torque_idq);
 			}
 		}		
 		PMSM_FOC_idqCalc();

+ 10 - 4
Applications/foc/motor/motor_param.h

@@ -1,9 +1,15 @@
 #ifndef _MOTOR_PARAM_H__
 #define _MOTOR_PARAM_H__
 
-#define MOTOR_R   0.33F
-#define MOTOR_Ld   0.00136F
-#define MOTOR_Lq   0.00136F
+#if 1
+#define MOTOR_R   0.33f
+#define MOTOR_Ld   0.00136f
+#define MOTOR_Lq   0.00136f
 #define MOTOR_POLES     2
-
+#else
+#define MOTOR_R   0.67f//0.33F
+#define MOTOR_Ld   0.00149f//0.00136F
+#define MOTOR_Lq   0.00149f//0.00136F
+#define MOTOR_POLES     2
+#endif
 #endif /* _MOTOR_PARAM_H__ */

+ 1 - 1
Applications/math/fast_math.h

@@ -33,7 +33,7 @@ static void normal_sincosf(float angle, float *sin, float *cos) {
 #define degree_2_pi(d) ((float)(d) * M_PI / 180.0f)
 #define pi_2_degree(d) ((float)(d) * 180.0f / M_PI)
 
-
+#define INVALID_ANGLE 0x3DFF
 /**
  * A simple low pass filter.
  *

+ 65 - 54
Project/GD32_DEMO.uvoptx

@@ -120,7 +120,6 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGUARM</Key>
-          <Name>?</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
@@ -396,6 +395,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>11</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Applications\foc\core\torque_lut.c</PathWithFileName>
+      <FilenameWithoutPath>torque_lut.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -406,7 +417,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>11</FileNumber>
+      <FileNumber>12</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -418,7 +429,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>12</FileNumber>
+      <FileNumber>13</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -430,7 +441,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>13</FileNumber>
+      <FileNumber>14</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -450,7 +461,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>14</FileNumber>
+      <FileNumber>15</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -462,7 +473,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>15</FileNumber>
+      <FileNumber>16</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -474,7 +485,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>16</FileNumber>
+      <FileNumber>17</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -486,7 +497,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>17</FileNumber>
+      <FileNumber>18</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -506,7 +517,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>18</FileNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -518,7 +529,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -530,7 +541,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <FileNumber>21</FileNumber>
       <FileType>4</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -550,7 +561,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -562,7 +573,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -574,7 +585,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <FileNumber>24</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -586,7 +597,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <FileNumber>25</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -598,7 +609,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <FileNumber>26</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -610,7 +621,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <FileNumber>27</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -622,7 +633,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -634,7 +645,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -646,7 +657,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -658,7 +669,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -670,7 +681,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -682,7 +693,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -694,7 +705,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>33</FileNumber>
+      <FileNumber>34</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -706,7 +717,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>34</FileNumber>
+      <FileNumber>35</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -718,7 +729,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>35</FileNumber>
+      <FileNumber>36</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -732,13 +743,13 @@
 
   <Group>
     <GroupName>Libs</GroupName>
-    <tvExp>0</tvExp>
+    <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>36</FileNumber>
+      <FileNumber>37</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -750,7 +761,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>37</FileNumber>
+      <FileNumber>38</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -762,7 +773,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>38</FileNumber>
+      <FileNumber>39</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -774,7 +785,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>39</FileNumber>
+      <FileNumber>40</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -786,7 +797,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>40</FileNumber>
+      <FileNumber>41</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -798,7 +809,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>41</FileNumber>
+      <FileNumber>42</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -818,7 +829,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>42</FileNumber>
+      <FileNumber>43</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -830,7 +841,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>43</FileNumber>
+      <FileNumber>44</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -842,7 +853,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>44</FileNumber>
+      <FileNumber>45</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -862,7 +873,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>45</FileNumber>
+      <FileNumber>46</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -874,7 +885,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>46</FileNumber>
+      <FileNumber>47</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -886,7 +897,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>47</FileNumber>
+      <FileNumber>48</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -898,7 +909,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>48</FileNumber>
+      <FileNumber>49</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -910,7 +921,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>49</FileNumber>
+      <FileNumber>50</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -922,7 +933,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>50</FileNumber>
+      <FileNumber>51</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -934,7 +945,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>51</FileNumber>
+      <FileNumber>52</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -946,7 +957,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>52</FileNumber>
+      <FileNumber>53</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -958,7 +969,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>53</FileNumber>
+      <FileNumber>54</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -970,7 +981,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>54</FileNumber>
+      <FileNumber>55</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -982,7 +993,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>55</FileNumber>
+      <FileNumber>56</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -994,7 +1005,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>56</FileNumber>
+      <FileNumber>57</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1006,7 +1017,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>57</FileNumber>
+      <FileNumber>58</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1018,7 +1029,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>58</FileNumber>
+      <FileNumber>59</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1030,7 +1041,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>59</FileNumber>
+      <FileNumber>60</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1042,7 +1053,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>60</FileNumber>
+      <FileNumber>61</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1062,7 +1073,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>61</FileNumber>
+      <FileNumber>62</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1074,7 +1085,7 @@
     </File>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>62</FileNumber>
+      <FileNumber>63</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>

+ 5 - 0
Project/GD32_DEMO.uvprojx

@@ -438,6 +438,11 @@
               <FileType>1</FileType>
               <FilePath>..\Applications\foc\core\svpwm.c</FilePath>
             </File>
+            <File>
+              <FileName>torque_lut.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Applications\foc\core\torque_lut.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>