TI中文支持网
TI专业的中文技术问题搜集分享网站

转速计算问题

说明:三相异步电机,3KW,额定转速1430。

转速计算模块:

void  speedcac()

  {

 

         //检测转动方向

         DirectionQep = EQep1Regs.QEPSTS.bit.QDF;

        

if(EQep1Regs.QFLG.bit.UTO==1)     // 2ms

         {

Position_k=EQep1Regs.QPOSLAT;

if (DirectionQep==0)    // POSCNT is counting down

         {

            if (Position_k>Position_k_1)

             { tmp1 = -(Encoder_N-(Position_k-Position_k_1)); }  // x2-x1 should be negative

else

            {

tmp1 = Position_k-Position_k_1;}

           }

else if (DirectionQep==1)  // POSCNT is counting up

{

         if (Position_k<Position_k_1)

          { tmp1 =Encoder_N-(Position_k_1-Position_k);}

         else

           {

tmp1 = Position_k-Position_k_1;} // x2-x1 should be positive

         }

 

         if(tmp1>Encoder_N)    //限幅

                        {

                                  Speed_Mr_Rpm = BaseRpm; //1430

                        }

                        else if (tmp1<-Encoder_N)

                                {

                                          Speed_Mr_Rpm = -BaseRpm;//-1430

                                }

                       else

                     { Speed_Mr_Rpm = tmp1*Speed_Mr_Rpm_Scaler;}

 

                        Position_k_1=Position_k;

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

      }

}

EQEP初始化模块:

void InitEQEP1()

{

 

         EQep1Regs.QUPRD=300000; //2ms QUTMR=QUPRD时,锁存位置计数器的值

    EQep1Regs.QDECCTL.bit.QSRC=0;                   //正交计数模式

       EQep1Regs.QEPCTL.bit.FREE_SOFT=1;

       EQep1Regs.QEPCTL.bit.PCRM=01;                   // 最大值时复位

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

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

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

       EQep1Regs.QCAPCTL.bit.CEN=1;     //感觉这句可以不用的,好像

       EQep1Regs.QPOSMAX=4095; //4096

       EQep1Regs.QEPCTL.bit.SWI=1; //强制初始化位置计数器(QPOSCNT=QPOSINIT)

       EQep1Regs.QEINT.bit.UTO=1;   //使能单位定时器

}

为什么按照这一计算出来的转速Speed_Mr_Rpm 的值一直很大的范围变化呢?或是转速很高,3000多。

songtao huang:

难道就没人回答回答一下吗?加急!

说明:三相异步电机,3KW,额定转速1430。

转速计算模块:

void  speedcac()

  {

 

         //检测转动方向

         DirectionQep = EQep1Regs.QEPSTS.bit.QDF;

        

if(EQep1Regs.QFLG.bit.UTO==1)     // 2ms

         {

Position_k=EQep1Regs.QPOSLAT;

if (DirectionQep==0)    // POSCNT is counting down

         {

            if (Position_k>Position_k_1)

             { tmp1 = -(Encoder_N-(Position_k-Position_k_1)); }  // x2-x1 should be negative

else

            {

tmp1 = Position_k-Position_k_1;}

           }

else if (DirectionQep==1)  // POSCNT is counting up

{

         if (Position_k<Position_k_1)

          { tmp1 =Encoder_N-(Position_k_1-Position_k);}

         else

           {

tmp1 = Position_k-Position_k_1;} // x2-x1 should be positive

         }

 

         if(tmp1>Encoder_N)    //限幅

                        {

                                  Speed_Mr_Rpm = BaseRpm; //1430

                        }

                        else if (tmp1<-Encoder_N)

                                {

                                          Speed_Mr_Rpm = -BaseRpm;//-1430

                                }

                       else

                     { Speed_Mr_Rpm = tmp1*Speed_Mr_Rpm_Scaler;}

 

                        Position_k_1=Position_k;

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

      }

}

EQEP初始化模块:

void InitEQEP1()

{

 

         EQep1Regs.QUPRD=300000; //2ms QUTMR=QUPRD时,锁存位置计数器的值

    EQep1Regs.QDECCTL.bit.QSRC=0;                   //正交计数模式

       EQep1Regs.QEPCTL.bit.FREE_SOFT=1;

       EQep1Regs.QEPCTL.bit.PCRM=01;                   // 最大值时复位

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

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

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

       EQep1Regs.QCAPCTL.bit.CEN=1;     //感觉这句可以不用的,好像

       EQep1Regs.QPOSMAX=4095; //4096

       EQep1Regs.QEPCTL.bit.SWI=1; //强制初始化位置计数器(QPOSCNT=QPOSINIT)

       EQep1Regs.QEINT.bit.UTO=1;   //使能单位定时器

}

为什么按照这一计算出来的转速Speed_Mr_Rpm 的值一直很大的范围变化呢?或是转速很高,3000多。

HeiHei:

回复 songtao huang:

首先觉得你有个不对的地方是 EQep1Regs.QPOSMAX=4095;那么你在程序里处理编码器数值过零或者过最高点的时候Encoder_N定义的是否为4096,如果不是,那会造成误差。此外你的Speed_Mr_Rpm_Scaler设置的是多少?  另外你处理编码器数据的时候,有在编码器的Z脉冲时对编码器计数清零或者做一些处理。同时你电路设计上有没有不合理的地方,建议你把EQep1Regs.QPOSLAT的数据也画出来看一下。

赞(0)
未经允许不得转载:TI中文支持网 » 转速计算问题
分享到: 更多 (0)