|
|
@@ -489,6 +489,20 @@ static __INLINE void PMSM_FOC_DeadTime_Compensate(s32 PWM_Half_Period) {
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+static __INLINE void Phase_Voltage_update(float lowpass) {
|
|
|
+ float v_ABC[3];
|
|
|
+ get_uvw_phases_raw(v_ABC);
|
|
|
+ LowPass_Filter(gFoc_Ctrl.in.s_SamplePhaseV[0], v_ABC[0], lowpass);
|
|
|
+ LowPass_Filter(gFoc_Ctrl.in.s_SamplePhaseV[1], v_ABC[1], lowpass);
|
|
|
+ LowPass_Filter(gFoc_Ctrl.in.s_SamplePhaseV[2], v_ABC[2], lowpass);
|
|
|
+ /* phase voltage = phase-phase voltage / sqrt(3), 1.4是滤波器幅值补偿系数 */
|
|
|
+ float phase_vAN = (gFoc_Ctrl.in.s_SamplePhaseV[0] - gFoc_Ctrl.in.s_SamplePhaseV[1]) * ONE_BY_SQRT3 * 1.4f;
|
|
|
+ float phase_vBN = (gFoc_Ctrl.in.s_SamplePhaseV[1] - gFoc_Ctrl.in.s_SamplePhaseV[2]) * ONE_BY_SQRT3 * 1.4f;
|
|
|
+ float phase_vCN = (gFoc_Ctrl.in.s_SamplePhaseV[2] - gFoc_Ctrl.in.s_SamplePhaseV[0]) * ONE_BY_SQRT3 * 1.4f;
|
|
|
+ Clark(phase_vAN, phase_vBN, phase_vCN, &gFoc_Ctrl.out.s_SampleAB);
|
|
|
+ Park(&gFoc_Ctrl.out.s_SampleAB, gFoc_Ctrl.in.s_motAngle, &gFoc_Ctrl.out.s_SamplevDQ);
|
|
|
+}
|
|
|
+
|
|
|
//#define UPDATE_Lq_By_iq /* Q轴电感 通过Iq电流补偿 */
|
|
|
#define CONFIG_Volvec_Delay_Comp /* 电压矢量角度补偿 */
|
|
|
#define CONFIG_Volvec_Delay_Comp_Start_Vel 500 // rpm
|
|
|
@@ -540,23 +554,24 @@ static __INLINE bool PMSM_FOC_Update_Input(void) {
|
|
|
|
|
|
gFoc_Ctrl.in.s_vDC = get_vbus_float();
|
|
|
|
|
|
- get_phase_vols(gFoc_Ctrl.in.s_vABC);
|
|
|
-
|
|
|
SinCos_Lut(gFoc_Ctrl.in.s_motAngle, &gFoc_Ctrl.out.sin, &gFoc_Ctrl.out.cos);
|
|
|
Park(&iAB, gFoc_Ctrl.in.s_motAngle, &gFoc_Ctrl.out.s_RealIdq);
|
|
|
|
|
|
- float lowpass = gFoc_Ctrl.in.s_motVelRadusPers * FOC_CTRL_US * 2.0f;
|
|
|
- if (lowpass > 1.0f) {
|
|
|
- lowpass = 1.0f;
|
|
|
- }else if (lowpass <= 0.0001f) {
|
|
|
- lowpass = 0.001f;
|
|
|
+ float lowpass = gFoc_Ctrl.in.s_motVelRadusPers * FOC_CTRL_US;
|
|
|
+ float iqLowPass = lowpass * 2.0f;
|
|
|
+ if (iqLowPass > 1.0f) {
|
|
|
+ iqLowPass = 1.0f;
|
|
|
+ }else if (iqLowPass <= 0.0001f) {
|
|
|
+ iqLowPass = 0.001f;
|
|
|
}
|
|
|
- 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);
|
|
|
-
|
|
|
+ LowPass_Filter(gFoc_Ctrl.out.s_FilterIdq.d, gFoc_Ctrl.out.s_RealIdq.d, iqLowPass);
|
|
|
+ LowPass_Filter(gFoc_Ctrl.out.s_FilterIdq.q, gFoc_Ctrl.out.s_RealIdq.q, iqLowPass);
|
|
|
/* 使用低通后的dq电流重新变换得到abc电流,给死区补偿使用 */
|
|
|
RevPark(&gFoc_Ctrl.out.s_FilterIdq, gFoc_Ctrl.in.s_motAngle, &iAB);
|
|
|
RevClark(&iAB, gFoc_Ctrl.in.s_iABC_DT);
|
|
|
+
|
|
|
+ Phase_Voltage_update(lowpass);
|
|
|
+
|
|
|
#ifdef CONFIG_START_LINE_DTC_CURRENT
|
|
|
gFoc_Ctrl.out.s_OutVdqDTC.d = 0;
|
|
|
gFoc_Ctrl.out.s_OutVdqDTC.q = 0;
|
|
|
@@ -696,7 +711,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_FilteriDC, gFoc_Ctrl.userLim.s_iDCLim);
|
|
|
+ sys_debug("DC curr %f --- %f, %f\n", gFoc_Ctrl.out.s_CalciDC, gFoc_Ctrl.out.s_FilteriDC, gFoc_Ctrl.out.s_CalciDC2);
|
|
|
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) {
|
|
|
@@ -1435,22 +1450,28 @@ void PMSM_FOC_Set_PlotType(Plot_t t) {
|
|
|
}
|
|
|
//获取母线电流和实际输出电流矢量大小
|
|
|
void PMSM_FOC_Calc_Current(void) {
|
|
|
- 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 vd = gFoc_Ctrl.out.s_OutVdq.d - gFoc_Ctrl.out.s_OutVdqDTC.d * TWO_BY_THREE;
|
|
|
+ float vq = gFoc_Ctrl.out.s_OutVdq.q - gFoc_Ctrl.out.s_OutVdqDTC.q * TWO_BY_THREE;
|
|
|
|
|
|
float id = gFoc_Ctrl.out.s_FilterIdq.d;
|
|
|
float iq = gFoc_Ctrl.out.s_FilterIdq.q;
|
|
|
/*
|
|
|
根据公式(等幅值变换,功率不等):
|
|
|
- iDC x vDC = 2/3(iq x vq + id x vd);
|
|
|
+ iDC x vDC = 3/2(iq x vq + id x vd);
|
|
|
*/
|
|
|
- float m_pow = (vd * id + vq * iq); //s32q10
|
|
|
+ float m_pow = (vd * id + vq * iq);
|
|
|
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
|
|
|
+ raw_idc = m_pow / v_dc;
|
|
|
}
|
|
|
LowPass_Filter(gFoc_Ctrl.out.s_CalciDC, raw_idc, 0.02f);
|
|
|
+
|
|
|
+ m_pow = (gFoc_Ctrl.out.s_SamplevDQ.d * id + gFoc_Ctrl.out.s_SamplevDQ.q * iq) * 1.5f;
|
|
|
+ if (v_dc != 0.0f) {
|
|
|
+ raw_idc = m_pow / v_dc;
|
|
|
+ }
|
|
|
+ LowPass_Filter(gFoc_Ctrl.out.s_CalciDC2, raw_idc, 0.02f);
|
|
|
#ifdef VBUS_I_CHAN
|
|
|
raw_idc = get_vbus_current();
|
|
|
LowPass_Filter(gFoc_Ctrl.out.s_FilteriDC, raw_idc, 0.05f);
|