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-F280039C:UMCSDK PI 电流控制器__fsat

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1620510/launchxl-f280039c-umcsdk-pi-current-controller-__fsat

器件型号: LAUNCHXL-F280039C

您好团队:

我们能够通过跳动 PI±电流来停止电机减速直流电压反弹。 线性直流电源> 13,000uF、逆变器 1300uF 大容量电容器。 在持续电流>16A 的线性电源下、相同的电机和直流逆变器在梯形波形下运行良好。 I

            #else  // !MOTOR1_ISBLDC

                /* Reduce half the min/max deceleration current */
                if(bMainDecel)
                {
                    PI_setMinMax(obj->piHandle_spd, -obj->maxCurrent_A / 2 , obj->maxCurrent_A / 2);
                }
                else
                {
                    PI_setMinMax(obj->piHandle_spd, -obj->maxCurrent_A / 1.25, obj->maxCurrent_A / 1.25);
                }

                SVGEN_setMode(obj->svgenHandle, obj->svmMode);
            #endif  // !MOTOR1_ISBLDC

 当电机估算电流设置得过高以达到轨迹速度赫兹时、PI 积分器在下面的负积分器输入值和正积分器输入值之间明显地摆动电流非单调线性斜坡! 奇怪的是、这也会导致 PI RUN 系列中的直流电感电压在 Idq 帧 (motor1_drive.c) 中反弹直流。

分析 PI 集系列函数时、似乎__fsat 缺失、但编译器会跳过它、否则 CCS 无法找到它?

 无论如何、我们添加的 bMainDecel 现在可以在减速期间停止 PI 最小/最大电流控制器中的直流反弹、也可以停止触发 OVC 故障!  然而、仍然对轨迹电流摆幅具有过多的非线性加速、这似乎是 PI 电流控制器中的积分器造成的且不饱和?

为什么要使用函数__fsat?

为什么 VsMaxV 乘以 PU 0.5f? 这一数学运算使得+165V 直流总线电压= 82.5VsMax。 请注意、转子 Speed_Hz 未计入 PI 积分器误差因子。 这似乎导致轨迹落后、因为只要 Speed_Hz < 1000RPM、电流就开始大幅滞后电压。 此电机需要 14-16 安培的电流才能在额定电压 235vdc 下达到远远超过 1000RPM。

奇怪的是、我们只能设置 USER_MOTOR1_MAX_CURRENT_A  <=  10.535f、或者当 Speed_Hz > 250Hz 且仍然听到电流反弹> 420Hz 时、PI 开始振荡(反弹)定子电压。 问题是需要将电流设置为>12A 以穿过频率屏障、惯性矩以特定的 Idq 和转子速度交叉。 PI 控制器不得溢出 32 位错误乘法! 然而、float- 32 似乎正在溢出 pi_run 函数中的积分器误差。 也许是为什么 Luminary Micro 在 Thumb 汇编器中进行 32 位乘法、所以 CCS 编译器优化器不会影响速度积分器误差量的乘法。 当看似感性的电流开始滞后于电压超过几百转的转子>250Hz 时、积分在大多数转子转速下都保持稳定。  

ERROR = refValue - fbackValue;

//计算比例输出
UP = KP * Error;

 //最大电压输出
obj->VsMax_V = objUser->maxVsMag_pu * obj->adcData.VdcBus_V;
pi_setMinMax(obj->pi Handle_Id、-obj->VsMax_V、obj->VsMax_V);

 image.png

    // Maximum voltage output
    obj->VsMax_V = objUser->maxVsMag_pu * obj->adcData.VdcBus_V;
    PI_setMinMax(obj->piHandle_Id, -obj->VsMax_V, obj->VsMax_V);

#else     // !SFRA_ENABLE
        // run the Id controller
        PI_run_series(obj->piHandle_Id,
                      obj->IdqRef_A.value[0], obj->Idq_in_A.value[0],
                      obj->Vdq_ffwd_V.value[0], (float32_t*)&obj->Vdq_out_V.value[0]);

        // calculate Iq controller limits
        float32_t outMax_V = __sqrt((obj->VsMax_V * obj->VsMax_V) -
                          (obj->Vdq_out_V.value[0] * obj->Vdq_out_V.value[0]));

        PI_setMinMax(obj->piHandle_Iq, -outMax_V, outMax_V);

        // run the Iq controller
        PI_run(obj->piHandle_Iq, obj->IdqRef_A.value[1],
               obj->Idq_in_A.value[1], (float32_t*)&obj->Vdq_out_V.value[1]);
