|
@@ -61,17 +61,16 @@ static __INLINE float Circle_Limitation(DQ_t *vdq, float vDC, float module, DQ_t
|
|
|
#ifdef VD_PRIO_HIGH
|
|
#ifdef VD_PRIO_HIGH
|
|
|
out->d = vdq->d;
|
|
out->d = vdq->d;
|
|
|
out->q = sqrtf(sq_vDC - out->d*out->d);
|
|
out->q = sqrtf(sq_vDC - out->d*out->d);
|
|
|
- return 1.1f; //just return the modulation big than 1.0
|
|
|
|
|
#else
|
|
#else
|
|
|
float r = sqrtf(sq_vDC / sq_vdq);
|
|
float r = sqrtf(sq_vDC / sq_vdq);
|
|
|
out->d = vdq->d * r;
|
|
out->d = vdq->d * r;
|
|
|
out->q = vdq->q * r;
|
|
out->q = vdq->q * r;
|
|
|
- return r;
|
|
|
|
|
#endif
|
|
#endif
|
|
|
|
|
+ }else {
|
|
|
|
|
+ out->d = vdq->d;
|
|
|
|
|
+ out->q = vdq->q;
|
|
|
}
|
|
}
|
|
|
- out->d = vdq->d;
|
|
|
|
|
- out->q = vdq->q;
|
|
|
|
|
- return 1.0f; // s16q5 32 means int 1
|
|
|
|
|
|
|
+ return sqrtf(sq_vdq/sq_vDC);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static __INLINE void FOC_Set_DqRamp(dq_Rctrl *c, float target, int time) {
|
|
static __INLINE void FOC_Set_DqRamp(dq_Rctrl *c, float target, int time) {
|
|
@@ -910,7 +909,11 @@ float PMSM_FOC_Calc_iDC(void) {
|
|
|
iDC x vDC = 2/3(iq x vq + id x vd);
|
|
iDC x vDC = 2/3(iq x vq + id x vd);
|
|
|
*/
|
|
*/
|
|
|
float m_pow = (vd * id + vq * iq); //s32q10
|
|
float m_pow = (vd * id + vq * iq); //s32q10
|
|
|
- float raw_idc = m_pow / get_vbus_float();// * 1.5f * 0.66f; //s16q5
|
|
|
|
|
|
|
+ float id_thr = ABS(id);
|
|
|
|
|
+ if (id_thr >= 100.0f) {
|
|
|
|
|
+ id_thr = 100.0f;
|
|
|
|
|
+ }
|
|
|
|
|
+ float raw_idc = m_pow / get_vbus_float() * (1.0f - 0.2f * id_thr/100.0f);// * 1.5f * 0.66f; //s16q5
|
|
|
LowPass_Filter(gFoc_Ctrl.out.s_FilteriDC, raw_idc, 0.01f);
|
|
LowPass_Filter(gFoc_Ctrl.out.s_FilteriDC, raw_idc, 0.01f);
|
|
|
return gFoc_Ctrl.out.s_FilteriDC;
|
|
return gFoc_Ctrl.out.s_FilteriDC;
|
|
|
}
|
|
}
|