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.

[参考译文] LAUNCHXL-F280049C:使用 EST_setAngle_rad (..)实现 Speedcontrol 改变速度(从120转/分变为90转/分)、同时 PI_SPD 中的反馈信号认为它转动正确的速度(120转/分)。

Guru**** 1796070 points
Other Parts Discussed in Thread: MOTORWARE, LAUNCHXL-F280049C, DRV8320
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1425912/launchxl-f280049c-speedcontrol-with-est_setangle_rad-changes-the-speed-from-120---90-rpm-while-the-feedback-signal-in-pi_spd-thinks-it-s-running-the-correct-speed-120-rpm

器件型号:LAUNCHXL-F280049C
主题中讨论的其他器件:MOTORWARE、、、 DRV8320

工具与软件:

您好!

根据 solutions/common/sensorless_foc/source/is05_motor_id.c 实验、我们构建了基于速度控制的系统。 我们在低速(SPI 通信)和高速下使用编码器的角度
使用估算器来确定角度。 当我们使用编码器角度时、我们使用函数 EST_setAngle_rad 将该角度注入估算器。

我们使用测试设置来运行此过程、其中电机的轴驱动飞轮。 我们可以通过 Kistler 的传感器测量轴的速度和力。 当我们将速度设定点设置为120 rpm 时
我们还看到电机的转速为120rpm。 当我们然后开始注入编码器角度时、电机保持运转正常、但是我们看到速度下降到大约90rpm。 如果我们再看一看反馈信号
对于 pi_spd、它表示电机仍在以120rpm 的转速运行。 因此、Motorware 认为电机正在以正确的速度运行。

我也可以在不使用编码器的情况下重现这种行为、但通过首先读取 est 角度、添加-0.001 rad 的偏移、然后使用函数 est_getAngle_est_rad ()。 我还调节
gSystem.estOutputData.angle_rad (这被用来计算矢量)。 转速也降至大约90rpm。

还要注意的是、ctrl 对象中的 pi_spd 反馈信号表示电机以120rpm 的转速运行。

是否有人知道这里发生了什么以及我们如何解决这个问题?

下面是 ISR 的代码片段:

....

EST_run(gSystem.estHandle, &gSystem.estInputData, &gSystem.estOutputData);

angleEst_rad = EST_getAngle_est_rad(gSystem.estHandle);

loggingNeeded = true;

float32_t estAngleLUT;
float32_t estAngleInjectionDebug;
// get est angle from the lookup table (to convert from 1 mech. to 7 electrical)
int32_t index = (int32_t)(gSystem.EncAngleDegrees / 2); // get the index (every 2 degrees 1)
float32_t remainder = (gSystem.EncAngleDegrees / 2) - index; 
float32_t LUT_value = lookupTableEncAngle_to_EstAngle[index];
float32_t LUT_value_1 = lookupTableEncAngle_to_EstAngle[index+1];
if(LUT_value_1 < 0 && LUT_value > 0){
    LUT_value_1 = LUT_value_1 + MATH_TWO_PI;
}
float32_t stepSizeEstAngle = LUT_value_1 - LUT_value;  
estAngleLUT =  LUT_value + (stepSizeEstAngle * remainder);
if(estAngleLUT > MATH_PI)
    estAngleLUT = estAngleLUT - MATH_TWO_PI;
estAngleLUT = estAngleLUT + gSystem.EncAngleOffset_Rad;    // offset is normaly 0.0

if(gSystem.useEncAngle){                
    EST_setAngle_rad(gSystem.estHandle, estAngleLUT);
    gSystem.estOutputData.angle_rad = estAngleLUT;
}
if(gSystem.useEstAngleInjection){                
    estAngleInjectionDebug = EST_getAngle_est_rad(gSystem.estHandle)+gSystem.EncAngleOffset_Rad;  // offset is normaly 0.0
    if(estAngleInjectionDebug > MATH_PI)
        estAngleInjectionDebug = estAngleInjectionDebug - MATH_TWO_PI;
    if(estAngleInjectionDebug < -MATH_PI)
        estAngleInjectionDebug = estAngleInjectionDebug + MATH_TWO_PI;
    
    EST_setAngle_rad(gSystem.estHandle, estAngleInjectionDebug);
    gSystem.estOutputData.angle_rad = estAngleInjectionDebug;
}

//
// compute the sin/cos phasor
//
phasor.value[0] = cosf(gSystem.estOutputData.angle_rad);
phasor.value[1] = sinf(gSystem.estOutputData.angle_rad);
//
// set the phasor in the Park transform
//
PARK_setPhasor(gSystem.parkHandle, &phasor);

