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.

[参考译文] TMS320F280039C:eSMO 问题

Guru**** 2473270 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1471197/tms320f280039c-esmo-issue

器件型号:TMS320F280039C

工具与软件:

嗨团队、

使用 eSMO 算法观察转子角度时发现转子角度不是线性的、而是有几个从-180度到+180度的凸起、这会导致角度观察不准确。 我是否可以知道哪些参数可能会影响此结果?

谢谢、此致、

Jiahui

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

    尊敬的 Jiahui:

    电机的运行速度是多少? eSMO 利用估算的反电动势进行角度重建、对于低速运行而言可能不准确。  

    谢谢!

    嘉兴市

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

    尊敬的嘉兴:

      过去在该论坛上表示过、选中并启用构建后、eSMO (滑动模式观测器)仅取代<1Hz (开环)的 FAST 估算器低速观测器。 看起来必须同时存在 Fast 和 eSMO 使能符号、并且必须使用快速估算器库调用中内置的低速观测器通过实验室脚本调试监视器进行选择(使用 eSMO 实现快速)以用于 FOC 启动。

     要选择滑模观测器电机启动(开环)、请通过实验脚本下拉对话框选择 eSMO 源以覆盖原始低速观测器库调用。 然后、快速估算器计算 FOC 无传感器运行代码的角度(闭环)。 电机启动中最难的部分是确定转子方向(开环)、使其在进入具有电流控制优先级的闭环之前运转良好。

    如果未首先添加 eSMO 符号(已启用)、则通用电机控制开环启动将无法正常工作。 看似代码 motor1_drive.c 线性进展会加载两个启动模式参数、两个低速(开环)观测器的函数调用非常相同。

    下面、对由 MOTOR1_eSMO 为两个低速观测器设置的轨迹进行编码。

                #if defined(MOTOR1_FAST)
                //***********************************************************
                // enable or disable force angle
                EST_setFlag_enableForceAngle(obj->estHandle,
                                             obj->flagEnableForceAngle);
    
                EST_setFlag_enableRsRecalc(obj->estHandle,
                                           obj->flagEnableRsRecalc);
                #endif  // MOTOR1_FAST
    
                #if defined(MOTOR1_ESMO)
                //************************************************************
                if(obj->motorState >= MOTOR_CL_RUNNING)
                {
                    TRAJ_setTargetValue(obj->trajHandle_spd, obj->speedRef_Hz);
                }
                else
                {
                    TRAJ_setTargetValue(obj->trajHandle_spd,
                                        (obj->speedForce_Hz * obj->direction));
                }

    #if defined(MOTOR1_FAST) && defined(MOTOR1_ESMO)    //WAS && (OK<->OK)
        // sensorless-FOC
        MATH_Vec2 phasor;
    
        ANGLE_GEN_run(obj->angleGenHandle, obj->speed_int_Hz);
        obj->angleGen_rad = ANGLE_GEN_getAngle(obj->angleGenHandle);
    
    
    // run the eSMO
        ESMO_setSpeedRef(obj->esmoHandle, obj->speed_int_Hz);
        ESMO_run(obj->esmoHandle, obj->adcData.VdcBus_V,
                        &(obj->pwmData.Vabc_pu), &(obj->estInputData.Iab_A));
    
        obj->angleComp_rad = obj->speedPLL_Hz * obj->angleDelayed_sf;
        obj->anglePLL_rad = MATH_incrAngle(ESMO_getAnglePLL(obj->esmoHandle), obj->angleComp_rad);
    
        SPDFR_run(obj->spdfrHandle, obj->anglePLL_rad);
        obj->speedPLL_Hz = SPDFR_getSpeedHz(obj->spdfrHandle);
    
        obj->speedFilter_Hz = obj->speedFilter_Hz *0.875f + obj->speed_Hz * 0.125f;
        obj->speedAbs_Hz = fabsf(obj->speedFilter_Hz);
    
        // Running state
        if(obj->estimatorMode == ESTIMATOR_MODE_FAST)
        {
            obj->speed_Hz = obj->speedEST_Hz;
    
            if(obj->motorState >= MOTOR_CTRL_RUN)
            {
                obj->angleFOC_rad = obj->angleEST_rad;
    
                ESMO_updateKslide(obj->esmoHandle);
            }
            else if(obj->motorState == MOTOR_CL_RUNNING)
            {
                obj->angleFOC_rad = obj->angleEST_rad;
                ESMO_setAnglePu(obj->esmoHandle, obj->angleFOC_rad);
            }
            else if(obj->motorState == MOTOR_OL_START)
            {
                obj->angleFOC_rad = obj->angleEST_rad;
                obj->motorState = MOTOR_CL_RUNNING;
    
                ESMO_setAnglePu(obj->esmoHandle, obj->angleFOC_rad);
            }
            else if(obj->motorState == MOTOR_ALIGNMENT)
            {
                obj->angleFOC_rad = 0.0f;
                obj->enableSpeedCtrl = false;
    
                obj->stateRunTimeCnt++;
    
                obj->IsRef_A = 0.0f;
                obj->Idq_out_A.value[0] = obj->alignCurrent_A;
                obj->Idq_out_A.value[1] = 0.0f;
    
                TRAJ_setIntValue(obj->trajHandle_spd, 0.0f);
                EST_setAngle_rad(obj->estHandle, obj->angleFOC_rad);
                ESMO_setAnglePu(obj->esmoHandle, obj->angleFOC_rad);
    
                if((obj->stateRunTimeCnt > obj->alignTimeDelay) ||
                         (obj->flagEnableAlignment == false))
                {
                    obj->stateRunTimeCnt = 0;
                    obj->motorState = MOTOR_OL_START;
    
                    obj->Idq_out_A.value[0] = obj->fluxCurrent_A;
                    PI_setUi(obj->piHandle_spd, 0.0);
                }
            }
            else if(obj->motorState == MOTOR_SEEK_POS)
            {