|
|
@@ -165,10 +165,10 @@ static void PMSM_FOC_Conf_PID(void) {
|
|
|
|
|
|
static void PMSM_FOC_UserInit(void) {
|
|
|
memset(&gFoc_Ctrl.userLim, 0, sizeof(gFoc_Ctrl.userLim));
|
|
|
- gFoc_Ctrl.userLim.s_iDCLim = nv_get_foc_params()->s_maxiDC;
|
|
|
- gFoc_Ctrl.userLim.s_motRPMLim = nv_get_foc_params()->s_maxRPM;//(MAX_SPEED);
|
|
|
+ gFoc_Ctrl.userLim.s_iDCLim = min(nv_get_foc_params()->s_LimitiDC, gFoc_Ctrl.hwLim.s_iDCMax);
|
|
|
+ gFoc_Ctrl.userLim.s_motRPMLim = min(nv_get_foc_params()->s_maxRPM, gFoc_Ctrl.hwLim.s_motRPMMax);
|
|
|
gFoc_Ctrl.userLim.s_torqueLim = nv_get_foc_params()->s_maxTorque;//MAX_TORQUE;
|
|
|
- gFoc_Ctrl.userLim.s_PhaseCurrLim = nv_get_foc_params()->s_PhaseCurrLim;
|
|
|
+ gFoc_Ctrl.userLim.s_PhaseCurrLim = min(nv_get_foc_params()->s_PhaseCurrLim, gFoc_Ctrl.hwLim.s_PhaseCurrMax);
|
|
|
gFoc_Ctrl.userLim.s_vDCMaxLim = nv_get_foc_params()->s_maxDCVol;
|
|
|
gFoc_Ctrl.userLim.s_vDCMinLim = nv_get_foc_params()->s_minDCVol;
|
|
|
gFoc_Ctrl.userLim.s_iDCeBrkLim = nv_get_foc_params()->s_iDCeBrkLim;
|
|
|
@@ -231,7 +231,7 @@ void PMSM_FOC_CoreInit(void) {
|
|
|
static __INLINE void PMSM_FOC_Update_Hardware(void) {
|
|
|
AB_t vAB;
|
|
|
#ifdef PHASE_LFP
|
|
|
- float *iabc = gFoc_Ctrl.in.s_iABCFilter;
|
|
|
+ float *iabc = gFoc_Ctrl.in.s_iABCComp;
|
|
|
#elif defined PHASE_LFP_FIR
|
|
|
float *iabc = gFoc_Ctrl.in.s_iABCFilter;
|
|
|
#else
|
|
|
@@ -268,6 +268,10 @@ static __INLINE void PMSM_FOC_Update_Hardware(void) {
|
|
|
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]);
|
|
|
@@ -369,7 +373,7 @@ void PMSM_FOC_Schedule(void) {
|
|
|
if (gFoc_Ctrl.plot_type != Plot_None) {
|
|
|
if (gFoc_Ctrl.ctrl_count % 5 == 0) {
|
|
|
if (gFoc_Ctrl.plot_type == Plot_Phase_curr) {
|
|
|
- plot_3data16(FtoS16x10(gFoc_Ctrl.in.s_iABCFilter[0]), FtoS16x10(gFoc_Ctrl.in.s_iABCFilter[1]), FtoS16x10(gFoc_Ctrl.in.s_iABCFilter[2]));
|
|
|
+ plot_3data16(FtoS16x10(gFoc_Ctrl.in.s_iABC[0]), FtoS16x10(gFoc_Ctrl.in.s_iABCFilter[0]), FtoS16x10(gFoc_Ctrl.in.s_iABCComp[0]));
|
|
|
}else if (gFoc_Ctrl.plot_type == Plot_Phase_vol) {
|
|
|
plot_3data16(FtoS16x10(gFoc_Ctrl.in.s_vABC[0]), FtoS16x10(gFoc_Ctrl.in.s_vABC[1]), FtoS16x10(gFoc_Ctrl.in.s_vABC[2]));
|
|
|
}
|
|
|
@@ -415,7 +419,7 @@ u8 PMSM_FOC_CtrlMode(void) {
|
|
|
|
|
|
/* MPTA, 弱磁, 功率限制,主要是分配DQ轴电流 */
|
|
|
static __INLINE float PMSM_FOC_Limit_Power(float maxTrq) {
|
|
|
-#if 0
|
|
|
+#if 1
|
|
|
PI_Ctrl_Power.max = maxTrq;
|
|
|
float errRef = eRamp_get_intepolation(&gFoc_Ctrl.userLim.DCCurrLimRamp) - gFoc_Ctrl.out.s_FilteriDC;
|
|
|
return PI_Controller_run(gFoc_Ctrl.pi_power, errRef);
|