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.

[参考译文] C2000WARE-MOTORCONTROL-SDK:如何控制 PWM 输出的最小占空比

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1239119/c2000ware-motorcontrol-sdk-how-should-i-control-the-minimum-duty-cycle-of-the-pwm-output

器件型号:C2000WARE-MOTORCONTROL-SDK

您好!

我是 尝试运行 is04_signal_chain_test_eabi 来自 MotorControl SDK 中提供 版本4.02.01。 到目前为止、我已经能够使用 is03_signal_chain_test_eabi 在开环中使电机旋转。

假设、 电压和电流反馈参数是正确的。 PWM 信号以20kHz 的频率运行、死区时间为2.5µs μ s。 栅极电压的 µs dV/dt 目前约为20V/μ s。

在给定所有这些条件的情况下、当我尝试使用 is04_signal_chain_test_eabi 来旋转电机时、 电机会发出咔嗒声、但不会启动。 为 IGBT 栅极驱动、 进入保护模式并关断栅极。

我的假设是、在发生故障时、高侧 PWM 信号的占空比太短、栅极电压绝不会超过最小开关电压、而高侧 IGBT 绝不会导通。 IGBT 栅极驱动器检查 IGBT 的 VCE。 由于 VCE 在指定时间后不会下降(VCE 在250ns 后应降至9V 以下)、驱动器将检测到短路情况并关闭输出。

您能给我一些关于当前情况的见解吗? 是否有任何机制来控制 PWM 信号的占空比? PI 控制器是否已经饱和? 如何检查 PI 控制器是否饱和?

