|
|
@@ -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);
|