This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

HVPM_Sensored 中编码器角度校准CalibratedAngle



在HVPM_Sensored中有下面的一段程序,计算CalibratedAngle(校准角)程序如下:检测到第一个index脉冲,QPOSILAT记录下QPOSCNT值,把这个值当做CalibratedAngle的脉冲,不知道为什么?    可是我现在的电机index脉冲与a相绕组的反电势从正到负过零点对齐,那么我的CalibratedAngle脉冲应该是5000(假设编码器线数为2500,4倍频)

if ((EQep1Regs.QFLG.bit.IEL==1) && Init_IFlag==0)  // Check the first index occurrence
{
qep1.CalibratedAngle= EQep1Regs.QPOSILAT;
Init_IFlag++;
} // Keep the latched position

在 QEP_MACRO中使用到了这个角度CalibratedAngle,程序如下:

#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 */ \
} \

还有一个问题是检测到Index脉冲,为什么v.IndexSyncFlag = 0x00F0;?谢谢

  • 例程中CalibratedAngle是用于校正编码器Index信号和电气零度角的误差的。

    例程中CalibratedAngle功能是可以屏蔽的,因为设个例程只是由于速度控制的,并没有用来控制绝对位置。如果要做却对位置控制的话,那么CalibratedAngle可以用来校正你的电机的绝对位置。

    v.IndexSyncFlag = 0x00F0;目前例程上也没用,如果是绝对位置中,可以告诉算法,电机已经转了一圈。

  • CalibratedAngle的角度是不是每次启动的值都不一样?

    个人认为:当编码器的安装好了以后,通A相电流,给定0角度,每次检测的到Z信号的角的CalibratedAngle应该差不多啊

    开环拖动,Park Angle 和 Qep Angle 应该差不多啊

  • v.QepCountIndex = (*eQEP[m]).QPOSILAT;  请问TI员工,这里的一句话是什么意思呢?而且我发现结构体的这个变量QepCountIndex后面没有用到。

  • 校正角度你说是5000,这里应该是不对的,虽然说你的Index信号和PMSM的零位值差180度,但是电机启动的时候并不是在CNT计数值为0的时候。