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.

TMS320F280049C: 使用峰值电流控制在特定移相角动作异常

Part Number: TMS320F280049C
Other Parts Discussed in Thread: TIDM-02000, SYSCONFIG, PMP23126, C2000WARE

我现在是用F280049做移相全桥的峰值电流控制,参考了TIDM-02000的控制逻辑。使用CMPSS4来作为比较器输出,EPWM1为超前桥臂固定不动,EPWM2为滞后桥臂使用DCEVT来触发2A和2B的动作。

当前测试为,在CMPSS4的DCA使用斜坡发生器来进行DAC输出电压的下降。使用信号发生器在B4口固定输入一个电压,通过调节这个电压应该能够得到不同的输出移相角。

发现在特定输入电压的情况下会发生动作异常,如下图,其中黄色为EPWM1A,绿色为EPWM2A,可以看到出现了一个窄脉冲出现比较频繁(当前输入为615mV)由于驱动是使用变压器进行隔离,这个情况多次出现会导致Mos驱动电压异常,导致控制异常。

在实际使用峰值电流运行时候同样会出现这样的问题。请问是配置上有问题,还是芯片逻辑出现异常?

当前配置用的sysconfig文件如附件。

  • /**
     * These arguments were used when this file was generated. They will be automatically applied on subsequent loads
     * via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments.
     * @cliArgs --device "F28004x" --part "F28004x_100PZ" --package "F28004x_100PZ" --context "system" --product "C2000WARE@5.04.00.00"
     * @v2CliArgs --device "TMS320F280041C" --package "100PZ" --context "system" --product "C2000WARE@5.04.00.00"
     * @versions {"tool":"1.21.0+3721"}
     */
    
    /**
     * Import the modules used in this configuration.
     */
    const cmpss            = scripting.addModule("/driverlib/cmpss.js", {}, false);
    const cmpss1           = cmpss.addInstance();
    const epwm             = scripting.addModule("/driverlib/epwm.js", {}, false);
    const epwm1            = epwm.addInstance();
    const epwm2            = epwm.addInstance();
    const epwm3            = epwm.addInstance();
    const epwmxbar         = scripting.addModule("/driverlib/epwmxbar.js", {}, false);
    const epwmxbar1        = epwmxbar.addInstance();
    const gpio             = scripting.addModule("/driverlib/gpio.js", {}, false);
    const gpio1            = gpio.addInstance();
    const inputxbar_input  = scripting.addModule("/driverlib/inputxbar_input.js", {}, false);
    const inputxbar_input1 = inputxbar_input.addInstance();
    const outputxbar       = scripting.addModule("/driverlib/outputxbar.js", {}, false);
    const outputxbar1      = outputxbar.addInstance();
    
    /**
     * Write custom configuration values to the imported modules.
     */
    cmpss1.$name           = "myCMPSS0";
    cmpss1.cmpssBase       = "CMPSS4_BASE";
    cmpss1.dacValHigh      = 1024;
    cmpss1.latchResetHigh  = true;
    cmpss1.configLatchHigh = true;
    cmpss1.configBlanking  = "2";
    cmpss1.enableBlanking  = true;
    cmpss1.dacValSource    = "CMPSS_DACSRC_RAMP";
    cmpss1.enableModule    = true;
    cmpss1.ramDecVal       = 10;
    cmpss1.pwmSyncSrc      = "4";
    cmpss1.maxRampVal      = 16000;
    cmpss1.dacValLoad      = "CMPSS_DACVAL_PWMSYNC";
    
    epwm1.$name                                                           = "myEPWM0";
    epwm1.epwmTimebase_periodGld                                          = true;
    epwm1.epwmTimebase_counterMode                                        = "EPWM_COUNTER_MODE_UP_DOWN";
    epwm1.epwmTimebase_counterModeAfterSync                               = "EPWM_COUNT_MODE_UP_AFTER_SYNC";
    epwm1.epwmTimebase_syncOutPulseMode                                   = "EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO";
    epwm1.epwmDeadband_inputFED                                           = "EPWM_DB_INPUT_EPWMB";
    epwm1.epwmDeadband_redShadowLoadEvent                                 = "EPWM_RED_LOAD_ON_CNTR_ZERO_PERIOD";
    epwm1.epwmDeadband_delayRED                                           = 50;
    epwm1.epwmDeadband_fedShadowLoadEvent                                 = "EPWM_FED_LOAD_ON_CNTR_ZERO_PERIOD";
    epwm1.epwmDeadband_delayFED                                           = 50;
    epwm1.epwmDigitalCompare_EPWM_DC_TYPE_DCAH                            = "EPWM_DC_TRIP_TRIPIN5";
    epwm1.epwmDigitalCompare_dcFilterInput                                = "EPWM_DC_WINDOW_SOURCE_DCAEVT2";
    epwm1.epwmTimebase_hsClockDiv                                         = "EPWM_HSCLOCK_DIVIDER_1";
    epwm1.epwmTripZone_cbcPulse                                           = "EPWM_TZ_CBC_PULSE_CLR_CNTR_ZERO_PERIOD";
    epwm1.epwmDigitalCompare_EPWM_DC_MODULE_A_EPWM_DC_EVENT_1_eventSync   = "EPWM_DC_EVENT_INPUT_NOT_SYNCED";
    epwm1.epwmDigitalCompare_EPWM_DC_MODULE_A_EPWM_DC_EVENT_2_eventSync   = "EPWM_DC_EVENT_INPUT_NOT_SYNCED";
    epwm1.epwmDigitalCompare_EPWM_TZ_DC_OUTPUT_A2                         = "EPWM_TZ_EVENT_DCXH_HIGH";
    epwm1.epwmTripZone_cbcSource                                          = ["EPWM_TZ_SIGNAL_DCAEVT2","EPWM_TZ_SIGNAL_DCBEVT2"];
    epwm1.epwmDigitalCompare_EPWM_DC_MODULE_A_EPWM_DC_EVENT_2_eventSource = "EPWM_DC_EVENT_SOURCE_FILT_SIGNAL";
    epwm1.epwmActionQualifier_t2Source                                    = "EPWM_AQ_TRIGGER_EVENT_TRIG_DC_EVTFILT";
    epwm1.epwmDigitalCompare_useBlankingWindow                            = true;
    epwm1.epwmDigitalCompare_blankingWindowEvent                          = "EPWM_DC_WINDOW_START_TBCTR_ZERO_PERIOD";
    epwm1.epwmTimebase_phaseEnable                                        = true;
    epwm1.epwmDeadband_polarityFED                                        = "EPWM_DB_POLARITY_ACTIVE_LOW";
    epwm1.hrpwm_syncSource                                                = "HRPWM_PWMSYNC_SOURCE_ZERO";
    epwm1.epwmTripZone_EPWM_TZ_ACTION_EVENT_DCAEVT2                       = "EPWM_TZ_ACTION_DISABLE";
    epwm1.epwmTripZone_EPWM_TZ_ACTION_EVENT_DCBEVT2                       = "EPWM_TZ_ACTION_DISABLE";
    epwm1.epwmDeadband_enableRED                                          = true;
    epwm1.epwmDeadband_redShadowMode                                      = true;
    epwm1.epwmDeadband_enableFED                                          = true;
    epwm1.epwmDeadband_fedShadowMode                                      = true;
    epwm1.epwmTimebase_phaseShift                                         = 2;
    epwm1.epwmTimebase_counterValue                                       = 2;
    epwm1.epwmDigitalCompare_blankingWindowOffset                         = 490;
    epwm1.epwmDigitalCompare_blankingWindowLength                         = 20;
    epwm1.epwmActionQualifier_t1Source                                    = "EPWM_AQ_TRIGGER_EVENT_TRIG_DC_EVTFILT";
    epwm1.epwmTripZone_EPWM_TZ_ACTION_EVENT_TZB                           = "EPWM_TZ_ACTION_DISABLE";
    epwm1.epwmTripZone_EPWM_TZ_ACTION_EVENT_TZA                           = "EPWM_TZ_ACTION_DISABLE";
    epwm1.epwmTripZone_EPWM_TZ_ACTION_EVENT_DCAEVT1                       = "EPWM_TZ_ACTION_LOW";
    epwm1.epwmTripZone_EPWM_TZ_ACTION_EVENT_DCBEVT1                       = "EPWM_TZ_ACTION_LOW";
    epwm1.epwmDigitalCompare_EPWM_TZ_DC_OUTPUT_B1                         = "EPWM_TZ_EVENT_DCXL_LOW";
    epwm1.epwmDigitalCompare_EPWM_DC_MODULE_B_EPWM_DC_EVENT_1_eventSync   = "EPWM_DC_EVENT_INPUT_NOT_SYNCED";
    epwm1.epwmDigitalCompare_EPWM_DC_MODULE_B_EPWM_DC_EVENT_2_eventSync   = "EPWM_DC_EVENT_INPUT_NOT_SYNCED";
    epwm1.epwmTripZone_oneShotSource                                      = ["EPWM_TZ_SIGNAL_DCAEVT1","EPWM_TZ_SIGNAL_DCBEVT1","EPWM_TZ_SIGNAL_OSHT1"];
    epwm1.epwmDigitalCompare_EPWM_TZ_DC_OUTPUT_A1                         = "EPWM_TZ_EVENT_DCXL_LOW";
    epwm1.epwmActionQualifier_EPWM_AQ_OUTPUT_A_ON_TIMEBASE_ZERO           = "EPWM_AQ_OUTPUT_HIGH";
    epwm1.epwmActionQualifier_EPWM_AQ_OUTPUT_A_ON_TIMEBASE_PERIOD         = "EPWM_AQ_OUTPUT_LOW";
    epwm1.epwmActionQualifier_EPWM_AQ_OUTPUT_A_ON_T2_COUNT_UP             = "EPWM_AQ_OUTPUT_LOW";
    epwm1.epwmActionQualifier_EPWM_AQ_OUTPUT_A_ON_T2_COUNT_DOWN           = "EPWM_AQ_OUTPUT_HIGH";
    epwm1.epwmActionQualifier_EPWM_AQ_OUTPUT_B_ON_TIMEBASE_ZERO           = "EPWM_AQ_OUTPUT_HIGH";
    epwm1.epwmActionQualifier_EPWM_AQ_OUTPUT_B_ON_TIMEBASE_PERIOD         = "EPWM_AQ_OUTPUT_LOW";
    epwm1.epwmActionQualifier_EPWM_AQ_OUTPUT_B_ON_T2_COUNT_UP             = "EPWM_AQ_OUTPUT_LOW";
    epwm1.epwmActionQualifier_EPWM_AQ_OUTPUT_B_ON_T2_COUNT_DOWN           = "EPWM_AQ_OUTPUT_HIGH";
    epwm1.epwmTimebase_period                                             = 500;
    epwm1.epwm.$assign                                                    = "EPWM2";
    epwm1.epwm.epwm_aPin.$assign                                          = "GPIO2";
    epwm1.epwm.epwm_bPin.$assign                                          = "GPIO3";
    
    epwm2.$name                                                   = "myEPWM1";
    epwm2.epwmTimebase_hsClockDiv                                 = "EPWM_HSCLOCK_DIVIDER_1";
    epwm2.epwmTimebase_period                                     = 500;
    epwm2.epwmTimebase_counterMode                                = "EPWM_COUNTER_MODE_UP_DOWN";
    epwm2.epwmTimebase_forceSyncPulse                             = true;
    epwm2.epwmTimebase_syncOutPulseMode                           = "EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO";
    epwm2.hrpwm_syncSource                                        = "HRPWM_PWMSYNC_SOURCE_ZERO";
    epwm2.epwmActionQualifier_EPWM_AQ_OUTPUT_A_ON_TIMEBASE_ZERO   = "EPWM_AQ_OUTPUT_HIGH";
    epwm2.epwmActionQualifier_EPWM_AQ_OUTPUT_A_ON_TIMEBASE_PERIOD = "EPWM_AQ_OUTPUT_LOW";
    epwm2.epwmActionQualifier_EPWM_AQ_OUTPUT_B_ON_TIMEBASE_ZERO   = "EPWM_AQ_OUTPUT_HIGH";
    epwm2.epwmActionQualifier_EPWM_AQ_OUTPUT_B_ON_TIMEBASE_PERIOD = "EPWM_AQ_OUTPUT_LOW";
    epwm2.epwmDeadband_inputFED                                   = "EPWM_DB_INPUT_EPWMB";
    epwm2.epwmDeadband_polarityFED                                = "EPWM_DB_POLARITY_ACTIVE_LOW";
    epwm2.epwmDeadband_enableRED                                  = true;
    epwm2.epwmDeadband_redShadowMode                              = true;
    epwm2.epwmDeadband_delayRED                                   = 50;
    epwm2.epwmDeadband_delayFED                                   = 50;
    epwm2.epwmDeadband_fedShadowMode                              = true;
    epwm2.epwmDeadband_enableFED                                  = true;
    epwm2.epwmTripZone_oneShotSource                              = ["EPWM_TZ_SIGNAL_OSHT1"];
    epwm2.epwmTripZone_EPWM_TZ_ACTION_EVENT_TZA                   = "EPWM_TZ_ACTION_LOW";
    epwm2.epwmTripZone_EPWM_TZ_ACTION_EVENT_TZB                   = "EPWM_TZ_ACTION_LOW";
    epwm2.epwm.$assign                                            = "EPWM1";
    epwm2.epwm.epwm_aPin.$assign                                  = "GPIO0";
    epwm2.epwm.epwm_bPin.$assign                                  = "GPIO1";
    
    epwm3.$name                             = "myEPWM2";
    epwm3.epwmTimebase_hsClockDiv           = "EPWM_HSCLOCK_DIVIDER_1";
    epwm3.epwmTimebase_period               = 250;
    epwm3.epwmTimebase_counterMode          = "EPWM_COUNTER_MODE_UP_DOWN";
    epwm3.hrpwm_syncSource                  = "HRPWM_PWMSYNC_SOURCE_ZERO";
    epwm3.epwmTimebase_counterModeAfterSync = "EPWM_COUNT_MODE_UP_AFTER_SYNC";
    epwm3.epwmTimebase_phaseEnable          = true;
    epwm3.epwm.$assign                      = "EPWM4";
    
    epwmxbar1.$name     = "myEPWMXBAR0";
    epwmxbar1.tripInput = "XBAR_TRIP5";
    epwmxbar1.muxesUsed = ["XBAR_MUX06"];
    
    gpio1.$name           = "myGPIO0";
    gpio1.gpioPin.$assign = "GPIO9";
    
    inputxbar_input1.$name         = "myINPUTXBARINPUT0";
    inputxbar_input1.inputxbarGpio = "GPIO9";
    
    outputxbar1.$name                            = "myOUTPUTXBAR0";
    outputxbar1.muxesUsed                        = ["XBAR_MUX06"];
    outputxbar1.outputxbar.outputxbarPin.$assign = "GPIO31";
    
    /**
     * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future
     * version of the tool will not impact the pinmux you originally saw.  These lines can be completely deleted in order to
     * re-solve from scratch.
     */
    epwm3.epwm.epwm_aPin.$suggestSolution   = "GPIO6";
    epwm3.epwm.epwm_bPin.$suggestSolution   = "GPIO7";
    outputxbar1.outputxbar.$suggestSolution = "OUTPUTXBAR8";

  • 您好,

    已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 我发现您为此逻辑设置的配置没有问题。 我对您的测试设置有几个问题。

    1.我看到你已经在ePWM1中设置了空白窗口偏移和长度,它以固定频率运行。 如果在ePWM2上发生CBC跳闸,为什么在epwm2中不应用此设置?

    2.此外,您是否确保所有这些ePWM1,ePWM2和CMPSSDACRAMP(递减)都与ePWM4同步? 如果未同步,则可能是问题所在。

    3.您是否尝试更改斜坡值(cmpss1.ramDecVal)以查看此振荡消失? 尝试为斜坡输入激进值,以查看振荡是否消失。

    4.此外,您有没有看过我们更新的参考设计。 其中,使用ePWM生成同步源,具有UP计数模式。 您还可以尝试研究PMP23126实现的逻辑。 您可以在C2000Ware_DigitalPower_SDK中找到软件用户指南:C:\ti\C2000\C2000Ware_DigitalPower_SDK_5_xx_xx_xx\solutions\pmp23126\docs

  • 1、ePWM1确实是以固定频率运行,ePWM2为完了移相的目的使用EVT2的CBC事件来触发移相动作,这是参考TMDI02000中做的配置。

    2、ePWM1和ePWM2与ePWM4是基本同步的,在仿真中测试过。
    3、修改斜坡下降速度并不影响异常动作的情况,这似乎是出现在移相角十分大的情况下出现的问题。

    另外我会去参考一下新的设计。

  • 请查看参考设计。 从参考设计指南图3看来,引线和滞后阶段均处于向上计数器模式,用于内部同步的ePWM5仅处于向上计数模式。 使用此方案时,频率会自动与SYNC事件加倍。 避免电感器电流不匹配,从而避免变压器饱和。