|
|
@@ -112,11 +112,11 @@ static __INLINE void FOC_DqRamp_init(dq_Rctrl *c, int count) {
|
|
|
}
|
|
|
|
|
|
static __INLINE void FOC_Set_iDqRamp(dq_Rctrl *c, float target) {
|
|
|
- FOC_Set_DqRamp(c, target, (/*IDQ_CTRL_TS/SPD_CTRL_TS - 1*/CURRENT_LOOP_RAMP_COUNT));
|
|
|
+ FOC_Set_DqRamp(c, target, (/*CONFIG_IDQ_CTRL_TS/CONFIG_SPD_CTRL_TS - 1*/CURRENT_LOOP_RAMP_COUNT));
|
|
|
}
|
|
|
|
|
|
static __INLINE void FOC_Set_vDqRamp(dq_Rctrl *c, float target) {
|
|
|
- FOC_Set_DqRamp(c, target, (VDQ_RAMP_FINAL_TIME/1000*((IDQ_CTRL_TS/VDQ_RAMP_TS))));
|
|
|
+ FOC_Set_DqRamp(c, target, (CONFIG_FOC_VDQ_RAMP_FINAL_TIME/1000*((CONFIG_IDQ_CTRL_TS/CONFIG_FOC_VDQ_RAMP_TS))));
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -134,32 +134,32 @@ static void PMSM_FOC_Conf_PID(void) {
|
|
|
gFoc_Ctrl.pi_id->kp = nv_get_foc_params()->pid_conf[PID_D_id].kp;
|
|
|
gFoc_Ctrl.pi_id->ki = nv_get_foc_params()->pid_conf[PID_D_id].ki;
|
|
|
gFoc_Ctrl.pi_id->kb = nv_get_foc_params()->pid_conf[PID_D_id].kb;
|
|
|
- gFoc_Ctrl.pi_id->DT = (1.0f/(float)IDQ_CTRL_TS);
|
|
|
+ gFoc_Ctrl.pi_id->DT = (1.0f/(float)CONFIG_IDQ_CTRL_TS);
|
|
|
|
|
|
gFoc_Ctrl.pi_iq->kp = nv_get_foc_params()->pid_conf[PID_Q_id].kp;
|
|
|
gFoc_Ctrl.pi_iq->ki = nv_get_foc_params()->pid_conf[PID_Q_id].ki;
|
|
|
gFoc_Ctrl.pi_iq->kb = nv_get_foc_params()->pid_conf[PID_Q_id].kb;
|
|
|
- gFoc_Ctrl.pi_iq->DT = (1.0f/(float)IDQ_CTRL_TS);
|
|
|
+ gFoc_Ctrl.pi_iq->DT = (1.0f/(float)CONFIG_IDQ_CTRL_TS);
|
|
|
|
|
|
gFoc_Ctrl.pi_torque->kp = nv_get_foc_params()->pid_conf[PID_TRQ_id].kp;
|
|
|
gFoc_Ctrl.pi_torque->ki = nv_get_foc_params()->pid_conf[PID_TRQ_id].ki;
|
|
|
gFoc_Ctrl.pi_torque->kb = nv_get_foc_params()->pid_conf[PID_TRQ_id].kb;
|
|
|
- gFoc_Ctrl.pi_torque->DT = (1.0f/(float)SPD_CTRL_TS);
|
|
|
+ gFoc_Ctrl.pi_torque->DT = (1.0f/(float)CONFIG_SPD_CTRL_TS);
|
|
|
|
|
|
gFoc_Ctrl.pi_speed->kp = nv_get_foc_params()->pid_conf[PID_Spd_id].kp;
|
|
|
gFoc_Ctrl.pi_speed->ki = nv_get_foc_params()->pid_conf[PID_Spd_id].ki;
|
|
|
gFoc_Ctrl.pi_speed->kb = nv_get_foc_params()->pid_conf[PID_Spd_id].kb;
|
|
|
- gFoc_Ctrl.pi_speed->DT = (1.0f/(float)SPD_CTRL_TS);
|
|
|
+ gFoc_Ctrl.pi_speed->DT = (1.0f/(float)CONFIG_SPD_CTRL_TS);
|
|
|
|
|
|
gFoc_Ctrl.pi_power->kp = nv_get_foc_params()->pid_conf[PID_Pow_id].kp;
|
|
|
gFoc_Ctrl.pi_power->ki = nv_get_foc_params()->pid_conf[PID_Pow_id].ki;
|
|
|
gFoc_Ctrl.pi_power->kb = nv_get_foc_params()->pid_conf[PID_Pow_id].kb;
|
|
|
- gFoc_Ctrl.pi_power->DT = (1.0f/(float)SPD_CTRL_TS);
|
|
|
+ gFoc_Ctrl.pi_power->DT = (1.0f/(float)CONFIG_SPD_CTRL_TS);
|
|
|
|
|
|
gFoc_Ctrl.pi_lock->kp = nv_get_foc_params()->pid_conf[PID_Lock_id].kp;
|
|
|
gFoc_Ctrl.pi_lock->ki = nv_get_foc_params()->pid_conf[PID_Lock_id].ki;
|
|
|
gFoc_Ctrl.pi_lock->kb = nv_get_foc_params()->pid_conf[PID_Lock_id].kb;
|
|
|
- gFoc_Ctrl.pi_lock->DT = (1.0f/(float)SPD_CTRL_TS);
|
|
|
+ gFoc_Ctrl.pi_lock->DT = (1.0f/(float)CONFIG_SPD_CTRL_TS);
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -169,11 +169,13 @@ static void PMSM_FOC_UserInit(void) {
|
|
|
gFoc_Ctrl.userLim.s_motRPMLim = nv_get_foc_params()->s_maxRPM;//(MAX_SPEED);
|
|
|
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_vDCMaxLim = nv_get_foc_params()->s_maxvDC;
|
|
|
- gFoc_Ctrl.userLim.s_vDCMinLim = gFoc_Ctrl.userLim.s_vDCMaxLim / 3;
|
|
|
+ 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;
|
|
|
gFoc_Ctrl.userLim.s_PhaseCurreBrkLim = nv_get_foc_params()->s_PhaseCurreBrkLim;
|
|
|
- gFoc_Ctrl.userLim.s_PhaseVoleBrkLim = gFoc_Ctrl.hwLim.s_PhaseVolMax - 20;
|
|
|
+ gFoc_Ctrl.userLim.s_PhaseVoleBrkLim = gFoc_Ctrl.hwLim.s_PhaseVolMax;
|
|
|
+ eRamp_init_target(&gFoc_Ctrl.userLim.rpmLimRamp, gFoc_Ctrl.userLim.s_motRPMLim);
|
|
|
+ eRamp_init_target(&gFoc_Ctrl.userLim.phaseCurrLimRamp, gFoc_Ctrl.userLim.s_PhaseCurrLim);
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_CoreInit(void) {
|
|
|
@@ -196,7 +198,7 @@ void PMSM_FOC_CoreInit(void) {
|
|
|
gFoc_Ctrl.hwLim.s_motRPMMax = CONFIG_MAX_MOT_RPM;
|
|
|
gFoc_Ctrl.hwLim.s_PhaseCurrMax = CONFIG_MAX_PHASE_CURR;
|
|
|
gFoc_Ctrl.hwLim.s_PhaseVolMax = CONFIG_MAX_PHASE_VOL;
|
|
|
- gFoc_Ctrl.hwLim.s_vDCMax = CONFIG_MAX_VBUS_VOLTAGE;
|
|
|
+ gFoc_Ctrl.hwLim.s_vDCMax = CONFIG_MAX_DC_VOL;
|
|
|
gFoc_Ctrl.hwLim.s_torqueMax = CONFIG_MAX_TORQUE;
|
|
|
|
|
|
if (!g_focinit) {
|
|
|
@@ -206,10 +208,9 @@ void PMSM_FOC_CoreInit(void) {
|
|
|
}
|
|
|
gFoc_Ctrl.params.n_modulation = nv_get_foc_params()->n_modulation;//SVM_Modulation;
|
|
|
gFoc_Ctrl.params.n_PhaseFilterCeof = nv_get_foc_params()->n_PhaseFilterCeof;//(0.2f);
|
|
|
- //gFoc_Ctrl.params.n_TrqVelLimGain = nv_get_foc_params()->n_TrqVelLimGain;
|
|
|
gFoc_Ctrl.params.n_poles = nv_get_motor_params()->poles;//MOTOR_POLES;
|
|
|
gFoc_Ctrl.in.s_manualAngle = INVALID_ANGLE;
|
|
|
- gFoc_Ctrl.in.s_vDC = nv_get_foc_params()->s_maxvDC;//(MAX_vDC);
|
|
|
+ gFoc_Ctrl.in.s_vDC = nv_get_foc_params()->s_maxDCVol;//(CONFIG_RATED_DC_VOL);
|
|
|
|
|
|
gFoc_Ctrl.out.n_RunMode = CTRL_MODE_OPEN;
|
|
|
gFoc_Ctrl.out.f_vdqRation = 0;
|
|
|
@@ -217,8 +218,8 @@ void PMSM_FOC_CoreInit(void) {
|
|
|
FOC_DqRamp_init(&gFoc_Ctrl.idq_ctl[0], 1);
|
|
|
FOC_DqRamp_init(&gFoc_Ctrl.idq_ctl[1], 1);
|
|
|
|
|
|
- FOC_DqRamp_init(&gFoc_Ctrl.vdq_ctl[0], (IDQ_CTRL_TS/VDQ_RAMP_TS));
|
|
|
- FOC_DqRamp_init(&gFoc_Ctrl.vdq_ctl[1], (IDQ_CTRL_TS/VDQ_RAMP_TS));
|
|
|
+ FOC_DqRamp_init(&gFoc_Ctrl.vdq_ctl[0], (CONFIG_IDQ_CTRL_TS/CONFIG_FOC_VDQ_RAMP_TS));
|
|
|
+ FOC_DqRamp_init(&gFoc_Ctrl.vdq_ctl[1], (CONFIG_IDQ_CTRL_TS/CONFIG_FOC_VDQ_RAMP_TS));
|
|
|
PMSM_FOC_Reset_PID();
|
|
|
}
|
|
|
|
|
|
@@ -273,10 +274,10 @@ 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;//MAX_vDC;
|
|
|
- gFoc_Ctrl.params.minvDQ.d = -gFoc_Ctrl.in.s_vDC;//MAX_vDC;
|
|
|
- gFoc_Ctrl.params.maxvDQ.q = gFoc_Ctrl.in.s_vDC;//MAX_vDC;
|
|
|
- gFoc_Ctrl.params.minvDQ.q = -gFoc_Ctrl.in.s_vDC;//MAX_vDC;
|
|
|
+ gFoc_Ctrl.params.maxvDQ.d = gFoc_Ctrl.in.s_vDC;//CONFIG_RATED_DC_VOL;
|
|
|
+ gFoc_Ctrl.params.minvDQ.d = -gFoc_Ctrl.in.s_vDC;//CONFIG_RATED_DC_VOL;
|
|
|
+ gFoc_Ctrl.params.maxvDQ.q = gFoc_Ctrl.in.s_vDC;//CONFIG_RATED_DC_VOL;
|
|
|
+ gFoc_Ctrl.params.minvDQ.q = -gFoc_Ctrl.in.s_vDC;//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;
|
|
|
@@ -435,11 +436,11 @@ void PMSM_FOC_idqCalc(void) {
|
|
|
gFoc_Ctrl.pi_torque->max = 0;
|
|
|
gFoc_Ctrl.pi_torque->min = 0; //防止倒转
|
|
|
}
|
|
|
- float errRef = gFoc_Ctrl.userLim.s_motRPMLim - gFoc_Ctrl.in.s_motRPM;
|
|
|
+ float errRef = eRamp_get_intepolation(&gFoc_Ctrl.userLim.rpmLimRamp) - gFoc_Ctrl.in.s_motRPM;
|
|
|
float maxTrq = PI_Controller_RunSat(gFoc_Ctrl.pi_torque, errRef);
|
|
|
gFoc_Ctrl.in.s_targetTorque = PMSM_FOC_Limit_Power(maxTrq);
|
|
|
}else if (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_SPD){
|
|
|
- gFoc_Ctrl.pi_speed->max = gFoc_Ctrl.userLim.s_PhaseCurrLim;
|
|
|
+ gFoc_Ctrl.pi_speed->max = eRamp_get_intepolation(&gFoc_Ctrl.userLim.phaseCurrLimRamp);//gFoc_Ctrl.userLim.s_PhaseCurrLim;
|
|
|
gFoc_Ctrl.pi_speed->min = 0;//-gFoc_Ctrl.userLim.s_PhaseCurrLim;
|
|
|
float refSpeed = eCtrl_get_RefSpeed();
|
|
|
if (gFoc_Ctrl.in.b_cruiseEna) {
|
|
|
@@ -459,6 +460,12 @@ void PMSM_FOC_idqCalc(void) {
|
|
|
PMSM_FOC_idq_Assign();
|
|
|
}
|
|
|
|
|
|
+void PMSM_FOC_Slow_Task(void) {
|
|
|
+ eRamp_running(&gFoc_Ctrl.userLim.phaseCurrLimRamp);
|
|
|
+ eRamp_running(&gFoc_Ctrl.userLim.rpmLimRamp);
|
|
|
+ PMSM_FOC_idqCalc();
|
|
|
+}
|
|
|
+
|
|
|
PMSM_FOC_Ctrl *PMSM_FOC_Get(void) {
|
|
|
return &gFoc_Ctrl;
|
|
|
}
|
|
|
@@ -498,6 +505,7 @@ void PMSM_FOC_SpeedLimit(float speedLimit) {
|
|
|
speedLimit = gFoc_Ctrl.hwLim.s_motRPMMax;
|
|
|
}
|
|
|
gFoc_Ctrl.userLim.s_motRPMLim = (speedLimit);
|
|
|
+ eRamp_set_step_target(&gFoc_Ctrl.userLim.rpmLimRamp, speedLimit, CONFIG_eCTRL_STEP_TS, CONFIG_LIMIT_RAMP_TIME, CONFIG_LIMIT_RAMP_TIME);
|
|
|
}
|
|
|
|
|
|
float PMSM_FOC_GetSpeedLimit(void) {
|
|
|
@@ -561,6 +569,7 @@ void PMSM_FOC_PhaseCurrLim(float lim) {
|
|
|
lim = gFoc_Ctrl.hwLim.s_PhaseCurrMax;
|
|
|
}
|
|
|
gFoc_Ctrl.userLim.s_PhaseCurrLim = lim;
|
|
|
+ eRamp_set_step_target(&gFoc_Ctrl.userLim.phaseCurrLimRamp, lim, CONFIG_eCTRL_STEP_TS, CONFIG_LIMIT_RAMP_TIME, CONFIG_LIMIT_RAMP_TIME);
|
|
|
}
|
|
|
|
|
|
float PMSM_FOC_GetPhaseCurrLim(void) {
|