关于eQEP关凤程序的疑问

2019-07-15 19:17发布

   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;                     

这一段是什么原理 为什么要这样写啊

        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;
                   }


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。