Parcourir la source

计算母线电流需要对死区进行补偿,如果svpwm已经做了死区补偿,那么母线电流计算就不补偿

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui il y a 2 ans
Parent
commit
c795a0c367
2 fichiers modifiés avec 23 ajouts et 7 suppressions
  1. 22 7
      Applications/foc/core/PMSM_FOC_Core.c
  2. 1 0
      Applications/foc/core/PMSM_FOC_Core.h

+ 22 - 7
Applications/foc/core/PMSM_FOC_Core.c

@@ -543,10 +543,21 @@ static __INLINE bool PMSM_FOC_Update_Input(void) {
 	LowPass_Filter(gFoc_Ctrl.out.s_FilterIdq.d, gFoc_Ctrl.out.s_RealIdq.d, lowpass);
 	LowPass_Filter(gFoc_Ctrl.out.s_FilterIdq.q, gFoc_Ctrl.out.s_RealIdq.q, lowpass);
 
-	/* 使用低通后的dq电流重新变换得到abc电流 */
+	/* 使用低通后的dq电流重新变换得到abc电流,给死区补偿使用 */
 	RevPark(&gFoc_Ctrl.out.s_FilterIdq, gFoc_Ctrl.in.s_motAngle, &iAB);
 	RevClark(&iAB, gFoc_Ctrl.in.s_iABC_DT);
-
+#ifdef CONFIG_START_LINE_DTC_CURRENT
+	gFoc_Ctrl.out.s_OutVdqDTC.d = 0;
+	gFoc_Ctrl.out.s_OutVdqDTC.q = 0;
+#else
+	AB_t vAB;
+	vAB.a = (1.0f / 3.0f) * (2.0f * SIGN(gFoc_Ctrl.in.s_iABC_DT[0]) - SIGN(gFoc_Ctrl.in.s_iABC_DT[1]) - SIGN(gFoc_Ctrl.in.s_iABC_DT[2]));
+	vAB.b = ONE_BY_SQRT3 * (SIGN(gFoc_Ctrl.in.s_iABC_DT[1]) - SIGN(gFoc_Ctrl.in.s_iABC_DT[2]));
+	float dtc = ((float)CONFIG_HW_DeadTime/(float)FOC_PWM_Half_Period) * gFoc_Ctrl.in.s_vDC;
+	vAB.a = vAB.a * dtc;
+	vAB.b = vAB.b * dtc;
+	Park(&vAB, gFoc_Ctrl.in.s_motAngle, &gFoc_Ctrl.out.s_OutVdqDTC); //used for vbus current calc
+#endif
 #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);
@@ -674,7 +685,7 @@ bool PMSM_FOC_Schedule(void) {
 }
 
 void PMSM_FOC_LogDebug(void) {
-	sys_debug("DC curr %f --- %f, - %f\n", gFoc_Ctrl.out.s_CalciDC, gFoc_Ctrl.out.s_CalciDC2, gFoc_Ctrl.hwLim.s_iDCMax);
+	sys_debug("DC curr %f --- %f, - %f\n", gFoc_Ctrl.out.s_CalciDC, gFoc_Ctrl.out.s_FilteriDC, gFoc_Ctrl.hwLim.s_iDCMax);
 	sys_debug("%s\n", gFoc_Ctrl.out.empty_load?"NoLoad Running":"Load Runing");
 	sys_debug("unbalance: %d, %f, %f, %f, %f\n", phase_unbalance_cnt, phase_unbalance_r, phase_a_max, phase_b_max, phase_c_max);
 	if (obser_vel != 111111) {
@@ -1404,8 +1415,8 @@ void PMSM_FOC_Set_PlotType(Plot_t t) {
 }
 //获取母线电流和实际输出电流矢量大小
 void PMSM_FOC_Calc_Current(void) {
-	float vd = gFoc_Ctrl.out.s_OutVdq.d;
-	float vq = gFoc_Ctrl.out.s_OutVdq.q;
+	float vd = gFoc_Ctrl.out.s_OutVdq.d + gFoc_Ctrl.out.s_OutVdqDTC.d * 0.667f;
+	float vq = gFoc_Ctrl.out.s_OutVdq.q + gFoc_Ctrl.out.s_OutVdqDTC.q * 0.667f;
 
 	float id = gFoc_Ctrl.out.s_FilterIdq.d;
 	float iq = gFoc_Ctrl.out.s_FilterIdq.q;
@@ -1414,8 +1425,12 @@ void PMSM_FOC_Calc_Current(void) {
 		iDC x vDC = 2/3(iq x vq + id x vd);
 	*/
 	float m_pow = (vd * id + vq * iq); //s32q10
-	float raw_idc = m_pow / get_vbus_float();// * 1.5f * 0.66f; //s16q5
-	LowPass_Filter(gFoc_Ctrl.out.s_CalciDC, raw_idc, 0.1f);
+	float raw_idc = 0.0f;
+	float v_dc = get_vbus_float();
+	if (v_dc != 0.0f) {
+		raw_idc = m_pow / v_dc;// * 1.5f * 0.66f; //s16q5
+	}
+	LowPass_Filter(gFoc_Ctrl.out.s_CalciDC, raw_idc, 0.02f);
 
 	raw_idc = get_vbus_current();
 	LowPass_Filter(gFoc_Ctrl.out.s_FilteriDC, raw_idc, 0.05f);

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

@@ -156,6 +156,7 @@ typedef struct {
 	u16   n_Sample2;
 	u8    n_RunMode;
 	DQ_t  s_OutVdq;
+	DQ_t  s_OutVdqDTC;
 	AB_t  s_OutVAB;
 	DQ_t  s_RealIdq;
 	DQ_t  s_RealVdq;