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.

[参考译文] TMS320F280037C:(意外标记已解析、请参阅新主题)

Guru**** 2513185 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1272940/tms320f280037c-accidentally-marked-resolved-see-new-thread

器件型号:TMS320F280037C

此帖子意外标记的已解决,请参阅新主题: e2e.ti.com/.../tms320f280037c-tms320f280037c-universal-motor-control-lab-estimator-estoutputdata-bad-despite-good-inputs-dmc_level_3-from-successful-dmc_level_2

嗨、

旋转 BLDC 电机、尝试快速实现。 我已成功使用 InstaSPIN 实验室在评估套件上测试了此电机。

在让 DMC_LEVEL_2 在定制硬件上旋转电机时遇到一些困难。

仔细检查代码后、并未使用 V/Hz 角度发生器来命令电机、而是使用估算器来命令电机。

我最终成为了问题的绊脚石、因为用于开环 V/Hz 控制的角度发生器 InstaSPIN 实验"is03"在我的原型上完成了它(正确吗?) 绕过估算器生成的角度。

然后、我打开估算器、无需将其连接到控制系统、只需要查看它是否正常工作。

以下是我正在使用的 ISR:

__interrupt void motor1CtrlISR(void)
{
    //motorVars_M1.ISRCount++;
    MOTOR_Vars_t *obj = (MOTOR_Vars_t *)motorHandle_M1;
    USER_Params *objUser = (USER_Params *)(obj->userParamsHandle);
    HAL_ackMtr1ADCInt();        // acknowledge the ADC interrupt
    HAL_readMtr1ADCData(&obj->adcData);    // read the ADC data with offsets
    obj->ISRCount++;
    obj->adcData.V_V.value[0] -=obj->adcData.offset_V_sf.value[0] * obj->adcData.VdcBus_V; // remove offsets
    obj->adcData.V_V.value[1] -=obj->adcData.offset_V_sf.value[1] * obj->adcData.VdcBus_V;
    obj->adcData.V_V.value[2] -=obj->adcData.offset_V_sf.value[2] * obj->adcData.VdcBus_V;
    // Verifies the ADC for current and voltage, offset compensation,
    // clarke / park transformations. (Without using estimator angle)
    MATH_Vec2 phasor;
    CLARKE_run(obj->clarkeHandle_I, &obj->adcData.I_A, &obj->estInputData.Iab_A);
    CLARKE_run(obj->clarkeHandle_V, &obj->adcData.V_V, &obj->estInputData.Vab_V);

#if (DMC_BUILDLEVEL == DMC_LEVEL_2)
        //---------------------------------------
        if(obj->flagRunIdentAndOnLine == true){
            obj->counterTrajSpeed++;
            if(obj->counterTrajSpeed >= objUser->numIsrTicksPerTrajTick){
                obj->counterTrajSpeed = 0;
                TRAJ_run(obj->trajHandle_spd); // run a trajectory for speed reference,  so the reference changes with a ramp instead of a step
                obj->estInputData.speed_ref_Hz= TRAJ_getIntValue(obj->trajHandle_spd);
            }

            //obj->enableCurrentCtrl = obj->flagEnableCurrentCtrl;
            //obj->enableSpeedCtrl = obj->flagEnableSpeedCtrl;
        }
        else{
            obj->enableSpeedCtrl = false;
            obj->enableCurrentCtrl = false;
        }

        obj->estInputData.dcBus_V = obj->adcData.VdcBus_V;
        obj->speed_int_Hz = obj->estInputData.speed_ref_Hz;

        EST_run(obj->estHandle, &obj->estInputData, &obj->estOutputData);
        //obj->oneOverDcBus_invV = obj->estOutputData.oneOverDcBus_invV;
        //obj->estOutputData.oneOverDcBus_invV = 1.0 / obj->estInputData.dcBus_V;
        obj->oneOverDcBus_invV = 1.0 / obj->estInputData.dcBus_V;

        ANGLE_GEN_run(obj->angleGenHandle, obj->estInputData.speed_ref_Hz);
        obj->angleGen_rad = ANGLE_GEN_getAngle(obj->angleGenHandle);//angleFoc_rad = ANGLE_GEN_getAngle(obj->angleGenHandle);
        obj->angleFOC_rad = obj->angleGen_rad;
        
        VS_FREQ_run(obj->VsFreqHandle, obj->estInputData.speed_ref_Hz);
        obj->Vdq_out_V.value[0] = VsFreq_M1.Vdq_out.value[0];//VS_FREQ_getVd_out(obj->VsFreqHandle);
        obj->Vdq_out_V.value[1] = VsFreq_M1.Vdq_out.value[1];//VS_FREQ_getVq_out(obj->VsFreqHandle);

        phasor.value[0] = __cos(obj->angleFOC_rad);
        phasor.value[1] = __sin(obj->angleFOC_rad);
        IPARK_setPhasor(obj->iparkHandle_V, &phasor);    // set the phasor in the inverse Park transform
        IPARK_run(obj->iparkHandle_V, &obj->Vdq_out_V, &obj->Vab_out_V);    // run the inverse Park module
        //SVGEN_setup(obj->svgenHandle, obj->estOutputData.oneOverDcBus_invV);    // setup the space vector generator (SVGEN) module
        SVGEN_setup(obj->svgenHandle, obj->oneOverDcBus_invV);
        SVGEN_run(obj->svgenHandle, &obj->Vab_out_V, &obj->pwmData.Vabc_pu);    // run the space vector generator (SVGEN) module

        if(HAL_getPwmEnableStatus(obj->halMtrHandle) == false)
        {
            obj->pwmData.Vabc_pu.value[0] = 0.0;
            obj->pwmData.Vabc_pu.value[1] = 0.0;
            obj->pwmData.Vabc_pu.value[2] = 0.0;
        }
        HAL_writePWMData(obj->halMtrHandle, &obj->pwmData);

请注意、估算器不用于生成 PWM 的相位角;ANGLE_GEN_Run 直接接收目标速度并向 PWM 信号链提供相量。

以下是  使用 V/Hz 控制方法时 ADC 读数的一些数据记录快照:

(对于每组4个图表:左上、右上、左下、右下)

(编辑)(左) I_A 值[0]、I_A 值[1]、I_A 值[2]、angleGen_rad       

(中间) V_V.value[0]、V_V.value[1] 、V_V.value[2]、 angleGen_rad       

(右) IAB_A.value[0]、 IAB_A.value[1]、 VAB_V.value[0]、VAB_V.value[1]  

         

因此、在提供输入的情况下、Clarke 变换会输出非常清晰的波形。 它们被生产、速度相当低、为20Hz。 用户会认为估算器在从该反馈中查找转子位置等方面不会遇到任何问题。

相反、我得到了以下结果:

如果电机未旋转、ANGLE_rad 是-pi 和 PI 之间的实际数字、当电机开始旋转时、它会立即变为+INF。

oneOverDcBus_invV 是常数。

所有其他数字都会发生巨大变化。 RPS 在-25000至25000之间波动。

如何修复估算器?

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

    我立即在我的方式中看到了一个误差:DMC 级别3/is04中尚未启用快速估算、仅添加了 PI 环路用于电流感应/控制。

    接下来我将深入探究代码。 这里仍有一些有趣的事情。

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

    尽管 ESTrun()在角度发生器之前被调用-让我来看看我的代码并报告任何差异。

     EST_run (obj->estHandle、&obj->estInputData、&obj->estOutputData);

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

    在 SDK4.0 UMC 项目中、奇怪的相量设置为使 motor1_drive.c 停止。 它仅在电机复位后设置一次。

    #if (DMC_BUILDLEVEL <= DMC_LEVEL_3)
    obj->angleFOC_rad = obj->angleGen_rad;
    #endif

    //计算正弦/余弦相量
    Phasor.value[0]=_cos (obj->angleFOC_rad);
    Phasor.value[1]=_sin (obj->angleFOC_rad);

    //设置帕克变换中的相量
    Park_setPhasor (obj->parkHandle_i、&phasor);

    //运行 Park 变换
    Park_run (obj->parkHandle_i、&(obj->estInputData.Iab_a)、
    (MATH_VEC2 *)&(obj->idq_in_a));

    // motor1_fast 结束&& motor1_eSMO

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

    在 SDK4.0 UMC 项目中、奇怪的相量设置为使 motor1_drive.c 停止。 它仅在电机复位后设置一次。

    #if (DMC_BUILDLEVEL <= DMC_LEVEL_3)
    obj->angleFOC_rad = obj->angleGen_rad;
    #endif

    //计算正弦/余弦相量
    Phasor.value[0]=_cos (obj->angleFOC_rad);
    Phasor.value[1]=_sin (obj->angleFOC_rad);

    //设置帕克变换中的相量
    Park_setPhasor (obj->parkHandle_i、&phasor);

    [/报价]

    我正在使用 SDK 5.0 (看到它是新的、无论如何都是从头开始的)、universal_motor_control_lab_f28003x、这个代码位于 ISR "__interrupt void motor1CtrlISR"中的"motor1_drive.c"中、并且 ISR 在每个 PWM 周期中调用一次(在每次 ADC 读取结束时)。

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

    定义 eSMO && FAST 符号时,角度发生器也会在 motor1_ctrlISR ()中运行。 似乎应该是|||但我还没有试过。 在上述代码协调中、相位调节器在构建级别3中设置为停止、而 FocRad 在 ISR 中设置对齐角。 IPark 不用于我能够找到的构建级别4 ISR、好像 启用了驻车相位调节器构建级别4一样。   

    编辑:启用 Park 且部分以上 SNIP 被禁用: obj->angleFOC_rad = obj->angleGen_rad ;

    #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);
        
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        
            // Running state
        if(obj->estimatorMode == ESTIMATOR_MODE_FAST)
        {
        
            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);
                ANGLE_GEN_setAngle(obj->angleGenHandle, obj->angleFOC_rad);

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

    Oops 旨在点击回复、而不是"这解决了我的问题"。 不幸的是、没有办法撤消它。 我打算发布一个新话题、因为 TI 可能只是跳过了这一个话题。

    (编辑)链接: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1273893/tms320f280037c-tms320f280037c-universal-motor-control-lab-estimator-estoutputdata-bad-despite-good-inputs-dmc_level_3-from-successful-dmc_level_2