TI中文支持网
TI专业的中文技术问题咨询交流网站

DSP的eQep模块的官方例程,里面用到Q格式,有些地方没看到,请问有人有比较详细的一个代码注释么?谢谢

【1.源代码——希望能够得到一些代码注释为什么这么转换】

long tmp;
unsigned int pos16bval,temp1;
_iq Tmp1,newp,oldp;

p->DirectionQep = EQep1Regs.QEPSTS.bit.QDF; // Motor direction: 0=CCW/reverse, 1=CW/forward

pos16bval=(unsigned int)EQep1Regs.QPOSCNT; // capture position once per QA/QB period
p->theta_raw = pos16bval+ p->cal_angle; // raw theta = current pos. + ang. offset from QA
// The following lines calculate p->theta_mech ~= QPOSCNT/mech_scaler [current cnt/(total cnt in 1 rev.)]
// where mech_scaler = 4000 cnts/revolution
tmp = (long)((long)p->theta_raw*(long)p->mech_scaler); // Q0*Q26 = Q26 tmp &= 0x03FFF000; p->theta_mech = (int)(tmp>>11); // Q26 -> Q15 p->theta_mech &= 0x7FFF; // The following lines calculate p->elec_mech p->theta_elec = p->pole_pairs*p->theta_mech; // Q0*Q15 = Q15 p->theta_elec &= 0x7FFF;

【2.还有我用的是28335里面应该支持浮点数,是否我利用增量编码器计算角度反馈是否还是需要像官方文件用Q格式这样计算呢?】

if(EQep1Regs.QFLG.bit.UTO==1) // If unit timeout (one 100Hz period)
{ /** Differentiator **/
// The following lines calculate position = (x2-x1)/4000 (position in 1 revolution)
pos16bval=(unsigned int)EQep1Regs.QPOSLAT; // Latched POSCNT value tmp = (long)((long)pos16bval*(long)p->mech_scaler); // Q0*Q26 = Q26 tmp &= 0x03FFF000;
tmp = (int)(tmp>>11); // Q26 -> Q15 tmp &= 0x7FFF;
newp=_IQ15toIQ(tmp);
oldp=p->oldpos;

if (p->DirectionQep==0) // POSCNT is counting down
{
if (newp>oldp)
Tmp1 = – (_IQ(1) – newp + oldp); // x2-x1 should be negative
else
Tmp1 = newp -oldp;
}
else if (p->DirectionQep==1) // POSCNT is counting up
{
if (newp<oldp)
Tmp1 = _IQ(1) + newp – oldp;
else Tmp1 = newp – oldp; // x2-x1 should be positive
}

if (Tmp1>_IQ(1)) p->Speed_fr = _IQ(1);
else if (Tmp1<_IQ(-1))
p->Speed_fr = _IQ(-1); else
p->Speed_fr = Tmp1;

// Update the electrical angle
p->oldpos = newp;
// Change motor speed from pu value to rpm value (Q15 -> Q0)
// Q0 = Q0*GLOBAL_Q => _IQXmpy(), X = GLOBAL_Q
p->SpeedRpm_fr = _IQmpy(p->BaseRpm,p->Speed_fr); //=======================================
EQep1Regs.QCLR.bit.UTO=1; // Clear interrupt flag
}

user6048931:

我看了下,是不是我只需要:
1.p->theta_mech / p->theta_elec 是角度反馈,Q15格式,我只需要每次中断调用,然后>>15 / 或者 ÷32768(2的15次方,就是真实的数据)??
2.p->SpeedRpm_fr = _IQmpy(p->BaseRpm,p->Speed_fr);这个算出来是Q0格式,直接使用

Green Deng:

回复 user6048931:

感谢您对TI产品的关注!为更加有效地解决您的问题,我需要多一些时间查看这款芯片/由于问题比较复杂,我需要询问更了解这款芯片的TI资深工程师,再为您解答,一旦得到回复会立即回复给您。

赞(0)
未经允许不得转载:TI中文支持网 » DSP的eQep模块的官方例程,里面用到Q格式,有些地方没看到,请问有人有比较详细的一个代码注释么?谢谢
分享到: 更多 (0)