//
// run the Park transform
//
PARK_run(gSystem.parkHandle, &(gSystem.estInputData.Iab_A), (MATH_Vec2 *)&(gSystem.Idq_in_A));

....

我们在具有 DRV8320的 launchXL-F280049C 上使用 motorware SDK 版本5.02。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您的电机参数是否正确? 具体而言、极对#将影响计算出的速度。

    我认为进一步调试该问题的一个好方法是并行运行无传感器估算器(FAST)和编码器函数、并比较速度/角度结果并弄清它们为什么不同。 使用 工作正常的无传感器估算器在开环或闭环中运行电机。

    此致!

    Kevin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kevin:

    感谢您的答复。 我们 比较了 FAST 角度和编码器角度。 两者之间存在细微差异(0.0024rad)。 但即使没有编码器,所以用 est_setangle_rad ()函数设置快速角度时,偏移量很小(0.001)会使电机从120转/分转至90转/分。 pi_spd 反馈信号"认为"它正在以120 rpm 的转速运行。 因此反馈信号具有错误的值。  为什么会这样?

    此致!

    Ronnie

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kevin:

    我使用标准实验室05进行了测试。 我将一些代码添加到 ISR 中(请参见下面的代码)。 我启动项目、运行识别功能、然后让电机以20Hz 的频率运行。 通过将全局变量设置 为 true、我可以使用估算器的小偏移来设置估算器角度。 结果相同、 电机速度较低、但 pi_spd 反馈信号仍测得速度为20Hz。

    有人能解释为什么 PI_SPD 的反馈信号给出的值不正确吗?

    //
                // run the trajectories
                //
                EST_runTraj(estHandle);
    
                //
                // store the input data into a buffer
                //
                estInputData.dcBus_V = adcData.dcBus_V;
                estInputData.speed_ref_Hz = EST_getIntValue_spd_Hz(estHandle);
    
                //
                // run the estimator
                //
                EST_run(estHandle, &estInputData, &estOutputData);
    
                // ADDED CHANGES HERE        
                float32_t estAngle_rad = EST_getAngle_est_rad(estHandle) - 0.001;
                if(estAngle_rad < -MATH_PI)
                    estAngle_rad = estAngle_rad + MATH_TWO_PI;
                if(estAngle_rad > MATH_PI)
                    estAngle_rad = estAngle_rad - MATH_TWO_PI;
    
                if(bUseOffsetAngle){
                    EST_setAngle_rad(estHandle, estAngle_rad);
                    estOutputData.angle_rad = estAngle_rad;
                }
                //
                // compute the sin/cos phasor
                //
                phasor.value[0] = cosf(estOutputData.angle_rad);
                phasor.value[1] = sinf(estOutputData.angle_rad);
    
                //
                // set the phasor in the Park transform
                //
                PARK_setPhasor(parkHandle, &phasor);
    
                //
                // run the Park transform
                //
                PARK_run(parkHandle, &(estInputData.Iab_A),
                         (MATH_Vec2 *)&(Idq_in_A));
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ronnie、您好!

    已看到 Lab_is05报告当我们认为电机在闭环中运行时开环速度不正确。 在代码进入 main while 循环之前、必须先禁用 RsRecalc()。 奇怪的是、必须修整报告的反馈 FOC 速度以匹配设定的轨迹运行速度。  

        /* Set slow speed estimator Maximum cold starting torque */
        EST_setFlag_enableRsOnLine(estHandle, false);
        /* Rs ReCalibration flag state Offline still mode
         * runs motor open loop up to set trajectory Hz */
        EST_setFlag_enableRsRecalc(estHandle, false);
     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢你的反应,但两个旗帜都已做好了虚假的准备。

     Oddly 必须调整报告的反馈 FOC 速度以匹配设定的轨迹运行速度、这意味着什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗯、它在开环中运行、直到轨迹设定速度、且检测到的速度是曲折的。 否则、激光枪报告速度也快于估算器报告的闭环速度。 低速观测器用于使电机启动开环(<1Hz)、然后切换到闭环(>1Hz)检测到的速度。

    在全局更新函数(labs.h)中、速度被报告给 CCS 调试脚本窗口。 似乎需要调整所报告的速度、以便更均匀地匹配激光枪的速度。

        motorVars.speed_krpm = (motorVars.speed_Hz * (60 / 1000.0 /
                                        userParams.motor_numPolePairs * 1.5));
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    它得到了解决。 请勿使用函数 EST_setAngle_rad 设置估算器中的编码器角度。 仅使用编码器角度计算 Park 和 iPark 变换前的相量、然后 ctrl 对象将以直角控制电机。

    此致!

    Ronnie