|
|
@@ -111,6 +111,7 @@ static void PMSM_FOC_Reset_PID(void) {
|
|
|
PI_Controller_Reset(_gFOC_Ctrl.pi_ctl_spd, 0);
|
|
|
PI_Controller_Reset(_gFOC_Ctrl.pi_ctl_fw, 0);
|
|
|
PI_Controller_Reset(_gFOC_Ctrl.pi_ctl_trq, 0);
|
|
|
+ PI_Controller_Reset(_gFOC_Ctrl.pi_ctl_lock, 0);
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -120,7 +121,7 @@ void PMSM_FOC_CoreInit(void) {
|
|
|
_gFOC_Ctrl.pi_ctl_spd = &PI_Ctrl_Spd;
|
|
|
_gFOC_Ctrl.pi_ctl_fw = &PI_Ctrl_fw;
|
|
|
_gFOC_Ctrl.pi_ctl_trq = &PI_Ctrl_trq;
|
|
|
-
|
|
|
+ _gFOC_Ctrl.pi_ctl_lock = &PI_Ctrl_lock;
|
|
|
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);
|
|
|
@@ -188,6 +189,22 @@ static __INLINE void PMSM_FOC_Update_PI_Idq(void) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static __INLINE void PMSM_FOC_Plot_Debug(void) {
|
|
|
+ if (_gFOC_Ctrl.ctrl_count % 8 == 0) {
|
|
|
+ //plot_1data16(_gFOC_Ctrl.out.test_sample);
|
|
|
+ //plot_1data16(FtoS16x1000(PMSM_FOC_Get_iDC()));
|
|
|
+ //plot_3data16(_gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
|
|
|
+ //plot_2data16(FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.d), FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.q));
|
|
|
+ //plot_2data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x1000(_gFOC_Ctrl.in.s_targetTorque));
|
|
|
+ //plot_2data16(FtoS16(_gFOC_Ctrl.in.s_hallAngle), FtoS16(_gFOC_Ctrl.in.s_motAngle));
|
|
|
+ //plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x1000(_gFOC_Ctrl.out.s_OutVdq.d), FtoS16x1000(_gFOC_Ctrl.out.s_OutVdq.q));
|
|
|
+ //plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.d), FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.q));
|
|
|
+ //plot_3data16(FtoS16x1000(iabc[0]), FtoS16x1000(iabc[1]), _gFOC_Ctrl.out.test_sample*100);
|
|
|
+ //plot_2data16(FtoS16(_gFOC_Ctrl.in.s_hallAngle), FtoS16(encoder_get_pwm_angle()));
|
|
|
+ plot_1data16(motor_encoder_get_vel_count() * 10);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void PMSM_FOC_Schedule(void) {
|
|
|
AB_t vAB;
|
|
|
#ifdef PHASE_LFP
|
|
|
@@ -198,9 +215,6 @@ void PMSM_FOC_Schedule(void) {
|
|
|
_gFOC_Ctrl.ctrl_count++;
|
|
|
|
|
|
PMSM_FOC_Update_Hardware();
|
|
|
- if (_gFOC_Ctrl.ctrl_count % 5 == 0) {
|
|
|
- //plot_3data16(FtoS16x1000(iabc[0]), FtoS16x1000(iabc[1]), FtoS16x1000(iabc[2]));
|
|
|
- }
|
|
|
|
|
|
if (_gFOC_Ctrl.out.n_RunMode != CTRL_MODE_OPEN) {
|
|
|
|
|
|
@@ -238,18 +252,7 @@ void PMSM_FOC_Schedule(void) {
|
|
|
LowPass_Filter(_gFOC_Ctrl.out.s_FilterIdq.d, _gFOC_Ctrl.out.s_RealIdq.d, 0.01f);
|
|
|
LowPass_Filter(_gFOC_Ctrl.out.s_FilterIdq.q, _gFOC_Ctrl.out.s_RealIdq.q, 0.01f);
|
|
|
#endif
|
|
|
- if (_gFOC_Ctrl.ctrl_count % 8 == 0) {
|
|
|
- //plot_1data16(_gFOC_Ctrl.out.test_sample);
|
|
|
- //plot_1data16(FtoS16x1000(PMSM_FOC_Get_iDC()));
|
|
|
- //plot_3data16(_gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
|
|
|
- //plot_2data16(FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.d), FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.q));
|
|
|
- //plot_2data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x1000(_gFOC_Ctrl.in.s_targetTorque));
|
|
|
- //plot_2data16(FtoS16(_gFOC_Ctrl.in.s_hallAngle), FtoS16(_gFOC_Ctrl.in.s_motAngle));
|
|
|
- //plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x1000(_gFOC_Ctrl.out.s_OutVdq.d), FtoS16x1000(_gFOC_Ctrl.out.s_OutVdq.q));
|
|
|
- plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.d), FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.q));
|
|
|
- //plot_3data16(FtoS16x1000(iabc[0]), FtoS16x1000(iabc[1]), _gFOC_Ctrl.out.test_sample*100);
|
|
|
- //plot_2data16(FtoS16(_gFOC_Ctrl.in.s_hallAngle), FtoS16(encoder_get_pwm_angle()));
|
|
|
- }
|
|
|
+ PMSM_FOC_Plot_Debug();
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_LogDebug(void) {
|
|
|
@@ -315,6 +318,13 @@ static __INLINE void PMSM_FOC_idq_Assign(void) {
|
|
|
|
|
|
/*called in media task */
|
|
|
void PMSM_FOC_idqCalc(void) {
|
|
|
+ if (_gFOC_Ctrl.in.b_motLock) {
|
|
|
+ float vel_count = motor_encoder_get_vel_count();
|
|
|
+ float errRef = 0 - vel_count;
|
|
|
+ _gFOC_Ctrl.in.s_targetTorque = PI_Controller_run(_gFOC_Ctrl.pi_ctl_lock ,errRef);
|
|
|
+ PMSM_FOC_idq_Assign();
|
|
|
+ return;
|
|
|
+ }
|
|
|
if (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_CURRENT || _gFOC_Ctrl.out.n_RunMode == CTRL_MODE_CURRENT_BRK) {
|
|
|
_gFOC_Ctrl.in.s_targetCurrent = eCtrl_get_RefCurrent();
|
|
|
if (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_CURRENT_BRK) {
|
|
|
@@ -481,7 +491,11 @@ float PMSM_FOC_GetSpeed(void) {
|
|
|
|
|
|
|
|
|
void PMSM_FOC_LockMotor(bool lock) {
|
|
|
- _gFOC_Ctrl.in.b_motLock = lock;
|
|
|
+ if (_gFOC_Ctrl.in.b_motLock != lock) {
|
|
|
+ motor_encoder_lock_pos(lock);
|
|
|
+ PI_Controller_Reset(_gFOC_Ctrl.pi_ctl_lock, 0);
|
|
|
+ _gFOC_Ctrl.in.b_motLock = lock;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_SetSpdPid(float kp, float ki, float max, float min) {
|