zonglinx 发表于 2012-9-5 14:14

28335 eqep角度计算

我用Eqep测试角度时不正确,我的方法是这样的:
1、逆时针转动电机让编码器过零点,即Z相脉冲出现跳变沿,此时我观察EQep1Regs.QPOSCNT已经清零了,然后给电机通电,让电机吸到逆时针方向最近的d轴,记录EQep1Regs.QPOSCNT的计数值为477,我把这个值给CalibratedAngle;
2、上电时我根据编码器的UVW确定上电初始电角度,并把这个角度转化为EQep1Regs.QPOSCNT的计数值,比如UVW信号为101,即认为电角度处于0~60°区间,我取中间值30°,(电机为4对极,编码器为2500线),把电角度转化为EQep1Regs.QPOSCNT的计数值:   
转换公式如下:
Init_MechTheta =(10000/360) *30/4    //Init_MechTheta为上电时的初始机械角度,这样转换电角度,便于统一计算

tmp1 = (long)(((long)Init_MechTheta + (long)g_POSCNT_Err)*(long)qep1.MechScaler);   // Q0*Q30 = Q30
//g_POSCNT_Err = (当前周期的EQep1Regs.QPOSCNT计数值—上周期的EQep1Regs.QPOSCNT计数值)
//qep1.MechScaler为_IQ30(0.25/2500)

   qep1.MechTheta = (tmp1>>6);         // Q30 -> Q24
   qep1.MechTheta &= 0x00FFFFFF;                     
// The following lines calculate p->elec_mech   
qep1.ElecTheta = 4*qep1.MechTheta;// Q0*Q24 = Q24
qep1.ElecTheta &= 0x00FFFFFF;
3、电机旋转过编码器零点后,统一采用如下算法:
qep1.RawTheta = EQep1Regs.QPOSCNT + qep1.CalibratedAngle; // raw theta = current pos. + ang. offset from QA
if(qep1.RawTheta < 0)
{
   qep1.RawTheta = qep1.RawTheta + EQep1Regs.QPOSMAX;
}
if(qep1.RawTheta > EQep1Regs.QPOSMAX)
{
   qep1.RawTheta = qep1.RawTheta - EQep1Regs.QPOSMAX;
}
tmp1 = (long)((long)qep1.RawTheta*(long)qep1.MechScaler);   // Q0*Q30 = Q30                                       
      qep1.MechTheta = (tmp1>>6);         // Q30 -> Q24
      qep1.MechTheta &= 0x00FFFFFF;
      // The following lines calculate p->elec_mech   
qep1.ElecTheta = 4*qep1.MechTheta;// Q0*Q24 = Q24
qep1.ElecTheta &= 0x00FFFFFF;

结果如下:
1、针对第2步,这样计算起始角度,给q轴电流,电机不能旋转,后来我就让g_POSCNT_Err 每隔1个控制周期(100us)累加一次,直到出现Z脉冲,然后采用第3步的角度计算方法,电机顺时针方向转起来,转到编码器Z脉冲的地方,就停止了;
2、请大家帮我看看我的计算方式有什么问题。
3、我有点疑问:qep1.CalibratedAngle是编码器Z相信号(即编码器零点)与电机A相轴线的夹角,第1步的测试方法对吗?

zonglinx 发表于 2012-9-5 14:20

如果大家看到我的问题,觉得表达不清楚的地方,劳烦提出来。
页: [1]
查看完整版本: 28335 eqep角度计算