|
|
@@ -16,6 +16,9 @@
|
|
|
PMSM_FOC_Ctrl _gFOC_Ctrl;
|
|
|
static Fir_t phase1, phase2;
|
|
|
static bool g_focinit = false;
|
|
|
+
|
|
|
+static u32 PMSM_FOC_Debug_Task(void *p);
|
|
|
+
|
|
|
static __INLINE void RevPark(DQ_t *dq, float angle, AB_t *alpha_beta) {
|
|
|
float c,s;
|
|
|
#if 0
|
|
|
@@ -196,7 +199,8 @@ void PMSM_FOC_CoreInit(void) {
|
|
|
|
|
|
if (!g_focinit) {
|
|
|
PMSM_FOC_UserInit();
|
|
|
- g_focinit = false;
|
|
|
+ shark_task_create(PMSM_FOC_Debug_Task, NULL);
|
|
|
+ g_focinit = true;
|
|
|
}
|
|
|
_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);
|
|
|
@@ -287,28 +291,12 @@ static __INLINE void PMSM_FOC_Update_PI_Idq(void) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static __INLINE void PMSM_FOC_Plot_Debug(void) {
|
|
|
- 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]);
|
|
|
- //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));
|
|
|
- //if (jtag_plot == 2) {
|
|
|
- //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(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()));
|
|
|
+
|
|
|
+static u32 PMSM_FOC_Debug_Task(void *p) {
|
|
|
+ if (_gFOC_Ctrl.in.b_motEnable) {
|
|
|
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);
|
|
|
}
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_Schedule(void) {
|
|
|
@@ -351,7 +339,6 @@ 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
|
|
|
- PMSM_FOC_Plot_Debug();
|
|
|
}
|
|
|
|
|
|
void PMSM_FOC_LogDebug(void) {
|
|
|
@@ -392,9 +379,13 @@ u8 PMSM_FOC_CtrlMode(void) {
|
|
|
|
|
|
/* MPTA, 弱磁, 功率限制,主要是分配DQ轴电流 */
|
|
|
static __INLINE float PMSM_FOC_Limit_Power(float maxTrq) {
|
|
|
+#if 0
|
|
|
PI_Ctrl_Power.max = maxTrq;
|
|
|
float errRef = _gFOC_Ctrl.userLim.s_iDCLim - _gFOC_Ctrl.out.s_FilteriDC;
|
|
|
return PI_Controller_run(_gFOC_Ctrl.pi_ctl_power, errRef);
|
|
|
+#else
|
|
|
+ return maxTrq;
|
|
|
+#endif
|
|
|
}
|
|
|
static __INLINE void PMSM_FOC_idq_Assign(void) {
|
|
|
if (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_CURRENT || _gFOC_Ctrl.out.n_RunMode == CTRL_MODE_CURRENT_BRK) {
|
|
|
@@ -448,10 +439,11 @@ void PMSM_FOC_idqCalc(void) {
|
|
|
float refSpeed = eCtrl_get_RefSpeed();
|
|
|
if (_gFOC_Ctrl.in.b_cruiseEna) {
|
|
|
refSpeed = _gFOC_Ctrl.in.s_cruiseRPM;
|
|
|
- }
|
|
|
- if ((eCtrl_get_FinalSpeed() == 0) && (_gFOC_Ctrl.in.s_motRPM < MIN_RPM_EXIT_EBRAKE)) {
|
|
|
- _gFOC_Ctrl.pi_ctl_spd->max = 0;
|
|
|
- _gFOC_Ctrl.pi_ctl_spd->min = 0; //防止倒转
|
|
|
+ }else {
|
|
|
+ if ((eCtrl_get_FinalSpeed() == 0) && (_gFOC_Ctrl.in.s_motRPM < MIN_RPM_EXIT_EBRAKE)) {
|
|
|
+ _gFOC_Ctrl.pi_ctl_spd->max = 0;
|
|
|
+ _gFOC_Ctrl.pi_ctl_spd->min = 0; //防止倒转
|
|
|
+ }
|
|
|
}
|
|
|
float errRef = refSpeed - _gFOC_Ctrl.in.s_motRPM;
|
|
|
float maxTrq = PI_Controller_RunSat(_gFOC_Ctrl.pi_ctl_spd, errRef);
|
|
|
@@ -519,8 +511,16 @@ float PMSM_FOC_GeteBrkPhaseCurrent(void) {
|
|
|
return _gFOC_Ctrl.userLim.s_PhaseCurreBrkLim ;
|
|
|
}
|
|
|
|
|
|
-void PMSM_FOC_VbusVoltage(float vbusVol) {
|
|
|
- _gFOC_Ctrl.in.s_vDC = vbusVol;
|
|
|
+float PMSM_FOC_GetVbusVoltage(void) {
|
|
|
+ return _gFOC_Ctrl.in.s_vDC;
|
|
|
+}
|
|
|
+
|
|
|
+float PMSM_FOC_GetVbusCurrent(void) {
|
|
|
+ return _gFOC_Ctrl.out.s_FilteriDC;
|
|
|
+}
|
|
|
+
|
|
|
+DQ_t* PMSM_FOC_GetDQCurrent(void) {
|
|
|
+ return &_gFOC_Ctrl.out.s_RealIdq;
|
|
|
}
|
|
|
|
|
|
bool PMSM_FOC_SetCtrlMode(u8 mode) {
|