下面是实际测量波形
下面是我用M法测得波形,比我用m/t的波形好多了;
附:我做m/t的程序代码,哪位大神指导下,
void eQEP_pos_speed_get_Init(EQEP_POS_SPEED_GET *p)
{
Uint32 QUPRD;
EALLOW;
#if (CPU_FRQ_150MHZ)
QUPRD=(Uint32)150000000>>9; // Unit Timer for speed_intfre at 150 MHz
#endif
EQep1Regs.QUPRD=QUPRD;
EQep1Regs.QDECCTL.bit.QSRC=00; // QEP quadrature count mode
EQep1Regs.QEPCTL.bit.FREE_SOFT=2;
EQep1Regs.QEPCTL.bit.PCRM=1; // PCRM=3 mode - QPOSCNT reset on unit time
EQep1Regs.QEPCTL.bit.UTE=1; // Unit Timeout enable
EQep1Regs.QEPCTL.bit.QCLM=1; // time out锁存计数值
EQep1Regs.QPOSINIT=0;
EQep1Regs.QPOSCNT=EQep1Regs.QPOSINIT;
EQep1Regs.QPOSMAX=0xffffffff;
EQep1Regs.QEPCTL.bit.QPEN=1; // QEP enable
//设置eQEP Edge Capture功能
EQep1Regs.QCAPCTL.bit.CCPS = 4; //设定CAPCLK时钟为SYSCLK的16分频=4.6875M
EQep1Regs.QCAPCTL.bit.UPPS = 1; //11: 设定UPEVNT事件为QCLK的1分频
EQep1Regs.QCAPCTL.bit.CEN = 1; //1:QEP CAP enable
EDIS;
}
void posspeed_calc(POSSPEED *p)
{
long m1,m2,fc;
if(EQep1Regs.QEPSTS.bit.UPEVNT==0)
return;
if(EQep1Regs.QEPSTS.bit.COEF==0) // No Capture overflow
m2=(unsigned long)EQep1Regs.QCPRDLAT;
else
m2=0xFFFF+(unsigned long)EQep1Regs.QCPRDLAT;
//采用MT法进行测速
//speedhz_raw_h=m1*fc/(m2*enc_rev)*pole_pairs
m1=LSign(p->cnt_delta)*2;//LSign取正传反转符号
fc=CPU_FRQ>>4;//系统时钟分频
p->SpeedHz_raw_h=IQdiv(m1*fc, m2*(p->enc_rev), MOTOR_FRQ_Q);
p->SpeedHz_raw_h=IQmpy(p->SpeedHz_raw_h,p->pole_pairs,0);
EQep1Regs.QEPSTS.all=0x88;
return;
}