大侠您好,我的问题如下:
该.c文件中的例程
pos16bval=(unsigned int)EQep1Regs.QPOSLAT; //
tmp = (long)((long)pos16bval*(long)p->mech_scaler); // 既然pos16bval是代表单位时间中断内采集QEP的个数,那计算速度应该是个数除以分辨率
tmp &= 0x03FFF000; //请问下这一步是什么转换?
tmp = (int)(tmp>>11);
问题1:mech_scaler 不是例程中所描述的4000吗?如果是,那上述红色部分为什么不是除而是乘?
例程中:
if(EQep1Regs.QEPSTS.bit.UPEVNT==1) // Unit position event
{
if(EQep1Regs.QEPSTS.bit.COEF==0) // No Capture overflow
temp1=(unsigned long)EQep1Regs.QCPRDLAT; // QCPRDLAT 是采集固定的QEP所用的时间??
else // Capture overflow, saturate the result
temp1=0xFFFF;
p->Speed_pr = _IQdiv(p->SpeedScaler,temp1); // p->Speed_pr = p->SpeedScaler/temp1
Tmp1=p->Speed_pr;
……
}
问题2:这个是在低速下进行的运算,SpeedScaler这个值如何得到的呢,看了例程上的分析看得晕呼呼的,假设QEP是1000线精度的增量编码器,QCPRD=60000,
SYSCLK =60MHZ,CAPCLK = SYSCLK /128,UPEVNT = QCLK/32,求SpeedScaler的解答过程???