|
@@ -9,7 +9,7 @@
|
|
|
#include "bsp/timer_count32.h"
|
|
#include "bsp/timer_count32.h"
|
|
|
#include "libs/time_measure.h"
|
|
#include "libs/time_measure.h"
|
|
|
#include "libs/logger.h"
|
|
#include "libs/logger.h"
|
|
|
-
|
|
|
|
|
|
|
+#include "foc/core/PI_Controller.h"
|
|
|
pmsm_foc_t pmsm_foc = {0};
|
|
pmsm_foc_t pmsm_foc = {0};
|
|
|
|
|
|
|
|
extern void PMSM_FOC_Init(void);
|
|
extern void PMSM_FOC_Init(void);
|
|
@@ -17,6 +17,7 @@ extern ExtU *PMSM_FOC_GetInputs(void);
|
|
|
extern ExtY *PMSM_FOC_GetOutputs(void);
|
|
extern ExtY *PMSM_FOC_GetOutputs(void);
|
|
|
extern void PMSM_FOC_Step(void);
|
|
extern void PMSM_FOC_Step(void);
|
|
|
extern P *PMSM_FOC_GetParams(void);
|
|
extern P *PMSM_FOC_GetParams(void);
|
|
|
|
|
+PI_Controller pi;
|
|
|
|
|
|
|
|
void PMSM_FOC_CoreInit(void) {
|
|
void PMSM_FOC_CoreInit(void) {
|
|
|
mc_hall_init();
|
|
mc_hall_init();
|
|
@@ -30,7 +31,7 @@ void PMSM_FOC_CoreInit(void) {
|
|
|
pmsm_foc.FOC_P->id_fieldWeakMax = S16Q5(-50);
|
|
pmsm_foc.FOC_P->id_fieldWeakMax = S16Q5(-50);
|
|
|
pmsm_foc.FOC_P->i_dqMax = S16Q5(150);
|
|
pmsm_foc.FOC_P->i_dqMax = S16Q5(150);
|
|
|
pmsm_foc.FOC_P->V_modulation = S16Q14(0.95f);
|
|
pmsm_foc.FOC_P->V_modulation = S16Q14(0.95f);
|
|
|
-
|
|
|
|
|
|
|
+ pmsm_foc.FOC_Out->n_Sector = 1;
|
|
|
PMSM_FOC_iBusLimit(S16Q5(Default_iDC_Limit));
|
|
PMSM_FOC_iBusLimit(S16Q5(Default_iDC_Limit));
|
|
|
PMSM_FOC_SpeedLimit(S32Q4(Default_Spd_Limit));
|
|
PMSM_FOC_SpeedLimit(S32Q4(Default_Spd_Limit));
|
|
|
}
|
|
}
|
|
@@ -40,17 +41,17 @@ static __INLINE void PMSM_FOC_PWMCurrent_Update(void) {
|
|
|
pwm_update_duty(0, 0, 0);
|
|
pwm_update_duty(0, 0, 0);
|
|
|
pwm_update_sample(FOC_PWM_Half_Period/2, FOC_PWM_Half_Period, 1);
|
|
pwm_update_sample(FOC_PWM_Half_Period/2, FOC_PWM_Half_Period, 1);
|
|
|
}else {
|
|
}else {
|
|
|
- current_samp_t *cs = get_phase_sample_point(pmsm_foc.FOC_Out->n_Sector);
|
|
|
|
|
|
|
+ current_samp_t *cs = get_phase_sample_point(pmsm_foc.FOC_Out->n_Sector-1);
|
|
|
|
|
|
|
|
pwm_update_duty(pmsm_foc.FOC_Out->n_Duty[0], pmsm_foc.FOC_Out->n_Duty[1], pmsm_foc.FOC_Out->n_Duty[2]);
|
|
pwm_update_duty(pmsm_foc.FOC_Out->n_Duty[0], pmsm_foc.FOC_Out->n_Duty[1], pmsm_foc.FOC_Out->n_Duty[2]);
|
|
|
|
|
|
|
|
- pwm_update_sample(cs->time.Samp_p1, cs->time.Samp_p2, cs->sector);
|
|
|
|
|
|
|
+ //pwm_update_sample(cs->time.Samp_p1, cs->time.Samp_p2, cs->sector);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
void PMSM_FOC_Schedule(void) {
|
|
void PMSM_FOC_Schedule(void) {
|
|
|
- pwm_clear_updata();
|
|
|
|
|
|
|
+
|
|
|
phase_current_sample(&pmsm_foc.FOC_In->adc_Phase[0], &pmsm_foc.FOC_In->adc_Phase[1], &pmsm_foc.FOC_In->adc_Phase[2]);
|
|
phase_current_sample(&pmsm_foc.FOC_In->adc_Phase[0], &pmsm_foc.FOC_In->adc_Phase[1], &pmsm_foc.FOC_In->adc_Phase[2]);
|
|
|
pmsm_foc.FOC_In->sys_ticks = hall_get_hwcount(pmsm_foc.FOC_In->hall_abc);
|
|
pmsm_foc.FOC_In->sys_ticks = hall_get_hwcount(pmsm_foc.FOC_In->hall_abc);
|
|
|
|
|
|
|
@@ -61,9 +62,12 @@ void PMSM_FOC_Schedule(void) {
|
|
|
pmsm_foc.FOC_In->spd_Target = S32Q4(eCtrl_get_FinalSpd());
|
|
pmsm_foc.FOC_In->spd_Target = S32Q4(eCtrl_get_FinalSpd());
|
|
|
pmsm_foc.FOC_In->idq_Target = S16Q5(eCtrl_get_RefTorque());
|
|
pmsm_foc.FOC_In->idq_Target = S16Q5(eCtrl_get_RefTorque());
|
|
|
}
|
|
}
|
|
|
|
|
+ PI_Controller_run(&pi, 111);
|
|
|
|
|
|
|
|
- PMSM_FOC_Step();
|
|
|
|
|
|
|
+ //PMSM_FOC_Step();
|
|
|
|
|
|
|
|
|
|
+ pmsm_foc.FOC_Out->n_Duty[0] = pmsm_foc.FOC_Out->n_Duty[1] = pmsm_foc.FOC_Out->n_Duty[2] = FOC_PWM_Half_Period;
|
|
|
|
|
+
|
|
|
PMSM_FOC_PWMCurrent_Update();
|
|
PMSM_FOC_PWMCurrent_Update();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -93,11 +97,11 @@ bool PMSM_FOC_Is_Start(void) {
|
|
|
return pmsm_foc.FOC_In->b_motEna;
|
|
return pmsm_foc.FOC_In->b_motEna;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void PMSM_FOC_iBusLimit(_s16q5_t ibusLimit) {
|
|
|
|
|
|
|
+void PMSM_FOC_iBusLimit(s16q5_t ibusLimit) {
|
|
|
pmsm_foc.FOC_In->iDC_Limit = (ibusLimit);
|
|
pmsm_foc.FOC_In->iDC_Limit = (ibusLimit);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void PMSM_FOC_SpeedLimit(_s32q4_t speedLimit) {
|
|
|
|
|
|
|
+void PMSM_FOC_SpeedLimit(s32q4_t speedLimit) {
|
|
|
pmsm_foc.FOC_In->spd_Limit = (speedLimit);
|
|
pmsm_foc.FOC_In->spd_Limit = (speedLimit);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -105,7 +109,7 @@ float PMSM_FOC_GetSpeedLimit(void) {
|
|
|
return S32Q4toF(pmsm_foc.FOC_In->spd_Limit);
|
|
return S32Q4toF(pmsm_foc.FOC_In->spd_Limit);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void PMSM_FOC_VbusVoltage(_s16q5_t vbusVol) {
|
|
|
|
|
|
|
+void PMSM_FOC_VbusVoltage(s16q5_t vbusVol) {
|
|
|
pmsm_foc.FOC_In->vDC = (vbusVol);
|
|
pmsm_foc.FOC_In->vDC = (vbusVol);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -113,7 +117,7 @@ void PMSM_FOC_SetCtrlMode(uint8_T mode) {
|
|
|
pmsm_foc.FOC_In->n_ctrlMod = mode;
|
|
pmsm_foc.FOC_In->n_ctrlMod = mode;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void PMSM_FOC_SetOpenVdq(_s16q5_t vd, _s16q5_t vq) {
|
|
|
|
|
|
|
+void PMSM_FOC_SetOpenVdq(s16q5_t vd, s16q5_t vq) {
|
|
|
pmsm_foc.FOC_In->vdq_Target[0] = (vd);
|
|
pmsm_foc.FOC_In->vdq_Target[0] = (vd);
|
|
|
pmsm_foc.FOC_In->vdq_Target[1] = (vq);
|
|
pmsm_foc.FOC_In->vdq_Target[1] = (vq);
|
|
|
}
|
|
}
|