|
@@ -215,7 +215,7 @@ void PMSM_FOC_CoreInit(void) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
gFoc_Ctrl.params.n_modulation = CONFIG_SVM_MODULATION;//SVM_Modulation;
|
|
gFoc_Ctrl.params.n_modulation = CONFIG_SVM_MODULATION;//SVM_Modulation;
|
|
|
- gFoc_Ctrl.params.n_PhaseFilterCeof = (CONFIG_CURR_LP_PARAM>1.0f?1.0f:CONFIG_CURR_LP_PARAM);
|
|
|
|
|
|
|
+ gFoc_Ctrl.params.n_PhaseFilterCeof = CONFIG_CURR_LP_CEOF;
|
|
|
gFoc_Ctrl.params.n_poles = nv_get_motor_params()->poles;//MOTOR_POLES;
|
|
gFoc_Ctrl.params.n_poles = nv_get_motor_params()->poles;//MOTOR_POLES;
|
|
|
gFoc_Ctrl.in.s_manualAngle = INVALID_ANGLE;
|
|
gFoc_Ctrl.in.s_manualAngle = INVALID_ANGLE;
|
|
|
gFoc_Ctrl.in.b_fwEnable = nv_get_foc_params()->n_FwEnable;
|
|
gFoc_Ctrl.in.b_fwEnable = nv_get_foc_params()->n_FwEnable;
|
|
@@ -239,17 +239,13 @@ void PMSM_FOC_CoreInit(void) {
|
|
|
gFoc_Ctrl.plot_type = Plot_Phase_curr;
|
|
gFoc_Ctrl.plot_type = Plot_Phase_curr;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-//#define PHASE_LFP_FIR
|
|
|
|
|
-//#define PHASE_LFP
|
|
|
|
|
|
|
+//#define CONFIG_USER_PHASE_LFP
|
|
|
static __INLINE void PMSM_FOC_Update_Hardware(void) {
|
|
static __INLINE void PMSM_FOC_Update_Hardware(void) {
|
|
|
AB_t iAB;
|
|
AB_t iAB;
|
|
|
-#ifdef PHASE_LFP
|
|
|
|
|
- float *iabc = gFoc_Ctrl.in.s_iABCComp;
|
|
|
|
|
-#elif defined PHASE_LFP_FIR
|
|
|
|
|
- float *iabc = gFoc_Ctrl.in.s_iABCFilter;
|
|
|
|
|
-#else
|
|
|
|
|
- float *iabc = gFoc_Ctrl.in.s_iABC;
|
|
|
|
|
|
|
+#ifdef CONFIG_USER_PHASE_LFP
|
|
|
|
|
+ float *iabc_filted = gFoc_Ctrl.in.s_iABCComp;
|
|
|
#endif
|
|
#endif
|
|
|
|
|
+ float *iabc = gFoc_Ctrl.in.s_iABC;
|
|
|
|
|
|
|
|
if (!gFoc_Ctrl.in.b_MTPA_calibrate && (gFoc_Ctrl.in.s_manualAngle != INVALID_ANGLE)) {
|
|
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_motAngle = gFoc_Ctrl.in.s_manualAngle;
|
|
@@ -267,24 +263,39 @@ static __INLINE void PMSM_FOC_Update_Hardware(void) {
|
|
|
//sample current
|
|
//sample current
|
|
|
phase_current_get(gFoc_Ctrl.in.s_iABC);
|
|
phase_current_get(gFoc_Ctrl.in.s_iABC);
|
|
|
get_phase_vols(gFoc_Ctrl.in.s_vABC);
|
|
get_phase_vols(gFoc_Ctrl.in.s_vABC);
|
|
|
-
|
|
|
|
|
-#ifdef PHASE_LFP
|
|
|
|
|
- LowPass_Filter(gFoc_Ctrl.in.s_iABCFilter[0], gFoc_Ctrl.in.s_iABC[0], gFoc_Ctrl.params.n_PhaseFilterCeof);
|
|
|
|
|
- LowPass_Filter(gFoc_Ctrl.in.s_iABCFilter[1], gFoc_Ctrl.in.s_iABC[1], gFoc_Ctrl.params.n_PhaseFilterCeof);
|
|
|
|
|
- LowPass_Filter(gFoc_Ctrl.in.s_iABCFilter[2], gFoc_Ctrl.in.s_iABC[2], gFoc_Ctrl.params.n_PhaseFilterCeof);
|
|
|
|
|
- float comp = lp_compestion(gFoc_Ctrl.in.s_motRPM/60.0f*4.0f, CONFIG_CURR_LP_CUT_FREQ);
|
|
|
|
|
- gFoc_Ctrl.in.s_iABCComp[0] = gFoc_Ctrl.in.s_iABCFilter[0] * comp;
|
|
|
|
|
- gFoc_Ctrl.in.s_iABCComp[1] = gFoc_Ctrl.in.s_iABCFilter[1] * comp;
|
|
|
|
|
- gFoc_Ctrl.in.s_iABCComp[2] = gFoc_Ctrl.in.s_iABCFilter[2] * comp;
|
|
|
|
|
-#elif defined PHASE_LFP_FIR
|
|
|
|
|
- gFoc_Ctrl.in.s_iABCFilter[1] = Fir_Filter(&phase1, gFoc_Ctrl.in.s_iABC[1]);
|
|
|
|
|
- gFoc_Ctrl.in.s_iABCFilter[2] = Fir_Filter(&phase2, gFoc_Ctrl.in.s_iABC[2]);
|
|
|
|
|
- gFoc_Ctrl.in.s_iABCFilter[0] = -(gFoc_Ctrl.in.s_iABCFilter[1] + gFoc_Ctrl.in.s_iABCFilter[2]);
|
|
|
|
|
-#endif
|
|
|
|
|
|
|
+
|
|
|
Clark(iabc[0], iabc[1], iabc[2], &iAB);
|
|
Clark(iabc[0], iabc[1], iabc[2], &iAB);
|
|
|
#ifdef CONFIG_SMO_OBSERVER
|
|
#ifdef CONFIG_SMO_OBSERVER
|
|
|
gFoc_Ctrl.in.s_smoAngle = smo_observer_update(gFoc_Ctrl.out.s_OutVAB.a, gFoc_Ctrl.out.s_OutVAB.b, iAB.a, iAB.b);
|
|
gFoc_Ctrl.in.s_smoAngle = smo_observer_update(gFoc_Ctrl.out.s_OutVAB.a, gFoc_Ctrl.out.s_OutVAB.b, iAB.a, iAB.b);
|
|
|
#endif
|
|
#endif
|
|
|
|
|
+
|
|
|
|
|
+#ifdef CONFIG_USER_PHASE_LFP
|
|
|
|
|
+ float e_freq = gFoc_Ctrl.in.s_motRPM / 60.0f * gFoc_Ctrl.params.n_poles;
|
|
|
|
|
+ float lpf_wc;
|
|
|
|
|
+ float lpf_comp = 1.0f;
|
|
|
|
|
+ if (e_freq <= 150.0f) {
|
|
|
|
|
+ lpf_wc = 600.0f;
|
|
|
|
|
+ if (e_freq >= 100) {
|
|
|
|
|
+ lpf_comp = 1.02f;
|
|
|
|
|
+ }else if (e_freq >= 50) {
|
|
|
|
|
+ lpf_comp = 1.01;
|
|
|
|
|
+ }
|
|
|
|
|
+ }else {
|
|
|
|
|
+ lpf_wc = e_freq * 4.0f;
|
|
|
|
|
+ lpf_comp = 1.03f;
|
|
|
|
|
+ }
|
|
|
|
|
+ gFoc_Ctrl.params.n_PhaseFilterCeof = (lpf_wc*2*M_PI*FOC_CTRL_US);
|
|
|
|
|
+ LowPass_Filter(gFoc_Ctrl.in.s_iABCFilter[0], gFoc_Ctrl.in.s_iABC[0], gFoc_Ctrl.params.n_PhaseFilterCeof);
|
|
|
|
|
+ LowPass_Filter(gFoc_Ctrl.in.s_iABCFilter[1], gFoc_Ctrl.in.s_iABC[1], gFoc_Ctrl.params.n_PhaseFilterCeof);
|
|
|
|
|
+ gFoc_Ctrl.in.s_iABCFilter[2] = - (gFoc_Ctrl.in.s_iABCFilter[0] + gFoc_Ctrl.in.s_iABCFilter[1]);
|
|
|
|
|
+
|
|
|
|
|
+ gFoc_Ctrl.in.s_iABCComp[0] = gFoc_Ctrl.in.s_iABCFilter[0] * lpf_comp;
|
|
|
|
|
+ gFoc_Ctrl.in.s_iABCComp[1] = gFoc_Ctrl.in.s_iABCFilter[1] * lpf_comp;
|
|
|
|
|
+ gFoc_Ctrl.in.s_iABCComp[2] = gFoc_Ctrl.in.s_iABCFilter[2] * lpf_comp;
|
|
|
|
|
+
|
|
|
|
|
+ Clark(iabc_filted[0], iabc_filted[1], iabc_filted[2], &iAB);
|
|
|
|
|
+#endif
|
|
|
|
|
+
|
|
|
SinCos_Lut(gFoc_Ctrl.in.s_motAngle, &gFoc_Ctrl.out.sin, &gFoc_Ctrl.out.cos);
|
|
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);
|
|
Park(&iAB, gFoc_Ctrl.in.s_motAngle, &gFoc_Ctrl.out.s_RealIdq);
|