作为参考、这些是栅极电压。 IGBT 阈值电压为6.5V。

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

    您好!

    我在中找到此片段  HAL_writePWMData

            float32_t V_pu = -pPWMData->Vabc_pu.value[pwmCnt];
            float32_t V_sat_pu = MATH_sat(V_pu, 0.5, -0.5);
            float32_t V_sat_dc_pu = V_sat_pu + 0.5;
            int16_t pwmValue  = (int16_t)(V_sat_dc_pu * period);
            ...
            EPWM_setCounterCompareValue(obj->pwmHandle[pwmCnt],
                                        EPWM_COUNTER_COMPARE_A,
                                        pwmValue);

    我可以看到、占空比能够从0%到100%(V_SAT_dc_pu。) 我应该关闭这里的饱和窗口吗? 虽然这会减小最大电压矢量并可能导致某些失真、但这会防止占空比变得非常低。 我缺少什么吗? 还有其他选项吗? PI 控制器似乎确实将达到饱和。

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

    您好!

    我已经找到 PI 控制的设定点定义。 当我使用感应电机时、如果我为 ID 基准? 我应该如何计算该设定点、从而能够在  is04_signal_chain_test_eabi?

    MATH_Vec2 IdqSet_A = {0.0, 0.75};

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

    您可能需要 在 user.h 中设置正确的"USER_ADC_FULL_SCALE_CURRENT_A"值、并在 hal.h 中根据您运行 lab04的硬件板设置"HAL_readADCDataWithOffsets ()"中的"current_sf"符号。

    静态内联空
    HAL_readADCDataWithOffsets (HAL_Handle handle、HAL_ADCData_t * pADCData)
    {
    HAL_Obj * obj =(HAL_Obj *)句柄;

    float32_t 值;

    float32_t current_sf = HAL_getCurrentScaleFactor (handle);
    float32_t VOLTAGE_SF = HAL_getVoltageScaleFactor (句柄);

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

    尊敬的 Yamming:

    感谢您的答复。

    我改为 PM 电机。 现在、当我运行 is04_signal_chain_test_eabi ,电动机的激活时间为 达到最大扭矩时的零速 。 栅极驱动器不再检测 IGBT 的去饱和情况。

    我已经回顾了您建议的内容。 尽管如此、我将使用浮动分流电阻器(x3)-这会是问题吗? 这是我的设置

    分流电阻与相位串联、放大器的正极侧连接到电机侧。 因此我假定"current_sf"的符号应为负、因此我更改了 hal.h 中的 HAL_readADCDataWithOffsets()、如下所示

    static inline void
    HAL_readADCDataWithOffsets(HAL_Handle handle,HAL_ADCData_t *pADCData)
    {
    HAL_Obj *obj = (HAL_Obj *)handle;
    
    float32_t value;
    
    float32_t current_sf = - HAL_getCurrentScaleFactor(handle);   // I Placed the negative sign here
    float32_t voltage_sf = HAL_getVoltageScaleFactor(handle);

    我还仔细检查了 USER_ADC_FULL_SCALE_CURRENT_A、并使用以下公式进行计算

    IFS [A]= 3.3 [V]/(0.005 [V/A]*隔离器增益*差分增益)= 100.88 [A]

    其中:

      隔离器增益= 8.2

      差分增益= 0.79787

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经审阅了您的建议。 尽管如此、我将使用浮动分流电阻器(x3)-这会是问题吗? [/报价]

    您可以尝试首先以 IS03的电压运行电机、并使用数据日志、PWMDAC 或 DAC 来验证电流检测。 确保电流检测正确无误、然后运行 is04实验。

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

    Yanming 您好,感谢您的支持。

    我终于找到了自己的错。 因为在我第一次尝试运行时、我的电机没有完全相同、   is04_signal_chain_test_eabi ,我没有为 R 和 L 提供值

    #define USER_MOTOR_Rr_Ohm                 (NULL)
    #define USER_MOTOR_Rs_Ohm                 (NULL)
    #define USER_MOTOR_Ls_d_H                 (NULL)
    #define USER_MOTOR_Ls_q_H                 (NULL) 

    这会导致所有 KP_ID、 Ki_ID、 KP_IQ 和  Ki_IQ 在 setupControllers () 在 labs.h (虽然它是奇怪的 beacuse 有一个零除法,我认为这是由于浮点滋扰。 因此、PI 控制器的输出一直为零。

        float32_t RdoverLd_rps = Rs_d_Ohm / Ls_d_H;    // RdoverLd_rps is resolving to zero
        float32_t RqoverLq_rps = Rs_q_Ohm / Ls_q_H;    // RqoverLq_rps is resolving to zero
        float32_t BWc_rps = userParams.BWc_rps;
        float32_t currentCtrlPeriod_sec =
                    (float32_t)userParams.numCtrlTicksPerCurrentTick /
                    userParams.ctrlFreq_Hz;
        float32_t outMax_V = userParams.Vd_sf * userParams.maxVsMag_V;
    
        float32_t Kp_Id = Ls_d_H * BWc_rps;
        float32_t Ki_Id = RdoverLd_rps * currentCtrlPeriod_sec;
    
        float32_t Kp_Iq = Ls_q_H * BWc_rps;
        float32_t Ki_Iq = RqoverLq_rps * currentCtrlPeriod_sec;
    

    于是我继续执行  is05_motor_id_eabi 。 这个程序计算 R 和 L 并且现在电机运转平稳。

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

    Yanming 您好,感谢您的支持。

    我终于找到了自己的错。 因为在我第一次尝试运行时、我的电机没有完全相同、   is04_signal_chain_test_eabi ,我没有为 R 和 L 提供值

    #define USER_MOTOR_Rr_Ohm                 (NULL)
    #define USER_MOTOR_Rs_Ohm                 (NULL)
    #define USER_MOTOR_Ls_d_H                 (NULL)
    #define USER_MOTOR_Ls_q_H                 (NULL) 

    这会导致所有 KP_ID、 Ki_ID、 KP_IQ 和  Ki_IQ 在 setupControllers () 在 labs.h (虽然它是奇怪的 beacuse 有一个零除法,我认为这是由于浮点滋扰。 因此、PI 控制器的输出一直为零。

        float32_t RdoverLd_rps = Rs_d_Ohm / Ls_d_H;    // RdoverLd_rps is resolving to zero
        float32_t RqoverLq_rps = Rs_q_Ohm / Ls_q_H;    // RqoverLq_rps is resolving to zero
        float32_t BWc_rps = userParams.BWc_rps;
        float32_t currentCtrlPeriod_sec =
                    (float32_t)userParams.numCtrlTicksPerCurrentTick /
                    userParams.ctrlFreq_Hz;
        float32_t outMax_V = userParams.Vd_sf * userParams.maxVsMag_V;
    
        float32_t Kp_Id = Ls_d_H * BWc_rps;
        float32_t Ki_Id = RdoverLd_rps * currentCtrlPeriod_sec;
    
        float32_t Kp_Iq = Ls_q_H * BWc_rps;
        float32_t Ki_Iq = RqoverLq_rps * currentCtrlPeriod_sec;
    

    于是我继续执行  is05_motor_id_eabi 。 这个程序计算 R 和 L 并且现在电机运转平稳。

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

    好的。 如果有任何进一步的问题、敬请告知。 谢谢!