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