如图所示,这是我使用的4对极电机,凸起正上方为机械零点
在调试HVPM_Sensored_Servo例程时,发现如果电机初始定位时,不是定位在正上方的电气零点,初始定位结束后,电机由lsw=1到lsw=2切换时,会有一个较大的冲击
经过调试分析,发现在lsw=1时,位置给定函数已经被调用,当定位结束后,如果电气零点不是定位在正上方的电气零点处,电机运转到Z脉冲出现的位置时,rc1.TargetValue会有一个累积值.
这样,当检测到Z脉冲时.lsw设置为2,就会导致有一个较大的位置给定,电机会震动一下.
if (!RunMotor)
lsw = 0;
else if (lsw == 0)
{
// set up initial angle conditions for control
EQep1Regs.QCLR.bit.IEL = 1; // QEP flag = 0
EQep1Regs.QPOSCNT = 0; // QEP position cntr = 0
rc1.SetpointValue = 0; // position = 0 deg
// for restarting from (RunMotor = 0)
rc1.TargetValue = rc1.SetpointValue;
qep1.CalibratedAngle = 0;
// alignment time
if (++cntr >= alignCnt)
{
lsw = 1;
cntr = 0;
}
// alignment current
IdRef = IdRef_start;
}
else if (lsw == 1)
{
if (EQep1Regs.QFLG.bit.IEL == 1) // Check the first index occurrence
{
qep1.CalibratedAngle = EQep1Regs.QPOSILAT; // Keep the latched position
// while (qep1.CalibratedAngle > QEP_PULSE_PER_POLEPAIR)
// qep1.CalibratedAngle -= QEP_PULSE_PER_POLEPAIR;
// Init_IFlag = 1;
rc1.TargetValue = 0;
lsw = 2;
IdRef = IdRef_run;
}
}
如上所示,加上一清零语句就没有这个问题了
不知道大家调试的时候遇到过这个现象没有
Eric Ma:Eric:
是会存在这种情况的,需要你们根据实际的Z脉冲对编码器进行清零。
ISW =1 只是一个初始的定位而已。
如图所示,这是我使用的4对极电机,凸起正上方为机械零点
在调试HVPM_Sensored_Servo例程时,发现如果电机初始定位时,不是定位在正上方的电气零点,初始定位结束后,电机由lsw=1到lsw=2切换时,会有一个较大的冲击
经过调试分析,发现在lsw=1时,位置给定函数已经被调用,当定位结束后,如果电气零点不是定位在正上方的电气零点处,电机运转到Z脉冲出现的位置时,rc1.TargetValue会有一个累积值.
这样,当检测到Z脉冲时.lsw设置为2,就会导致有一个较大的位置给定,电机会震动一下.
if (!RunMotor)
lsw = 0;
else if (lsw == 0)
{
// set up initial angle conditions for control
EQep1Regs.QCLR.bit.IEL = 1; // QEP flag = 0
EQep1Regs.QPOSCNT = 0; // QEP position cntr = 0
rc1.SetpointValue = 0; // position = 0 deg
// for restarting from (RunMotor = 0)
rc1.TargetValue = rc1.SetpointValue;
qep1.CalibratedAngle = 0;
// alignment time
if (++cntr >= alignCnt)
{
lsw = 1;
cntr = 0;
}
// alignment current
IdRef = IdRef_start;
}
else if (lsw == 1)
{
if (EQep1Regs.QFLG.bit.IEL == 1) // Check the first index occurrence
{
qep1.CalibratedAngle = EQep1Regs.QPOSILAT; // Keep the latched position
// while (qep1.CalibratedAngle > QEP_PULSE_PER_POLEPAIR)
// qep1.CalibratedAngle -= QEP_PULSE_PER_POLEPAIR;
// Init_IFlag = 1;
rc1.TargetValue = 0;
lsw = 2;
IdRef = IdRef_run;
}
}
如上所示,加上一清零语句就没有这个问题了
不知道大家调试的时候遇到过这个现象没有
user78960159:
回复 Eric Ma:
好的 感谢您的答复
我目前的处理只是将给定量rc1.TargetValue清零,从调试现象看,可以解决帖子中提到的问题。
在您的回答中,还提到了将编码器清零。开始我也想到这个问题了,但是我是基于例程调试的,使用的QEP驱动库文件,个人理解对于编码器计数counter的清零可能驱动库函数里已经做了处理,应该不需要在检测到Z脉冲的时候在代码里将QEP单元的counter清零了吧,您看对吗?
另外,对比转速电流双闭环FOC,速度采集单元是用ElectTheta也就是电气角度计算转速的,因此,在任意一个电气零点,都可以正常运行FOC,不会存在本帖子中提到的问题;
而位置闭环,使用MechTheta计算Position PI反馈的,也就是针对机械零位,代码中应该要做一些处理
您看我的这个理解对不对