|
|
@@ -241,6 +241,33 @@ void PMSM_FOC_CoreInit(void) {
|
|
|
|
|
|
gFoc_Ctrl.plot_type = Plot_None;
|
|
|
}
|
|
|
+
|
|
|
+/* 通过三相电流重构母线电流,和单电阻采样正好相反,原理一致 */
|
|
|
+static __INLINE void PMSM_FOC_Calc_iDC_Fast(void) {
|
|
|
+ float deadtime = (float)(NS_2_TCLK(PWM_DEAD_TIME_NS))/(float)FOC_PWM_Half_Period;
|
|
|
+ float duty_pu[3];
|
|
|
+ duty_pu[0] = (float)gFoc_Ctrl.out.n_Duty[0] / (float)FOC_PWM_Half_Period;
|
|
|
+ duty_pu[1] = (float)gFoc_Ctrl.out.n_Duty[1] / (float)FOC_PWM_Half_Period;
|
|
|
+ duty_pu[2] = (float)gFoc_Ctrl.out.n_Duty[2] / (float)FOC_PWM_Half_Period;
|
|
|
+
|
|
|
+ float *iABC = gFoc_Ctrl.in.s_iABC;
|
|
|
+ float iDC;
|
|
|
+ if ((duty_pu[0] >= duty_pu[1]) && (duty_pu[1] >= duty_pu[2])) {
|
|
|
+ iDC = iABC[0] * MAX(duty_pu[0] - duty_pu[1] - deadtime, 0) + (iABC[0] + iABC[1]) * MAX(duty_pu[1] - duty_pu[2] - deadtime, 0);
|
|
|
+ }else if ((duty_pu[0] >= duty_pu[2]) && (duty_pu[2] >= duty_pu[1])) {
|
|
|
+ iDC = iABC[0] * MAX(duty_pu[0] - duty_pu[2] - deadtime, 0) + (iABC[0] + iABC[2]) * MAX(duty_pu[2] - duty_pu[1] - deadtime, 0);
|
|
|
+ }else if ((duty_pu[1] >= duty_pu[0]) && (duty_pu[0] >= duty_pu[2])) {
|
|
|
+ iDC = iABC[1] * MAX(duty_pu[1] - duty_pu[0] - deadtime, 0) + (iABC[1] + iABC[0]) * MAX(duty_pu[0] - duty_pu[2] - deadtime, 0);
|
|
|
+ }else if ((duty_pu[1] >= duty_pu[2]) && (duty_pu[2] >= duty_pu[0])) {
|
|
|
+ iDC = iABC[1] * MAX(duty_pu[1] - duty_pu[2] - deadtime, 0) + (iABC[1] + iABC[2]) * MAX(duty_pu[2] - duty_pu[0] - deadtime, 0);
|
|
|
+ }else if ((duty_pu[2] >= duty_pu[0]) && (duty_pu[0] >= duty_pu[1])) {
|
|
|
+ iDC = iABC[2] * MAX(duty_pu[2] - duty_pu[0] - deadtime, 0) + (iABC[2] + iABC[0]) * MAX(duty_pu[0] - duty_pu[1] - deadtime, 0);
|
|
|
+ }else { // duty_pu[2] >= duty_pu[1] && duty_pu[1] >= duty_pu[0]
|
|
|
+ iDC = iABC[2] * MAX(duty_pu[2] - duty_pu[1] - deadtime, 0) + (iABC[2] + iABC[1]) * MAX(duty_pu[1] - duty_pu[0] - deadtime, 0);
|
|
|
+ }
|
|
|
+ LowPass_Filter(gFoc_Ctrl.out.s_CalciDC2, iDC, 0.01f);
|
|
|
+}
|
|
|
+
|
|
|
//#define UPDATE_Lq_By_iq /* Q轴电感 通过Iq电流补偿 */
|
|
|
//#define Volvec_Delay_Comp /* 电压矢量角度补偿 */
|
|
|
static __INLINE float PMSM_FOC_Update_Input(void) {
|
|
|
@@ -250,6 +277,8 @@ static __INLINE float PMSM_FOC_Update_Input(void) {
|
|
|
|
|
|
phase_current_get(iabc);
|
|
|
|
|
|
+ PMSM_FOC_Calc_iDC_Fast();
|
|
|
+
|
|
|
Clark(iabc[0], iabc[1], iabc[2], &iAB);
|
|
|
|
|
|
foc_observer_update(gFoc_Ctrl.out.s_OutVAB.a * 0.66667f, gFoc_Ctrl.out.s_OutVAB.b * 0.66667f, iAB.a, iAB.b);
|
|
|
@@ -265,16 +294,13 @@ static __INLINE float PMSM_FOC_Update_Input(void) {
|
|
|
|
|
|
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 = enc_angle;
|
|
|
}else {
|
|
|
- gFoc_Ctrl.in.s_hallAngle = enc_angle;
|
|
|
- gFoc_Ctrl.in.s_motAngle = gFoc_Ctrl.in.s_hallAngle;
|
|
|
+ gFoc_Ctrl.in.s_motAngle = enc_angle;
|
|
|
}
|
|
|
gFoc_Ctrl.in.s_motVelocity = enc_vel;
|
|
|
LowPass_Filter(gFoc_Ctrl.in.s_motRPMFilted, gFoc_Ctrl.in.s_motVelocity, 0.005f);
|
|
|
gFoc_Ctrl.in.s_motVelDegreePers = gFoc_Ctrl.in.s_motVelocity / 30.0f * PI * gFoc_Ctrl.params.n_poles;
|
|
|
#ifdef CONFIG_DQ_STEP_RESPONSE
|
|
|
- gFoc_Ctrl.in.s_hallAngle = 0;
|
|
|
gFoc_Ctrl.in.s_motAngle = 0;
|
|
|
#endif
|
|
|
|
|
|
@@ -407,7 +433,7 @@ void PMSM_FOC_Schedule(void) {
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_LogDebug(void) {
|
|
|
- sys_debug("DC curr %f, Lq %f\n", gFoc_Ctrl.out.s_CalciDC, gFoc_Ctrl.params.lq);
|
|
|
+ sys_debug("DC curr %f --- %f\n", gFoc_Ctrl.out.s_CalciDC, gFoc_Ctrl.out.s_CalciDC2);
|
|
|
}
|
|
|
|
|
|
/*called in media task */
|