|
|
@@ -220,6 +220,14 @@ void PMSM_FOC_CoreInit(void) {
|
|
|
#define PHASE_LFP
|
|
|
static __INLINE void PMSM_FOC_Update_Hardware(void) {
|
|
|
AB_t vAB;
|
|
|
+#ifdef PHASE_LFP
|
|
|
+ float *iabc = _gFOC_Ctrl.in.s_iABCFilter;
|
|
|
+#elif defined PHASE_LFP_FIR
|
|
|
+ float *iabc = _gFOC_Ctrl.in.s_iABCFilter;
|
|
|
+#else
|
|
|
+ float *iabc = _gFOC_Ctrl.in.s_iABC;
|
|
|
+#endif
|
|
|
+
|
|
|
if (!_gFOC_Ctrl.in.b_MTPA_calibrate && (_gFOC_Ctrl.in.s_manualAngle != INVALID_ANGLE)) {
|
|
|
_gFOC_Ctrl.in.s_motAngle = _gFOC_Ctrl.in.s_manualAngle;
|
|
|
_gFOC_Ctrl.in.s_hallAngle = motor_encoder_get_angle();
|
|
|
@@ -229,14 +237,15 @@ 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.params.n_poles;
|
|
|
- _gFOC_Ctrl.in.s_vDC = get_vbus_float();
|
|
|
+ _gFOC_Ctrl.in.s_motRPM = motor_encoder_get_speed();
|
|
|
+ _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);
|
|
|
_gFOC_Ctrl.in.s_vABC[0] -= _gFOC_Ctrl.in.s_vDC/2.0f;
|
|
|
_gFOC_Ctrl.in.s_vABC[1] -= _gFOC_Ctrl.in.s_vDC/2.0f;
|
|
|
- _gFOC_Ctrl.in.s_vABC[2] -= _gFOC_Ctrl.in.s_vDC/2.0f;
|
|
|
+ _gFOC_Ctrl.in.s_vABC[2] -= _gFOC_Ctrl.in.s_vDC/2.0f;
|
|
|
+
|
|
|
Clark(_gFOC_Ctrl.in.s_vABC[0], _gFOC_Ctrl.in.s_vABC[1], _gFOC_Ctrl.in.s_vABC[2], &vAB);
|
|
|
|
|
|
Park(&vAB, _gFOC_Ctrl.in.s_motAngle, &_gFOC_Ctrl.out.s_RealVdq);
|
|
|
@@ -250,6 +259,10 @@ static __INLINE void PMSM_FOC_Update_Hardware(void) {
|
|
|
_gFOC_Ctrl.in.s_iABCFilter[2] = Fir_Filter(&phase2, _gFOC_Ctrl.in.s_iABC[2]);
|
|
|
_gFOC_Ctrl.in.s_iABCFilter[0] = -(_gFOC_Ctrl.in.s_iABCFilter[1] + _gFOC_Ctrl.in.s_iABCFilter[2]);
|
|
|
#endif
|
|
|
+ Clark(iabc[0], iabc[1], iabc[2], &vAB);
|
|
|
+
|
|
|
+ Park(&vAB, _gFOC_Ctrl.in.s_motAngle, &_gFOC_Ctrl.out.s_RealIdq);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
static __INLINE void PMSM_FOC_Update_PI_Idq(void) {
|
|
|
@@ -273,10 +286,9 @@ static __INLINE void PMSM_FOC_Update_PI_Idq(void) {
|
|
|
_gFOC_Ctrl.pi_ctl_iq->min = _gFOC_Ctrl.params.minvDQ.q;
|
|
|
}
|
|
|
}
|
|
|
-extern int jtag_plot;
|
|
|
-float encoder_last_offset(void);
|
|
|
+
|
|
|
static __INLINE void PMSM_FOC_Plot_Debug(void) {
|
|
|
- if (_gFOC_Ctrl.ctrl_count % 8 == 0) {
|
|
|
+ if (_gFOC_Ctrl.ctrl_count % 4 == 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]);
|
|
|
@@ -289,10 +301,10 @@ static __INLINE void PMSM_FOC_Plot_Debug(void) {
|
|
|
//plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x10(_gFOC_Ctrl.out.s_RealIdq.d), FtoS16x10(_gFOC_Ctrl.out.s_RealIdq.q));
|
|
|
//plot_3data16(_gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
|
|
|
//plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x10(_gFOC_Ctrl.in.s_iABC[1]), FtoS16x10(_gFOC_Ctrl.out.s_RealIdq.q));
|
|
|
- //plot_2data16(_gFOC_Ctrl.in.s_iABC[0], _gFOC_Ctrl.in.s_iABCFilter[0]);
|
|
|
+ //plot_2data16(FtoS16x10(_gFOC_Ctrl.in.s_iABC[0]), FtoS16x10(_gFOC_Ctrl.in.s_iABCFilter[0]));
|
|
|
//plot_3data16(_gFOC_Ctrl.in.s_motRPM, _gFOC_Ctrl.idq_ctl[1].s_Cp * 10, FtoS16x10(_gFOC_Ctrl.out.s_RealIdq.q));
|
|
|
//plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x10(_gFOC_Ctrl.in.s_vDC), FtoS16x10(get_throttle_float()));
|
|
|
- plot_3data16(FtoS16x10(_gFOC_Ctrl.out.s_OutVdq.q), FtoS16x10(_gFOC_Ctrl.out.s_RealVdq.q), FtoS16x10(_gFOC_Ctrl.out.s_FilteriDC));
|
|
|
+ plot_3data16(FtoS16x10(_gFOC_Ctrl.in.s_vABC[1]), FtoS16x10(_gFOC_Ctrl.out.s_RealVdq.q), _gFOC_Ctrl.in.s_motRPM);
|
|
|
//}
|
|
|
//plot_1data16(FtoS16(_gFOC_Ctrl.in.s_hallAngle));
|
|
|
//plot_1data16(_gFOC_Ctrl.in.s_motRPM);
|
|
|
@@ -301,13 +313,6 @@ static __INLINE void PMSM_FOC_Plot_Debug(void) {
|
|
|
|
|
|
void PMSM_FOC_Schedule(void) {
|
|
|
AB_t vAB;
|
|
|
-#ifdef PHASE_LFP
|
|
|
- float *iabc = _gFOC_Ctrl.in.s_iABCFilter;
|
|
|
-#elif defined PHASE_LFP_FIR
|
|
|
- float *iabc = _gFOC_Ctrl.in.s_iABCFilter;
|
|
|
-#else
|
|
|
- float *iabc = _gFOC_Ctrl.in.s_iABC;
|
|
|
-#endif
|
|
|
|
|
|
_gFOC_Ctrl.ctrl_count++;
|
|
|
|
|
|
@@ -317,10 +322,6 @@ void PMSM_FOC_Schedule(void) {
|
|
|
|
|
|
PMSM_FOC_Update_PI_Idq();
|
|
|
|
|
|
- Clark(iabc[0], iabc[1], iabc[2], &vAB);
|
|
|
-
|
|
|
- Park(&vAB, _gFOC_Ctrl.in.s_motAngle, &_gFOC_Ctrl.out.s_RealIdq);
|
|
|
-
|
|
|
float target_d = FOC_Get_DqRamp(&_gFOC_Ctrl.idq_ctl[0]);
|
|
|
float err = target_d - _gFOC_Ctrl.out.s_RealIdq.d;
|
|
|
_gFOC_Ctrl.in.s_targetVdq.d = PI_Controller_RunSerial(_gFOC_Ctrl.pi_ctl_id, err);
|
|
|
@@ -354,12 +355,7 @@ void PMSM_FOC_Schedule(void) {
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_LogDebug(void) {
|
|
|
- //sys_debug("Duty %d, %d, %d\n", _gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
|
|
|
- sys_debug("Vdq %f, %f-->%f, %f, %f\n", S16Q5toF(_gFOC_Ctrl.in.s_targetVdq.d), S16Q5toF(_gFOC_Ctrl.in.s_targetVdq.q), S16Q5toF(_gFOC_Ctrl.out.s_OutVdq.d), S16Q5toF(_gFOC_Ctrl.out.s_OutVdq.q), S16Q14toF(_gFOC_Ctrl.out.f_vdqRation));
|
|
|
- sys_debug("VBUS: %f, %d, %d\n", S16Q5toF(get_vbus_sfix5()), _gFOC_Ctrl.out.n_Sample1, _gFOC_Ctrl.out.n_Sample2);
|
|
|
- //sys_debug("iABC %f, %f, %f\n", S16Q5toF(_gFOC_Ctrl.in.s_iABC[0]), S16Q5toF(_gFOC_Ctrl.in.s_iABC[1]), S16Q5toF(_gFOC_Ctrl.in.s_iABC[2]));
|
|
|
- //plot_1data16(_gFOC_Ctrl.in.s_iABC[0]);
|
|
|
- //sys_debug("sample %d, %d\n", _gFOC_Ctrl.out.n_Sample1, _gFOC_Ctrl.out.n_Sample2);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/*called in media task */
|
|
|
@@ -421,7 +417,6 @@ static __INLINE void PMSM_FOC_idq_Assign(void) {
|
|
|
|
|
|
/*called in media task */
|
|
|
void PMSM_FOC_idqCalc(void) {
|
|
|
- PMSM_FOC_Get_iDC();
|
|
|
if (_gFOC_Ctrl.in.b_motLock) {
|
|
|
float vel_count = motor_encoder_get_vel_count();
|
|
|
float errRef = 0 - vel_count;
|