|
|
@@ -138,26 +138,33 @@ void PMSM_FOC_CoreInit(void) {
|
|
|
_gFOC_Ctrl.pi_ctl_power = &PI_Ctrl_Power;
|
|
|
memset(&_gFOC_Ctrl.in, 0, sizeof(_gFOC_Ctrl.in));
|
|
|
memset(&_gFOC_Ctrl.out, 0, sizeof(_gFOC_Ctrl.out));
|
|
|
- _gFOC_Ctrl.params.s_maxiDC = nv_get_foc_params()->s_maxiDC;//(MAX_iDQ);
|
|
|
- _gFOC_Ctrl.params.s_maxRPM = nv_get_foc_params()->s_maxRPM;//(MAX_SPEED);
|
|
|
- _gFOC_Ctrl.params.s_maxTorque = nv_get_foc_params()->s_maxTorque;//MAX_TORQUE;
|
|
|
- _gFOC_Ctrl.in.s_vDC = nv_get_foc_params()->s_maxvDC;//(MAX_vDC);
|
|
|
- _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.s_maxIdq = nv_get_foc_params()->s_maxIdq;//MAX_iDQ;
|
|
|
- _gFOC_Ctrl.params.s_minIdq = nv_get_foc_params()->s_minIdq;//-MAX_iDQ;
|
|
|
+ memset(&_gFOC_Ctrl.userLim, 0, sizeof(_gFOC_Ctrl.userLim));
|
|
|
+
|
|
|
+ _gFOC_Ctrl.hwLim.s_iDCMax = CONFIG_MAX_VBUS_CURRENT;
|
|
|
+ _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_torqueMax = CONFIG_MAX_TORQUE;
|
|
|
+ _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_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_iDCeBrkLim = nv_get_foc_params()->s_maxBrkCurrent;
|
|
|
+ _gFOC_Ctrl.userLim.s_PhaseeVoleBrkLim = _gFOC_Ctrl.hwLim.s_PhaseVolMax - 20;
|
|
|
+
|
|
|
_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_LimitiDC = nv_get_foc_params()->s_LimitiDC;
|
|
|
+ _gFOC_Ctrl.in.s_manualAngle = INVALID_ANGLE;
|
|
|
+ _gFOC_Ctrl.in.s_vDC = nv_get_foc_params()->s_maxvDC;//(MAX_vDC);
|
|
|
+
|
|
|
_gFOC_Ctrl.out.n_RunMode = CTRL_MODE_OPEN;
|
|
|
_gFOC_Ctrl.out.f_vdqRation = 0;
|
|
|
- _gFOC_Ctrl.in.s_manualAngle = INVALID_ANGLE;
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
FOC_DqRamp_init(&_gFOC_Ctrl.idq_ctl[0], 1);
|
|
|
FOC_DqRamp_init(&_gFOC_Ctrl.idq_ctl[1], 1);
|
|
|
|
|
|
@@ -347,7 +354,7 @@ u8 PMSM_FOC_CtrlMode(void) {
|
|
|
/* MPTA, 弱磁, 功率限制,主要是分配DQ轴电流 */
|
|
|
static __INLINE float PMSM_FOC_Limit_Power(float maxTrq) {
|
|
|
PI_Ctrl_Power.max = maxTrq;
|
|
|
- float errRef = _gFOC_Ctrl.in.s_LimitiDC - _gFOC_Ctrl.out.s_FilteriDC;
|
|
|
+ float errRef = _gFOC_Ctrl.userLim.s_iDCLim - _gFOC_Ctrl.out.s_FilteriDC;
|
|
|
return PI_Controller_run(_gFOC_Ctrl.pi_ctl_power, errRef);
|
|
|
}
|
|
|
static __INLINE void PMSM_FOC_idq_Assign(void) {
|
|
|
@@ -394,12 +401,12 @@ void PMSM_FOC_idqCalc(void) {
|
|
|
_gFOC_Ctrl.pi_ctl_trq->max = 0;
|
|
|
_gFOC_Ctrl.pi_ctl_trq->min = 0; //防止倒转
|
|
|
}
|
|
|
- float errRef = _gFOC_Ctrl.params.s_maxRPM - _gFOC_Ctrl.in.s_motRPM;
|
|
|
+ float errRef = _gFOC_Ctrl.userLim.s_motRPMLim - _gFOC_Ctrl.in.s_motRPM;
|
|
|
float maxTrq = PI_Controller_RunSat(_gFOC_Ctrl.pi_ctl_trq, errRef, _gFOC_Ctrl.params.n_TrqVelLimGain);
|
|
|
_gFOC_Ctrl.in.s_targetTorque = PMSM_FOC_Limit_Power(maxTrq);
|
|
|
}else if (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_SPD){
|
|
|
- _gFOC_Ctrl.pi_ctl_spd->max = _gFOC_Ctrl.params.s_maxIdq;
|
|
|
- _gFOC_Ctrl.pi_ctl_spd->min = _gFOC_Ctrl.params.s_minIdq;
|
|
|
+ _gFOC_Ctrl.pi_ctl_spd->max = _gFOC_Ctrl.userLim.s_PhaseCurrLim;
|
|
|
+ _gFOC_Ctrl.pi_ctl_spd->min = -_gFOC_Ctrl.userLim.s_PhaseCurrLim;
|
|
|
float refSpeed = eCtrl_get_RefSpeed();
|
|
|
if (_gFOC_Ctrl.in.b_cruiseEna) {
|
|
|
refSpeed = _gFOC_Ctrl.in.s_cruiseRPM;
|
|
|
@@ -437,30 +444,37 @@ bool PMSM_FOC_Is_Start(void) {
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_iBusLimit(float ibusLimit) {
|
|
|
- _gFOC_Ctrl.params.s_maxiDC = (ibusLimit);
|
|
|
+ _gFOC_Ctrl.userLim.s_iDCLim = (ibusLimit);
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_SpeedLimit(float speedLimit) {
|
|
|
- if (speedLimit > MAX_SPEED) {
|
|
|
- speedLimit = MAX_SPEED;
|
|
|
+ if (speedLimit > _gFOC_Ctrl.hwLim.s_motRPMMax) {
|
|
|
+ speedLimit = _gFOC_Ctrl.hwLim.s_motRPMMax;
|
|
|
}
|
|
|
- _gFOC_Ctrl.params.s_maxRPM = (speedLimit);
|
|
|
+ _gFOC_Ctrl.userLim.s_motRPMLim = (speedLimit);
|
|
|
}
|
|
|
|
|
|
float PMSM_FOC_GetSpeedLimit(void) {
|
|
|
- return _gFOC_Ctrl.params.s_maxRPM;
|
|
|
+ return _gFOC_Ctrl.userLim.s_motRPMLim;
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_TorqueLimit(float torqueLimit) {
|
|
|
- if (torqueLimit > MAX_TORQUE) {
|
|
|
- torqueLimit = MAX_TORQUE;
|
|
|
+ if (torqueLimit > _gFOC_Ctrl.hwLim.s_torqueMax) {
|
|
|
+ torqueLimit = _gFOC_Ctrl.hwLim.s_torqueMax;
|
|
|
}
|
|
|
- _gFOC_Ctrl.params.s_maxTorque = torqueLimit;
|
|
|
+ _gFOC_Ctrl.userLim.s_torqueLim = torqueLimit;
|
|
|
}
|
|
|
float PMSM_FOC_GetTorqueLimit(void) {
|
|
|
- return _gFOC_Ctrl.params.s_maxTorque;
|
|
|
+ return _gFOC_Ctrl.userLim.s_torqueLim;
|
|
|
+}
|
|
|
+
|
|
|
+void PMSM_FOC_SeteBrkPhaseCurrent(float curr) {
|
|
|
+ _gFOC_Ctrl.userLim.s_iDCeBrkLim = curr;
|
|
|
}
|
|
|
|
|
|
+float PMSM_FOC_GeteBrkPhaseCurrent(void) {
|
|
|
+ return _gFOC_Ctrl.userLim.s_iDCeBrkLim ;
|
|
|
+}
|
|
|
|
|
|
void PMSM_FOC_VbusVoltage(float vbusVol) {
|
|
|
_gFOC_Ctrl.in.s_vDC = vbusVol;
|
|
|
@@ -503,7 +517,7 @@ bool PMSM_FOC_Set_Speed(float rpm) {
|
|
|
if (_gFOC_Ctrl.in.b_cruiseEna) {
|
|
|
return false;
|
|
|
}
|
|
|
- eCtrl_set_TgtSpeed(min(ABS(rpm), _gFOC_Ctrl.params.s_maxRPM)*SIGN(rpm));
|
|
|
+ eCtrl_set_TgtSpeed(min(ABS(rpm), _gFOC_Ctrl.userLim.s_motRPMLim)*SIGN(rpm));
|
|
|
return true;
|
|
|
}
|
|
|
|