|
|
@@ -245,7 +245,7 @@ static __INLINE void PMSM_FOC_Update_Hardware(void) {
|
|
|
SinCos_Lut(_gFOC_Ctrl.in.s_motAngle, &_gFOC_Ctrl.out.sin, &_gFOC_Ctrl.out.cos);
|
|
|
|
|
|
_gFOC_Ctrl.in.s_motRPM = motor_encoder_get_speed();
|
|
|
- _gFOC_Ctrl.in.s_vDC = get_vbus_float();
|
|
|
+ _gFOC_Ctrl.in.s_vDC = get_vbus_int();
|
|
|
//sample current
|
|
|
phase_current_get(_gFOC_Ctrl.in.s_iABC);
|
|
|
get_phase_vols(_gFOC_Ctrl.in.s_vABC);
|
|
|
@@ -297,12 +297,12 @@ static __INLINE void PMSM_FOC_Update_PI_Idq(void) {
|
|
|
|
|
|
static u32 PMSM_FOC_Debug_Task(void *p) {
|
|
|
if (_gFOC_Ctrl.in.b_motEnable) {
|
|
|
- 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_iABCFilter[0]), FtoS16x10(_gFOC_Ctrl.in.s_iABCFilter[1]), _gFOC_Ctrl.in.s_motRPM);
|
|
|
+ //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(_gFOC_Ctrl.in.s_targetTorque, _gFOC_Ctrl.in.s_targetRPM, _gFOC_Ctrl.in.s_motRPM);
|
|
|
//plot_3data16(FtoS16x10(_gFOC_Ctrl.out.s_RealIdq.d), FtoS16x10(_gFOC_Ctrl.out.s_RealIdq.q), FtoS16x10(_gFOC_Ctrl.idq_ctl[1].s_FinalTgt));
|
|
|
//plot_3data16( _gFOC_Ctrl.in.s_motRPM, speed_td.target, speed_td.diff);
|
|
|
}
|
|
|
- return 0;
|
|
|
+ return 1;
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_Schedule(void) {
|
|
|
@@ -431,7 +431,7 @@ void PMSM_FOC_idqCalc(void) {
|
|
|
}else if (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_TRQ) {
|
|
|
float refTorque = eCtrl_get_FinalTorque();
|
|
|
_gFOC_Ctrl.pi_ctl_trq->max = refTorque;
|
|
|
- _gFOC_Ctrl.pi_ctl_trq->min = -refTorque;
|
|
|
+ _gFOC_Ctrl.pi_ctl_trq->min = 0;
|
|
|
if ((eCtrl_get_FinalTorque() <= 0.0001f) && (_gFOC_Ctrl.in.s_motRPM < CONFIG_MIN_RPM_EXIT_EBRAKE)) {
|
|
|
_gFOC_Ctrl.pi_ctl_trq->max = 0;
|
|
|
_gFOC_Ctrl.pi_ctl_trq->min = 0; //防止倒转
|
|
|
@@ -441,7 +441,7 @@ void PMSM_FOC_idqCalc(void) {
|
|
|
_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.userLim.s_PhaseCurrLim;
|
|
|
- _gFOC_Ctrl.pi_ctl_spd->min = -_gFOC_Ctrl.userLim.s_PhaseCurrLim;
|
|
|
+ _gFOC_Ctrl.pi_ctl_spd->min = 0;//-_gFOC_Ctrl.userLim.s_PhaseCurrLim;
|
|
|
float refSpeed = eCtrl_get_RefSpeed();
|
|
|
if (_gFOC_Ctrl.in.b_cruiseEna) {
|
|
|
refSpeed = _gFOC_Ctrl.in.s_cruiseRPM;
|
|
|
@@ -451,6 +451,7 @@ void PMSM_FOC_idqCalc(void) {
|
|
|
_gFOC_Ctrl.pi_ctl_spd->min = 0; //防止倒转
|
|
|
}
|
|
|
}
|
|
|
+ _gFOC_Ctrl.in.s_targetRPM = refSpeed;
|
|
|
float errRef = refSpeed - _gFOC_Ctrl.in.s_motRPM;
|
|
|
float maxTrq = PI_Controller_RunSat(_gFOC_Ctrl.pi_ctl_spd, errRef);
|
|
|
_gFOC_Ctrl.in.s_targetTorque = PMSM_FOC_Limit_Power(maxTrq);
|
|
|
@@ -693,16 +694,25 @@ void PMSM_FOC_LockMotor(bool lock) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void PMSM_FOC_SetPid(u8 id, float kp, float ki, float kb) {
|
|
|
- if (id > PID_Max_id) {
|
|
|
- return;
|
|
|
- }
|
|
|
+static PI_Controller *_pid(u8 id) {
|
|
|
PI_Controller *pi = NULL;
|
|
|
if (id == PID_D_id) {
|
|
|
pi = _gFOC_Ctrl.pi_ctl_id;
|
|
|
}else if (id == PID_Q_id) {
|
|
|
pi = _gFOC_Ctrl.pi_ctl_iq;
|
|
|
+ }else if (id == PID_TRQ_id) {
|
|
|
+ pi = _gFOC_Ctrl.pi_ctl_trq;
|
|
|
+ }else if (id == PID_Spd_id) {
|
|
|
+ pi = _gFOC_Ctrl.pi_ctl_spd;
|
|
|
}
|
|
|
+ return pi;
|
|
|
+}
|
|
|
+
|
|
|
+void PMSM_FOC_SetPid(u8 id, float kp, float ki, float kb) {
|
|
|
+ if (id > PID_Max_id) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ PI_Controller *pi = _pid(id);
|
|
|
if (pi != NULL) {
|
|
|
pi->kp = kp;
|
|
|
pi->ki = ki;
|
|
|
@@ -714,12 +724,7 @@ void PMSM_FOC_GetPid(u8 id, float *kp, float *ki, float *kb) {
|
|
|
if (id > PID_Max_id) {
|
|
|
return;
|
|
|
}
|
|
|
- PI_Controller *pi = NULL;
|
|
|
- if (id == PID_D_id) {
|
|
|
- pi = _gFOC_Ctrl.pi_ctl_id;
|
|
|
- }else if (id == PID_Q_id) {
|
|
|
- pi = _gFOC_Ctrl.pi_ctl_iq;
|
|
|
- }
|
|
|
+ PI_Controller *pi = _pid(id);
|
|
|
if (pi != NULL) {
|
|
|
*kp = pi->kp;
|
|
|
*ki = pi->ki;
|
|
|
@@ -763,7 +768,7 @@ float PMSM_FOC_Calc_iDC(void) {
|
|
|
iDC x vDC = 2/3(iq x vq + id x vd);
|
|
|
*/
|
|
|
float m_pow = (vd * id + vq * iq); //s32q10
|
|
|
- float raw_idc = m_pow / _gFOC_Ctrl.in.s_vDC * 1.5f; //s16q5
|
|
|
+ float raw_idc = m_pow / _gFOC_Ctrl.in.s_vDC;// * 1.5f * 0.66f; //s16q5
|
|
|
LowPass_Filter(_gFOC_Ctrl.out.s_FilteriDC, raw_idc, 0.01f);
|
|
|
return _gFOC_Ctrl.out.s_FilteriDC;
|
|
|
}
|