|
|
@@ -226,7 +226,7 @@ void PMSM_FOC_CoreInit(void) {
|
|
|
gFoc_Ctrl.in.s_manualAngle = INVALID_ANGLE;
|
|
|
gFoc_Ctrl.in.b_fwEnable = nv_get_foc_params()->n_FwEnable;
|
|
|
gFoc_Ctrl.in.s_vDC = nv_get_foc_params()->s_maxDCVol;//(CONFIG_RATED_DC_VOL);
|
|
|
-
|
|
|
+ gFoc_Ctrl.params.f_DCLim = get_vbus_float();
|
|
|
eRamp_init_target(&gFoc_Ctrl.in.cruiseRpmRamp, 0, CONFIG_ACC_TIME, CONFIG_DEC_TIME);
|
|
|
|
|
|
gFoc_Ctrl.out.n_RunMode = CTRL_MODE_OPEN;
|
|
|
@@ -308,11 +308,17 @@ static __INLINE void PMSM_FOC_Update_Hardware(void) {
|
|
|
|
|
|
static __INLINE void PMSM_FOC_Update_PI_Idq(void) {
|
|
|
/* update id pi ctrl */
|
|
|
- gFoc_Ctrl.params.maxvDQ.d = gFoc_Ctrl.in.s_vDC * gFoc_Ctrl.params.n_modulation;//CONFIG_RATED_DC_VOL;
|
|
|
- gFoc_Ctrl.params.minvDQ.d = -gFoc_Ctrl.in.s_vDC * gFoc_Ctrl.params.n_modulation;//CONFIG_RATED_DC_VOL;
|
|
|
- gFoc_Ctrl.params.maxvDQ.q = gFoc_Ctrl.in.s_vDC * gFoc_Ctrl.params.n_modulation;//CONFIG_RATED_DC_VOL;
|
|
|
- gFoc_Ctrl.params.minvDQ.q = -gFoc_Ctrl.in.s_vDC * gFoc_Ctrl.params.n_modulation;//CONFIG_RATED_DC_VOL;
|
|
|
-
|
|
|
+ if (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_TRQ) {
|
|
|
+ gFoc_Ctrl.params.maxvDQ.d = gFoc_Ctrl.params.f_DCLim * gFoc_Ctrl.params.n_modulation;//CONFIG_RATED_DC_VOL;
|
|
|
+ gFoc_Ctrl.params.minvDQ.d = -gFoc_Ctrl.params.f_DCLim * gFoc_Ctrl.params.n_modulation;//CONFIG_RATED_DC_VOL;
|
|
|
+ gFoc_Ctrl.params.maxvDQ.q = gFoc_Ctrl.params.f_DCLim * gFoc_Ctrl.params.n_modulation;//CONFIG_RATED_DC_VOL;
|
|
|
+ gFoc_Ctrl.params.minvDQ.q = -gFoc_Ctrl.params.f_DCLim * gFoc_Ctrl.params.n_modulation;//CONFIG_RATED_DC_VOL;
|
|
|
+ }else {
|
|
|
+ gFoc_Ctrl.params.maxvDQ.d = gFoc_Ctrl.in.s_vDC * gFoc_Ctrl.params.n_modulation;//CONFIG_RATED_DC_VOL;
|
|
|
+ gFoc_Ctrl.params.minvDQ.d = -gFoc_Ctrl.in.s_vDC * gFoc_Ctrl.params.n_modulation;//CONFIG_RATED_DC_VOL;
|
|
|
+ gFoc_Ctrl.params.maxvDQ.q = gFoc_Ctrl.in.s_vDC * gFoc_Ctrl.params.n_modulation;//CONFIG_RATED_DC_VOL;
|
|
|
+ gFoc_Ctrl.params.minvDQ.q = -gFoc_Ctrl.in.s_vDC * gFoc_Ctrl.params.n_modulation;//CONFIG_RATED_DC_VOL;
|
|
|
+ }
|
|
|
if (gFoc_Ctrl.params.maxvDQ.d != gFoc_Ctrl.pi_id->max) {
|
|
|
gFoc_Ctrl.pi_id->max = gFoc_Ctrl.params.maxvDQ.d;
|
|
|
}
|
|
|
@@ -507,28 +513,23 @@ static __INLINE float PMSM_FOC_Limit_iDC(float maxTrq) {
|
|
|
#if 1
|
|
|
gFoc_Ctrl.pi_power->max = maxTrq;
|
|
|
float errRef = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.DCCurrLimRamp) - (gFoc_Ctrl.out.s_FilteriDC);
|
|
|
- return PI_Controller_run(gFoc_Ctrl.pi_power, errRef);
|
|
|
+ return PI_Controller_Run(gFoc_Ctrl.pi_power, errRef);
|
|
|
#else
|
|
|
return maxTrq;
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-static __INLINE float PMSM_FOC_Limit_Speed(float refTorque) {
|
|
|
+static __INLINE float PMSM_FOC_Limit_Speed(float maxTrq) {
|
|
|
#if 1
|
|
|
- if (refTorque >= 0) {
|
|
|
- gFoc_Ctrl.pi_torque->max = refTorque;
|
|
|
- gFoc_Ctrl.pi_torque->min = -CONFIG_MAX_NEG_TORQUE;
|
|
|
- }else {
|
|
|
- gFoc_Ctrl.pi_torque->min = refTorque;
|
|
|
- gFoc_Ctrl.pi_torque->max = 0;
|
|
|
- }
|
|
|
-
|
|
|
- float errRef = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.rpmLimRamp) - gFoc_Ctrl.in.s_motRPM;
|
|
|
- float trq_res = PI_Controller_RunSat(gFoc_Ctrl.pi_torque, errRef);
|
|
|
+ gFoc_Ctrl.pi_torque->max = gFoc_Ctrl.in.s_vDC;
|
|
|
+ gFoc_Ctrl.pi_torque->min = 0;
|
|
|
|
|
|
- return trq_res;
|
|
|
+ float err = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.rpmLimRamp) - gFoc_Ctrl.in.s_motRPM;
|
|
|
+ gFoc_Ctrl.params.f_DCLim = PI_Controller_Run(gFoc_Ctrl.pi_torque, err);
|
|
|
+ return maxTrq;
|
|
|
#else
|
|
|
- return refTorque;
|
|
|
+ gFoc_Ctrl.params.f_DCLim = gFoc_Ctrl.in.s_vDC;
|
|
|
+ return maxTrq;
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
@@ -566,7 +567,7 @@ void PMSM_FOC_idqCalc(void) {
|
|
|
gFoc_Ctrl.pi_lock->min = -CONFIG_DEFAULT_LOCK_TORQUE_LIM;
|
|
|
float vel_count = motor_encoder_get_vel_count();
|
|
|
float errRef = 0 - vel_count;
|
|
|
- gFoc_Ctrl.in.s_targetTorque = PI_Controller_run(gFoc_Ctrl.pi_lock ,errRef);
|
|
|
+ gFoc_Ctrl.in.s_targetTorque = PI_Controller_Run(gFoc_Ctrl.pi_lock ,errRef);
|
|
|
PMSM_FOC_idq_Assign();
|
|
|
return;
|
|
|
}
|
|
|
@@ -603,7 +604,7 @@ void PMSM_FOC_idqCalc(void) {
|
|
|
}
|
|
|
gFoc_Ctrl.in.s_targetRPM = refSpeed;
|
|
|
float errRef = refSpeed - gFoc_Ctrl.in.s_motRPM;
|
|
|
- float maxTrq = PI_Controller_RunSat(gFoc_Ctrl.pi_speed, errRef);
|
|
|
+ float maxTrq = PI_Controller_Run(gFoc_Ctrl.pi_speed, errRef);
|
|
|
gFoc_Ctrl.in.s_targetTorque = PMSM_FOC_Limit_iDC(maxTrq);
|
|
|
}
|
|
|
|
|
|
@@ -633,10 +634,10 @@ void PMSM_FOC_Slow_Task(void) {
|
|
|
}
|
|
|
|
|
|
float PMSM_FOC_Get_Real_Torque(void) {
|
|
|
- if (gFoc_Ctrl.out.s_RealCurrent == 0) {
|
|
|
- gFoc_Ctrl.out.s_RealCurrent = sqrtf(SQ(gFoc_Ctrl.out.s_FilterIdq.d) + SQ(gFoc_Ctrl.out.s_FilterIdq.q));
|
|
|
+ if (gFoc_Ctrl.out.s_RealCurrentFiltered == 0) {
|
|
|
+ gFoc_Ctrl.out.s_RealCurrentFiltered = sqrtf(SQ(gFoc_Ctrl.out.s_FilterIdq.d) + SQ(gFoc_Ctrl.out.s_FilterIdq.q));
|
|
|
}
|
|
|
- return gFoc_Ctrl.out.s_RealCurrent;
|
|
|
+ return gFoc_Ctrl.out.s_RealCurrentFiltered;
|
|
|
}
|
|
|
|
|
|
PMSM_FOC_Ctrl *PMSM_FOC_Get(void) {
|
|
|
@@ -1028,7 +1029,7 @@ void PMSM_FOC_Calc_Current(void) {
|
|
|
raw_idc = get_vbus_current();
|
|
|
LowPass_Filter(gFoc_Ctrl.out.s_FilteriDC, raw_idc, 0.1f);
|
|
|
|
|
|
- gFoc_Ctrl.out.s_RealCurrent = sqrtf(SQ(gFoc_Ctrl.out.s_FilterIdq.d) + SQ(gFoc_Ctrl.out.s_FilterIdq.q));
|
|
|
+ gFoc_Ctrl.out.s_RealCurrentFiltered = sqrtf(SQ(gFoc_Ctrl.out.s_FilterIdq.d) + SQ(gFoc_Ctrl.out.s_FilterIdq.q));
|
|
|
|
|
|
}
|
|
|
|