|
@@ -120,7 +120,8 @@ void PMSM_FOC_CoreInit(void) {
|
|
|
_gFOC_Ctrl.out.n_RunMode = OPEN_MODE;
|
|
_gFOC_Ctrl.out.n_RunMode = OPEN_MODE;
|
|
|
_gFOC_Ctrl.out.f_vdqRation = S16Q14(0.9f);
|
|
_gFOC_Ctrl.out.f_vdqRation = S16Q14(0.9f);
|
|
|
_gFOC_Ctrl.in.s_manualAngle = 0x3D00;
|
|
_gFOC_Ctrl.in.s_manualAngle = 0x3D00;
|
|
|
-
|
|
|
|
|
|
|
+ _gFOC_Ctrl.in.n_PhaseFilterCeof = S16Q10(0.2f);
|
|
|
|
|
+
|
|
|
FOC_DqRamp_init(&_gFOC_Ctrl.idq_ctl[0], 1);
|
|
FOC_DqRamp_init(&_gFOC_Ctrl.idq_ctl[0], 1);
|
|
|
FOC_DqRamp_init(&_gFOC_Ctrl.idq_ctl[1], 1);
|
|
FOC_DqRamp_init(&_gFOC_Ctrl.idq_ctl[1], 1);
|
|
|
|
|
|
|
@@ -129,35 +130,33 @@ void PMSM_FOC_CoreInit(void) {
|
|
|
PMSM_FOC_Reset_PID();
|
|
PMSM_FOC_Reset_PID();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-s16 test_motangle = 0;
|
|
|
|
|
|
|
+
|
|
|
static __INLINE void PMSM_FOC_Update_Hardware(void) {
|
|
static __INLINE void PMSM_FOC_Update_Hardware(void) {
|
|
|
if (_gFOC_Ctrl.in.s_manualAngle != 0x3D00) {
|
|
if (_gFOC_Ctrl.in.s_manualAngle != 0x3D00) {
|
|
|
_gFOC_Ctrl.in.s_motAngle = _gFOC_Ctrl.in.s_manualAngle;
|
|
_gFOC_Ctrl.in.s_motAngle = _gFOC_Ctrl.in.s_manualAngle;
|
|
|
- test_motangle = hall_sensor_get_theta();
|
|
|
|
|
|
|
+ _gFOC_Ctrl.in.s_hallAngle = hall_sensor_get_theta();
|
|
|
}else {
|
|
}else {
|
|
|
- _gFOC_Ctrl.in.s_motAngle = hall_sensor_get_theta();
|
|
|
|
|
|
|
+ _gFOC_Ctrl.in.s_hallAngle = hall_sensor_get_theta();
|
|
|
|
|
+ _gFOC_Ctrl.in.s_motAngle = _gFOC_Ctrl.in.s_hallAngle;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
_gFOC_Ctrl.in.s_motRPM = hall_sensor_get_speed();
|
|
_gFOC_Ctrl.in.s_motRPM = hall_sensor_get_speed();
|
|
|
//sample current
|
|
//sample current
|
|
|
phase_current_get(_gFOC_Ctrl.in.s_iABC);
|
|
phase_current_get(_gFOC_Ctrl.in.s_iABC);
|
|
|
|
|
|
|
|
|
|
+ LowPass_Filter(_gFOC_Ctrl.in.s_iABCFilter[0], _gFOC_Ctrl.in.s_iABC[0], 0.2f);
|
|
|
|
|
+ LowPass_Filter(_gFOC_Ctrl.in.s_iABCFilter[1], _gFOC_Ctrl.in.s_iABC[1], 0.2f);
|
|
|
|
|
+ LowPass_Filter(_gFOC_Ctrl.in.s_iABCFilter[2], _gFOC_Ctrl.in.s_iABC[2], 0.2f);
|
|
|
|
|
+
|
|
|
_gFOC_Ctrl.in.s_vDC = get_vbus_sfix5();
|
|
_gFOC_Ctrl.in.s_vDC = get_vbus_sfix5();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* MPTA, 弱磁, 功率限制 */
|
|
|
|
|
-static __INLINE void PMSM_FOC_idq_Assign(void) {
|
|
|
|
|
- _gFOC_Ctrl.in.s_targetIdq.d = 0;
|
|
|
|
|
- _gFOC_Ctrl.in.s_targetIdq.q = _gFOC_Ctrl.in.s_targetTrq;
|
|
|
|
|
- FOC_Set_iDqRamp(&_gFOC_Ctrl.idq_ctl[0], _gFOC_Ctrl.in.s_targetIdq.d);
|
|
|
|
|
- FOC_Set_iDqRamp(&_gFOC_Ctrl.idq_ctl[1], _gFOC_Ctrl.in.s_targetIdq.q);
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
static int _g_ctl_count = 0;
|
|
static int _g_ctl_count = 0;
|
|
|
extern int get_hall_stat(int samples);
|
|
extern int get_hall_stat(int samples);
|
|
|
void PMSM_FOC_Schedule(void) {
|
|
void PMSM_FOC_Schedule(void) {
|
|
|
AB_t vAB;
|
|
AB_t vAB;
|
|
|
- s16q5_t *iabc = _gFOC_Ctrl.in.s_iABC;
|
|
|
|
|
|
|
+ s16q5_t *iabc = _gFOC_Ctrl.in.s_iABCFilter;
|
|
|
|
|
|
|
|
PMSM_FOC_Update_Hardware();
|
|
PMSM_FOC_Update_Hardware();
|
|
|
|
|
|
|
@@ -187,9 +186,10 @@ void PMSM_FOC_Schedule(void) {
|
|
|
pwm_update_sample(_gFOC_Ctrl.out.n_Sample1, _gFOC_Ctrl.out.n_Sample2, _gFOC_Ctrl.out.n_CPhases);
|
|
pwm_update_sample(_gFOC_Ctrl.out.n_Sample1, _gFOC_Ctrl.out.n_Sample2, _gFOC_Ctrl.out.n_CPhases);
|
|
|
|
|
|
|
|
if (_g_ctl_count++ % 5 == 0) {
|
|
if (_g_ctl_count++ % 5 == 0) {
|
|
|
|
|
+ plot_1data16(_gFOC_Ctrl.in.s_motRPM>>5);
|
|
|
//plot_3data16(_gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
|
|
//plot_3data16(_gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
|
|
|
- //plot_3data16(test_motangle>>5, _gFOC_Ctrl.in.s_motAngle>>5, get_hall_stat(9)*60);
|
|
|
|
|
- plot_3data16(_gFOC_Ctrl.in.s_iABC[0], _gFOC_Ctrl.in.s_iABC[1], _gFOC_Ctrl.in.s_iABC[2]);
|
|
|
|
|
|
|
+ //plot_3data16(_gFOC_Ctrl.in.s_hallAngle>>5, _gFOC_Ctrl.in.s_motAngle>>5, get_hall_stat(9)*60);
|
|
|
|
|
+ //plot_3data16(iabc[0], iabc[1], iabc[2]);
|
|
|
//plot_3data16(_gFOC_Ctrl.out.n_Sample1, _gFOC_Ctrl.out.n_Sample2, _gFOC_Ctrl.out.n_CPhases * 10 + 3000);
|
|
//plot_3data16(_gFOC_Ctrl.out.n_Sample1, _gFOC_Ctrl.out.n_Sample2, _gFOC_Ctrl.out.n_CPhases * 10 + 3000);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -217,14 +217,16 @@ u8 PMSM_FOC_CtrlMode(void) {
|
|
|
return _gFOC_Ctrl.out.n_RunMode;
|
|
return _gFOC_Ctrl.out.n_RunMode;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/* MPTA, 弱磁, 功率限制 */
|
|
|
|
|
+static __INLINE void PMSM_FOC_idq_Assign(void) {
|
|
|
|
|
+ _gFOC_Ctrl.in.s_targetIdq.d = 0;
|
|
|
|
|
+ _gFOC_Ctrl.in.s_targetIdq.q = _gFOC_Ctrl.in.s_targetTrq;
|
|
|
|
|
+ FOC_Set_iDqRamp(&_gFOC_Ctrl.idq_ctl[0], _gFOC_Ctrl.in.s_targetIdq.d);
|
|
|
|
|
+ FOC_Set_iDqRamp(&_gFOC_Ctrl.idq_ctl[1], _gFOC_Ctrl.in.s_targetIdq.q);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/*called in media task */
|
|
/*called in media task */
|
|
|
void PMSM_FOC_idqCalc(void) {
|
|
void PMSM_FOC_idqCalc(void) {
|
|
|
- if (!_gFOC_Ctrl.in.b_motEnable) {
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- if (_gFOC_Ctrl.out.n_RunMode == OPEN_MODE) {
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
if (_gFOC_Ctrl.out.n_RunMode == TRQ_MODE) {
|
|
if (_gFOC_Ctrl.out.n_RunMode == TRQ_MODE) {
|
|
|
_gFOC_Ctrl.in.s_targetTrq = eCtrl_get_RefTorque();
|
|
_gFOC_Ctrl.in.s_targetTrq = eCtrl_get_RefTorque();
|
|
|
}else {
|
|
}else {
|