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.

范例2803xEqep_pos_speed测量转速,轉速出现周期性归零的数值!



测试状况:

 

使用该范例计算马达转速,基本上计算出来的转速近似实际转速,但是就是会出现周期性归零的值,转速越高,频率越高。不知道各位是否建议和解决办法?

以下是eQEP的设定

QPOSMAX=0X1F40//设定最大位置计数为2000ppr*4=8000=0X1F40

QUPRD=600000

QEPCTL=0X800E//设定Position counter reset on an index event

QCAPCTL=0X8075

硬件:2000ppr的encoder-> 光耦合隔离电路->f28035(eQep1A, eQep1B, eQep1I)

上图是CCS观察qep_posspeed.SpeedRpm_fr   输出的转速值。(出现周期性归零的图形!)

  • 从你贴出的eQEP看不出原因

    你看看周期捕获的通用定时器值是怎么变化的     是不是通过两次捕获的定时器值做的差值计算的

    有没有判断两次值得大小      难道你周期捕获的两次值  周期会出现相等的情况?

  • 你好

    以下是我主程序和Eqep的设定

    EQep1Regs.QUPRD=600000;                           // Unit Timer for 100Hz at 60 MHz SYSCLKOUT

    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.IEI=10;
    EQep1Regs.QEPCTL.bit.IEL=01;
    EQep1Regs.QEPCTL.bit.UTE=1;                      // Unit Timeout Enable
    EQep1Regs.QEPCTL.bit.QCLM=1;                  // Latch on unit time out
    EQep1Regs.QPOSMAX=0x00001f3f;
    EQep1Regs.QEPCTL.bit.QPEN=1;                   // QEP enable

    EQep1Regs.QCAPCTL.bit.UPPS=5;               // 1/32 for unit position
    EQep1Regs.QCAPCTL.bit.CCPS=6;              // 1/64 for CAP clock
    EQep1Regs.QCAPCTL.bit.CEN=0;                 // QEP Capture DISable

    void main(void)
    {

          InitSysCtrl();

          InitEQep1Gpio();

          DINT;

          InitPieCtrl();

          IER = 0x0000;
          IFR = 0x0000; 

          InitPieVectTable();

          qep_posspeed.init(&qep_posspeed);

          for(;;)
         {
               qep_posspeed.calc(&qep_posspeed);
         }

    }

    更让人摸不着头脑的事RPM越高的时候趋近零的频率越高。300RPM以下的时候出现的频率几乎没有了

    下图为300rpm时,CCS观察到的曲线图。

    我也有在Example_posspeed.c里設定中断点,一直到差不多300rom以上就進入中断点,確實新舊值相等造成。

    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;
            if(newp==oldp) 
            { 
                aa++;             =========>中断点

           }

         }
    }

  • 另外,会不会是我更正了.h挡里面原本16776的mech_scaler到8388导致IQ格式换算错误之类的?

    注8388=[0.9999/(2000*4)]*2^26 (取IQ26定点数)