#endif  // !SFRA_ENABLE


#if defined(MOTOR1_FAST)
        // set the Id reference value in the estimator
        EST_setId_ref_A(obj->estHandle, obj->IdqRef_A.value[0]);
        EST_setIq_ref_A(obj->estHandle, obj->IdqRef_A.value[1]);
#endif  // MOTOR1_FAST
    }

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

    SDK v4.02 PI 控制电机转速、可能有助于了解积分器为什么会产生电压弹跳。 UMCSDK 代码似乎启用然后禁用速度控制器、主要是在转子查找位置和对齐期间禁用该控制器。

    在加速至轨迹期间以及之后速度控制器被启用/禁用时、斜坡与步进轨迹之间是否切换?

    观察结果:某种东西正在快速切换 PI 速度控制器开/关,并且在循环循环运行 Motor1Control () 时变得非常明显。 用于启动电机的梯形逻辑中的错误或许也会使电流控制器处于替代状态? 如果一切逻辑正常工作、我们可以将电机电流最大值设置为 16A、并且在电流仅为 11A 时不会看到电压弹跳、并且轨迹 Ref_Hz 甚至不接近被达到!   

    在单击“确定“按钮后、编辑代码插入将不允许在弹出式编辑窗口中添加文本脚趾。 URL 显示在窗口下方、就像正在保存一样、但不会在帖子中保存编辑内容。

     
    //********************************************************** 
     // run the speed controller
        obj->counterSpeed++;
    
        if(obj->counterSpeed >= objUser->numCtrlTicksPerSpeedTick)
        {
            obj->counterSpeed = 0;
    
            obj->speed_reg_Hz = obj->speed_Hz;
    
            if(obj->enableSpeedCtrl == true)
            {
                obj->Is_ffwd_A = 0.0f;
    
    
    #if defined(SFRA_ENABLE)
                PI_run_series(obj->piHandle_spd,
                       (obj->speed_int_Hz + sfraNoiseSpd), obj->speed_reg_Hz,
                       obj->Is_ffwd_A, (float32_t *)&obj->IsRef_A);
    #else     // !SFRA_ENABLE
              PI_run_series(obj->piHandle_spd,
                    obj->speed_int_Hz, obj->speed_reg_Hz,
                    obj->Is_ffwd_A, (float32_t *)&obj->IsRef_A);
    #endif  // !SFRA_ENABLE

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

    UMCSDK 和 SDK 速度控制轨迹斜坡和 id 电流之间的差异在 ISR 中启用。 似乎 LD 没有被调制 20Khz 和更快的 120MHz SYSCLK 速度? 下图显示了 25KHz 调制的 ld/Iq 非常稳定。

    我们如何在 CCS 中查看通过 MDAC 数据记录来调试 ID/IQ 波形?

    while 循环可能运行得更快、并且在 Instaspin 20kHz 21µs ISR 周期内同相? 无论如何、三相电流波形不是线性的、在每个 while 循环周期的开始和结束处变成瓶形、就像有东西在开启和关闭一样。

    lab_is07 速度控制斜坡

    //
    // run Clarke transform on voltage
    //
    CLARKE_run(clarkeHandle_V, &adcData.V_V, &(estInputData.Vab_V2));
    
    counterTrajSpeed++;
    
    /* Check against user.h value of IsrPerTrajTicks */
    if(counterTrajSpeed >= userParams.numIsrTicksPerTrajTick)
    {
        //
        // clear counter
        //
        counterTrajSpeed = 0;
    
        //
        // run a trajectory for speed reference,
        // so the reference changes with a ramp instead of a step
        //
        TRAJ_run(trajHandle_spd);
    
        motorVars.speedTraj_Hz = TRAJ_getIntValue(trajHandle_spd);
    }

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

    为什么在速度控制部分中 PI 控制积分器会复位为 0.0f(就像在每个 21µs 周期切换回闭环一样)? 当相电流开始随 Speed_Hz 升高时、更谨慎的做法是将积分器保持在中间值吗? 启用速度控制器时、电机已处于闭环控制状态?

    每当电机频率> FORCE_Hz 值时、积分器中的最后一个值似乎应该是最后一个静态值。 这样、ld 电流不会 在每个 PI 周期上下振荡? 小型电动机转子跳至 500Hz <500ms、并且积分器在每个周期被归零对它们来说不是问题、但是工业或汽车 IPM/SPM 电动机>8kg 转子(已加载)可能需要几秒钟才能达到 500Hz。

    PI 积分器控制 Id 电流中的比例和积分?   

    请注意、用户扭矩电流最初设置为等于 isset_A、然后进一步将其初始化为 0.0f

    Else if ((obj->motorState >= motor_CL_running)&&
                        (obj->flagMotorIdentificated == true ))

       if (obj->speed_int_Hz > 0.0f)
       {
         /*设置用户扭矩电流*/
         obj->IsRef_A = obj->IsSet_a;//0.0f
      }
      暴露
      {
         obj->IsRef_A =-obj->IsSet_A;//0.0f
      }

      //用于切换反速闭环控制
      pi_setUi (obj->piHandle_spd、obj->isRef_A);
    }

    此代码变化将调节设定的 Speeds Ref_Hz 的 Speed_Hz±1Hz、并确实调节 21µs ISR 中的相电流。 似乎 PI ID 可以使用类似的 UI 更新?

     Else if ((obj->motorState >= motor_CL_running)&&
    (obj->flagMotorIdentificated == true ))

      /*使用 RMS 相电流*/
      obj->IsRef_A = obj->is_a;

    if (obj->speed_int_Hz == 0.0f)

       /*重置积分器 UI */
      obj->IsRef_A = obj->IsSet_A;//0.0f
    }
    else if (-obj->speed_int_Hz == 0.0f)

      obj->IsRef_A =-obj->IsSet_A;//0.0f
    }

       /*更新速度 PI UI 值*/
       pi_setUi (obj->piHandle_spd、obj->isRef_A);
    }

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

    奇怪的是、我们之前运行的 ID/IQ 仿真不同意速度 PI 最小/最大值设置为直流母线电压的 1/2。 Id/Iq 低于 直流电源电压的 7/8 分! 尤其是当频率上升时、电流滞后于电压、直流电压不应上下振荡。 我们为 1020Hz 39nF 设置滤波器极点 RC、并且存在相同的问题。 在每次更新 ld/IQ 控制器时、UMCSDK 中的电压幅度都会以某种方式由电流控制器进行调制。

    SDK 版本中也存在同样的问题、但情况更糟、从未在 UMCSDK 代码中进行过更正。   

    请注意、在 DQ 仿真中、我们看不到直流压降为 1/2、并保持非常接近 138V 仿真总线电压。 话虽如此、vdq_FFWD 值仅设置一次 while 循环中的电流控制器、然后仅更新 ki/KP 值。 作为积分、PI 控制器中的瓶颈似乎逐渐消失、或者它通过 PI Error 值的_fsat 编译器内部 float32 乘法溢出。   

    if(obj->enableCurrentCtrl == true)

       obj->Vdq_FFWD_V.value[0]= 0.0f;
       obj->Vdq_FFWD_V.value[1]= 0.0f;

    //最大直流电压输出的一半
    obj->VsMax_V = objUser->maxVsMag_pu * obj->adcData.VdcBus_V;

    pi_setMinMax(obj->pi Handle_Id、-obj->VsMax_V、obj->VsMax_V);

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

    InstaSPIN-FOC 仍然使用典型的 FOC 控制环路。 Vd、Vq 和 Id、Iq 必须满足电压圆和电流圆限制。 因此、 如果禁用过调制、则 sqrt (Vd*Vd + Vq*Vq)<sqrt (3)/2*Vdc 或<0.5VDC。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 ld/IQ 控制器的每次更新中、电流控制器都会以某种方式调制 UMCSDK 中的电压幅度。

    尊敬的 Jiaxin:

    奇怪的是、将 Rs 欧姆 x2 (user_mtr1.h) 相乘时、加速振荡停止。 我希望电机 ID 测试 P2P 电阻措施。 看似检测到的电机 ID 是单相 Rs 欧姆? 这是三角形绕组电机、而不是星形电机、且中性中心点无效!

    Delta 绕组中的交流行为不同、电机 ID 不考虑该差异?

     最近发现的内容;1ms 计时环路递减计数 (motor_common.c) 与 SYSCLK 永远不会处于同一时钟上下文中。 任何人都不会想到寻找导致时间问题的递减计数器。 最好将所有时序环路保持在相同的时钟上下文(C 模块)中、并在永久 while 循环中删除 1ms CPU 计时器、看起来会降低速度、并且在切换案例中不会与主 ISR 21µs 环路相冲突、然后使计数器的时间达到 100-200 递增计数器并持续 1ms。

     开关盒(电机监测器)有 5 个–23µs 周期、RMS 电流测量值与主 ISR 环路中的 20kHz 50µs 周期更加同步。 只需在 循环上下文中重置/加载计数器并递减或递增 runMotor1Control () 中的监视器计数。 当我们将计数重置为 0 以及 user_mtr1.h 中设置的快速重启/启动运行时序的其他测试计数时、电机 ID 将运行 电机等待重启时序从未加载初始计数 initMotor1CtlParameters()。

    BTW:如果我们在控制环路时使电机减速、随机重启不是电流控制问题、从不是 SDK 代码版本。 然后、当相电流减半时、在轨迹控制的减速期间、重启不会再生能量。  

    此代码监听实际上对 uint16_t 执行了什么操作   

    //递减倒计数???
    if (obj->stopWaitTimeCnt > 0)

      obj->stopWaitTimeCnt--;

    }

    //重置 stopWaitTimeCnt 或 ID 在同一上下文中递减计数时不会运行。  

    IF(EST_isMotorIdentifyed(obj->estHandle)== true )

      obj->flagMotorIdentifyed = true;

      //清除标志
      obj->flagRunIdentAndOnLine = false;
      obj->flagEnableRunAndIdentify = false;

      /*设置状态停止空闲*/
      obj->motorState = motor_stop_idle;
      /*设置等待零以重新启动电机*/
      obj->stopWaitTimeCnt = 0;

      //禁用估计器
      EST_disable(obj->estHandle);

      //启用轨迹生成器
      EST_disableTraj(obj->estHandle);
    }

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

    嗨、Jiaxin、

    因此 sqrt (Vd*Vd + VQ*Vq)<sqrt (3)/2*Vdc 或<0.5VDC(如果禁用过调制)。

    然而、电机相电压远小于禁用过调制的仿真。 130V 电机相电压约为+86V。

    似乎总线电压 SF 设置为低于 PU 0.5VDC? 电机一直在寻找直流电压、因此它可以在磁通量中的较低赫兹下达到更高的转速、而不仅仅是被推高的电流。 电流落后于电感器中的电压!

       

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

    尊敬的 Genatco:

    您使用了什么仿真软件? 您是否在 MATLAB/Simulink 中复制了相同的系统? 您能 详细说明一下 仿真是如何进行的吗?

    谢谢、

    Jiaxin

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

    尊敬的 Jiaxin:

    您是否在 MATLAB/Simulink 中复制了相同的系统? [/报价]

     是的、SDK4.0 之前的 Simulink 也存在、因此令人费解的是、为什么我们的电机在相同直流电压下的较旧梯形 FOC 将比 FAST 估算器达到更高的 RPM。 然而、使用较旧的梯形 FOC 时、电流要高得多、但通过 FAST 估算器(通过转子轴上的反射激光速度检查确定)至少降低了 450RPM。 该电机应达到至少 1650RPM、但 FAST 会遇到 1350RPM 的困难。 奇怪的是、有一次、当速度 Ref_Hz 下降时、转子速度通过没有缓冲器的直流逆变器跃升至 1750RPM、然后由 LCD 屏幕上的滑块 Pot 升起、虽然 KP_SPD 是 42.0023456770 对转子惯性的非常严格的 PI 控制、现在 KP_SPD 大约为 0.02345678 例如、不知道为什么它会这样下降。   

     在快速模式下、电机 Vd/Vq 会产生非常高的噪声(约 400Hz)、即使每个半桥添加了 1RC 和 LSS 缓冲器以及三个新的 INA241 电流放大器也是如此。 我们的滤波器极点截止频率约为 49nF/3.9k、ADC 中的余量为 30%。 我们在 170V 直流电压下检查电机 ID、并提供相当准确的电感 350H、Rs Ω、额定磁通值。 示波器探针上的 Vd/Vq 处于总线电压峰值。 但高于接地值的+10V 失调电压除外。 梯形高侧 HO 驱动的行为是否可能与 Vd/Vq 偏移不同? 回想一下、使用梯形 FOC 时 HO 的差分电压比 LO 大 10V。   

    奇怪的是、电机 ID 条目在首次运行时驱动 OVC、但在清除当前故障后断言 RROVE/L。 在 170V 直流 OVC 故障下、电机发出咔嗒声、由于反激式 EMF 过大、在 NFETS 上不是很好! 也许 restartMotorControl () 中的某项导致 Rover/L 在首次运行时驱动过大的电流? 看似 USER_setMotor1Params () 设置 userParams_M1.RoverL_exc Freq_Hz = USER_M1_R_OVER_L_EXC_FREQ_Hz (250Hz)、但在第一个 ID 运行之前没有 motorSetVars_M1.RoverL_rps 值。 回想一下、我们用于在 (user.h) 电机值中设置 USER 参数、UMCSDK 中似乎缺失。

    问:FW 会产生更高或更低幅度的 Vd/Vq 吗? 我们的电机不是 IPM、但 Copilot 建议使用 FW 方法来提高速度。 我们使用两个具有类似 FAST 问题的不同直流逆变器进行测试。

    我们注意到 CCS 调试 KP_SPD 值已经远小于 42.0f、在此之前在禁用 PI 调优函数后设置了该值。 现在、电机有一些过冲/下冲不会在速度 Ref_Hz 附近表现得僵硬。  

      

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

    尊敬的 Genatco:

    在 FOC 中、电流环路最大电压输出的基本限制是可用的直流母线电压。 对于设计合理的 FOC 系统、dq fram 中的最大电压幅度为:对于圆形限制 (SVPWM)、Vmax = Vdc/2;对于六角形限制(过调制)、Vmax = 2Vdc/3。 电流控制器通常被钳位以防止过调制、并且会限制 DQ 电压基准、以将电压矢量幅度保持在六角或圆边界内。

    谢谢、

    Jiaxin

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

    尊敬的 Jixian:

    [quote userid=“5462292" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1620510/launchxl-f280039c-umcsdk-pi-current-controller-__fsat/6283902 通过钳位电流控制器来防止过调制、并且会限制 dq 电压基准以将电压矢量幅度保持在六角或圆边界内。

     感谢您详细解释 Vdq。 在 UMCSDK 中似乎发现了几个问题。 当电机惯性启用时、KP_SPD 和 KI_sp 的 KI_series 值过于僵硬、从而导致野生 Vdq 幅度摆动。 使用 FLAG_BYPASS_MOTOR_ID (FALSE)、消除用户设置的速度 PI 惯性、KP_SPD 几乎适用于非常小的转子质量。 大的超速速度 Ref_Hz 发生在 16 千克转子质量的轨迹(旁路 ID 真)...  

    编辑:该转子的 IM 似乎错误地输入到 User_Mtr1.h 或 FEM 计算不正确。

     要达到更高的速度、需要将 20kHz PWM 降低至 16KHz、此时快速转子角度更稳定。 然后达到 1645 RPM (548Hz)、通过启用惯性 KI 系列在运行过程中快速驱动 OVC、直至达到任何目标速度。 FAST 无法控制 Extreme Kp_Spd 42.0、Ki_Id 0.449 周围的角度。 必须定制惯性 Kctrl_WB 公式以允许一些 PI 过冲、但噪声因子会随着空载扭矩速度而增加。 下面的代码嗅探降低了 Ki_series 和 Kp_Spd、即使在较低轨迹目标速度下也能消除野生 Vdq 幅度摆幅。  

      FYI:无文档记载在未启用惯性的情况下、快速开环启动的行为大不相同、是非常慢的斜坡。 使用 KI 系列针对电机惯性启动计算得出、对齐行为相应地、速度非常快、就像 eSMO 一样、时间远小于 1 秒、更像是 50ms +启动时间计数。 如果未启用惯性、则快速对齐电流会下降、缓慢斜升开环电流。 我们可以在 GUI 范围小工具中看到这种情况发生、因此在未启用 eSMO 时设置正确 KI 系列的详细信息变得非常有必要阅读工程师注释。   

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

    尊敬的 Genatco:

    它们的调试进展如何? 您是否最终达成了使系统正常工作的解决方案?

    谢谢、

    Jiaxin