说明:三相异步电机,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的数据也画出来看一下。