Przeglądaj źródła

使用PI_Controller_RunVel控制限速和速度环,根据文档调整硬件死区时间

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 2 lat temu
rodzic
commit
27156825ec

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

@@ -10,7 +10,7 @@
 #define TIM_CLOCK_MHz (200u)
 #define ADC_CLOCK (25000000u)
 #define ADC_CLOCK_MHz (30u)
-#define NS_PER_TCLK (5u) /* (1/120000000 * 1000000000) */
+#define NS_PER_TCLK (5u) /* (1/200000000 * 1000000000) */
 #define NS_2_TCLK(ns) (((ns)/NS_PER_TCLK) + 1u) //ns תΪpwmʹ�õ��Ǹ�TIM��clk count
 #define FOC_PWM_FS (16000u)
 #define FOC_PWM_period (TIM_CLOCK/FOC_PWM_FS)

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

@@ -49,8 +49,8 @@
 #define SCHED_TIMER_IRQHandler TIMER5_IRQHandler
 
 #define PWM_DEAD_TIME_NS 400u
-#define HW_DEAD_TIME_NS  300u
-#define HW_RISE_TIME_NS  500u
+#define HW_DEAD_TIME_NS  210u
+#define HW_RISE_TIME_NS  150u
 #define HW_NOISE_TIME_NS 300u
 
 #define TDead NS_2_TCLK(HW_DEAD_TIME_NS + PWM_DEAD_TIME_NS)/* ����ʱ�� */ 

+ 11 - 9
Applications/foc/core/PI_Controller.h

@@ -70,17 +70,19 @@ static __INLINE float PI_Controller_Run(PI_Controller *pi, float err) {
 
 static __INLINE float PI_Controller_RunVel(PI_Controller *pi, float err) {
 	float kp_err = (err) * pi->kp;
-	float ki_err = (err) * pi->ki;
-	float i_max = pi->max - kp_err;
+	float ki_err = (kp_err) * pi->ki;
+	float integral = ki_err * pi->DT;
 
-	if (i_max < pi->min) {
-		i_max = pi->min;
-	}
-	pi->Ui += ki_err * pi->DT;
-	pi->Ui = fclamp(pi->Ui, pi->min, i_max);
+	pi->Ui = pi->Ui + integral;
 	float out = pi->Ui + kp_err;
-
-	return fclamp(out, pi->min, pi->max);
+	if (out > pi->max) {
+		out = pi->max;
+		pi->Ui = out - kp_err;
+	}else if (out < pi->min) {
+		out = pi->min;
+		pi->Ui = out - kp_err;
+	}
+	return out;
 }
 
 

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

@@ -413,8 +413,8 @@ static __INLINE void PMSM_FOC_Phase_Unbalance(void) {
 
 
 //#define UPDATE_Lq_By_iq   /* Q轴电感 通过Iq电流补偿 */
-#define Volvec_Delay_Comp /* 电压矢量角度补偿 */
-#define Volvec_Delay_Comp_Start_Vel 500 // rpm
+#define CONFIG_Volvec_Delay_Comp /* 电压矢量角度补偿 */
+#define CONFIG_Volvec_Delay_Comp_Start_Vel 500 // rpm
 static __INLINE bool PMSM_FOC_Update_Input(void) {
 	AB_t iAB;
 	float *iabc = gFoc_Ctrl.in.s_iABC;
@@ -464,8 +464,8 @@ static __INLINE bool PMSM_FOC_Update_Input(void) {
 
 	LowPass_Filter(gFoc_Ctrl.out.s_FilterIdq.d, gFoc_Ctrl.out.s_RealIdq.d, 0.004f);
 	LowPass_Filter(gFoc_Ctrl.out.s_FilterIdq.q, gFoc_Ctrl.out.s_RealIdq.q, 0.004f);
-#ifdef Volvec_Delay_Comp
-	if (gFoc_Ctrl.in.s_motVelocityFiltered >= Volvec_Delay_Comp_Start_Vel) {
+#ifdef CONFIG_Volvec_Delay_Comp
+	if (gFoc_Ctrl.in.s_motVelocityFiltered >= CONFIG_Volvec_Delay_Comp_Start_Vel) {
 		float next_angle = gFoc_Ctrl.in.s_motAngle + gFoc_Ctrl.in.s_motVelDegreePers / PI * 180.0f * (FOC_CTRL_US * 0.8f);
 		rand_angle(next_angle);
 		SinCos_Lut(next_angle, &gFoc_Ctrl.out.sin, &gFoc_Ctrl.out.cos);
@@ -793,7 +793,7 @@ static __INLINE float PMSM_FOC_Limit_Speed(float maxTrq) {
 	gFoc_Ctrl.pi_vel_lim.min = 0;
 
 	float err = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.rpmLimRamp) - gFoc_Ctrl.in.s_motVelocity;
-	return PI_Controller_RunSerial(&gFoc_Ctrl.pi_vel_lim, err);
+	return PI_Controller_RunVel(&gFoc_Ctrl.pi_vel_lim, err);
 #endif
 }
 
@@ -885,7 +885,7 @@ void PMSM_FOC_idqCalc(void) {
 		}
 		gFoc_Ctrl.in.s_targetRPM = refSpeed;
 		float errRef = refSpeed - gFoc_Ctrl.in.s_motVelocity;
-		float maxTrq = PI_Controller_RunSerial(&gFoc_Ctrl.pi_vel, errRef);
+		float maxTrq = PI_Controller_RunVel(&gFoc_Ctrl.pi_vel, errRef);
 #endif
 		maxTrq = PMSM_FOC_Limit_iDC(maxTrq);
 		crosszero_step_towards(&gFoc_Ctrl.in.s_targetTorque, maxTrq);

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

@@ -86,7 +86,6 @@ typedef struct {
 typedef struct {
 	float 	s_iABC[3];
 	float 	s_iABCFilter[3];
-	float   s_iABCComp[3];
 	float   s_vABC[3];
 	float   s_motVelocity;   //from hall or encoder
 	float 	s_motAngle; //from hall or encoder