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.

initialisation and coding for floating point 2833x qep position SPEED measurment

Hi sir/madam

                            My doubt is regarding the EQEP POSITION speed calulation for 28334 floating point dsp processor...i go through the  EQEP POSITION SPEED C FILE GIVEN in the TI CONTROL SUITE  and got an idea regarding the same....in that they have described for 150 mhz high speed calculation for a fixed point processor using iq math formats..can u please help me in making out the same for 2833x floating point dsp processor. i am involved in foc of IM which requires the same...

 i ll give my sample code.can u please suggest what all modifications required for c coding..i am working with

1024 PPR QUADRATURE  ENCODER,1440 RPM RATED SPEED MOTOR .

void Init_QEP(void)

{

       //Encoder 1

       EQep1Regs.QDECCTL.bit.QSRC=00;           // QEP quadrature count mode

 

       EQep1Regs.QEPCTL.bit.FREE_SOFT=2;

       EQep1Regs.QEPCTL.bit.PCRM=00;            // PCRM=00 mode - QPOSCNT reset on index event

       EQep1Regs.QEPCTL.bit.UTE=1;              // Unit Timeout Enable

       EQep1Regs.QEPCTL.bit.QCLM=1;             // Latch on unit time out

 

       EQep1Regs.QPOSMAX=0xffffffff;

       EQep1Regs.QEPCTL.bit.QPEN=1;             // QEP enable

 

       EQep1Regs.QCAPCTL.bit.UPPS=5;     // 1/32 for unit position

       EQep1Regs.QCAPCTL.bit.CCPS=7;            // 1/128 for CAP clock

       EQep1Regs.QCAPCTL.bit.CEN=1;             // QEP Capture Enable

}

void speed(speed *p)

{

 

 

              //Read from the on board rotary encoder (short J9, J10)

              //Or external rotary encoder connected to J2 (open J9, J10)

     // qepm=EQep1Regs.QPOSCNT&0xff;

     // m = (0.866*qepm)/(255);

 

            long tmp;

            unsigned int pos16bval,temp1;

              // _iq Tmp1,newp,oldp;

            float Tmp1,newp,oldp=0,cal_angle=0;

       //**** Position calculation - mechanical and electrical motor angle ****//

            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;

 

       // Check an index occurrence

            if (EQep1Regs.QFLG.bit.IEL == 1)

            {

             p->index_sync_flag = 0x00F0;

             EQep1Regs.QCLR.bit.IEL=1;                              // Clear interrupt flag

            }

 

 

 

       //**** High Speed Calcultation uyg QEP Position counter ****//

       // Check unit Time out-event for speed calculation:

       // Unit Timer is configured for 100Hz in INIT function

 

              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->spd = _IQ(-1);

                     else

                     p->spd = 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->spd = _IQmpy(p->BaseRpm,p->spd);

                     //=======================================

 

                     EQep1Regs.QCLR.bit.UTO=1;                              // Clear interrupt flag

              }

 

 

              //Read from the rotary encoder connected to J3

              //AD7305_CH_B=EQep2Regs.QPOSCNT&0xff;

 

              //display the result on AD7305 DAC channels A and B

              //update_AD7305();

 

}