// PacSci 1-hp PMSM motor: 320-v, 4-pole, 1000 line encoder
// MechScaler = 1/4000 = 0x00041893 (Q30)
qep1.MechScaler = _IQ30(0.25/qep1.LineEncoder);
#define QEP_MACRO(m,v)
/* Check the rotational direction */
v.DirectionQep = (*eQEP[m]).QEPSTS.bit.QDF;
/* Check the position counter for EQEP1 */
v.RawTheta = (*eQEP[m]).QPOSCNT + v.CalibratedAngle;
if (v.RawTheta < 0)
v.RawTheta = v.RawTheta + (*eQEP[m]).QPOSMAX;
else if (v.RawTheta > (*eQEP[m]).QPOSMAX)
v.RawTheta = v.RawTheta - (*eQEP[m]).QPOSMAX;
/* Compute the mechanical angle in Q24 */
v.MechTheta = __qmpy32by16(v.MechScaler,(int16)v.RawTheta,31); /* Q15 = Q30*Q0 */
v.MechTheta &= 0x7FFF; /* Wrap around 0x07FFF*/ \
v.MechTheta <<= 9; /* Q15 -> Q24 */
/* Compute the electrical angle in Q24 */
v.ElecTheta = v.PolePairs*v.MechTheta; /* Q24 = Q0*Q24 */
v.ElecTheta &= 0x00FFFFFF; /* Wrap around 0x00FFFFFF*/
/* Check an index occurrence*/
if ((*eQEP[m]).QFLG.bit.IEL == 1)
{
v.IndexSyncFlag = 0x00F0;
v.QepCountIndex = (*eQEP[m]).QPOSILAT;
(*eQEP[m]).QCLR.bit.IEL = 1; /* Clear interrupt flag */
}
park1.Angle = _IQ24toIQ((int32)qep1.ElecTheta);
park1.Alpha = clarke1.Alpha;
park1.Beta = clarke1.Beta;
park1.Sine = _IQsinPU(park1.Angle);
park1.Cosine = _IQcosPU(park1.Angle);
PARK_MACRO(park1)
_IQsinPU(A) //正弦函数(标幺值),你占这个圆周的几分之几为单位如果sin((0.25*PI)/(2*PI))