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

关于HVPM_Sensored_Servo的疑问

如图所示,这是我使用的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反馈的,也就是针对机械零位,代码中应该要做一些处理

您看我的这个理解对不对

赞(0)
未经允许不得转载:TI中文支持网 » 关于HVPM_Sensored_Servo的疑问
分享到: 更多 (0)