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.

[参考译文] TMS320F28374S:在 PWM 相移控制下发生异常驱动波形

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1383941/tms320f28374s-abnormal-drive-waveform-occurred-under-pwm-phase-shift-control

器件型号:TMS320F28374S

工具与软件:

 当 CTR = 0时、我们将 DSP1的 EPWM1模块配置为输出 SYNC 信号、这还用于同步另一个芯片(DSP2)的 EPWM1模块。

两个 DSP 芯片都使用向上和向下计数模式、TBPRD 寄存器都是2500。  在向上计数模式下、当 CTR = CMP 时、PWM 的输出设置为低电平、而 在向下计数模式下、当 CTR = CMP 时、输出为高电平。

启用 DSP2芯片的 TBPHS 重新加载、并将相移值 设置为10U 而不是零。

结果发现、当 DSP2的占空比非常小时、它突然输出一个异常正常高电平。 如下信号响应。

从上图可以看出、在中间位置的同步信号到达后、DSP2的 ePWM 计数寄存器应加载为10、并且相应的 TBCTR 应接近零。

理论上、此时的输出 PWM 占空比应约为0、但结果是占空比约为1的高电平 PWM

在论坛上有很多由相移导致的驱动器损耗类似问题、但它们都是在相移动态变化时发生的。

但在我的应用中、EPWM1模块的 TBPHS 值 在 DSP2中是固定的、为10U。

为什么会发生这种情况?  

分析是否是因为如上图所示、假设 TBCMPA 寄存器此时可能为6、TBCTR 寄存器的数据在同步信号出现后将直接从4更新到10、并且上升沿的比较匹配会丢失。

因此、在下降沿的比较与 PWM 拉点匹配之前、才会拉低高电平、从而导致 PWM 高电平输出接近一个周期

我想知道这是不是原因?

测试已看到同步信号、该信号在每个周期都非常稳定、然后每个周期都会触发 DSP2的 EPWM1模块执行相移操作。

所以下次相移信号到来时、计数寄存器应该非常接近设定的 TBPHS 寄存器值? 这样就不能错过这场比赛。

在一个 PWM 周期之后、TBCTR 与理论值有多大差异? 理论上、如果晶体时钟非常稳定、在同步相移操作之后、每次相移信号出现时、计数寄存器的数据和相移寄存器的数据都是相同的。

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

    您好!  

    请注意,由于美国假期,团队中的大多数人都是 ooo 人。 请在接下来的2天内回复。

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

    您好!

    感谢您的耐心等待。 您能否分享两种 ePWM 配置? 对他们来说、行动限定因素是什么? 您是否检查 ePWM 寄存器以确保配置符合基于初始化的预期?  

    具体而言、DSP2上的 ePWM 的设置是什么? 您如何将同步脉冲从 DSP1连接到 DSP2并使用它来改变波形?

    此致、

    Allison

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

    感谢您的答复。

    Chip1的 EPWM1的配置如下。

    EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
    
    EPWM_setTimeBasePeriod(EPWM1_BASE, INV_PWM_PERIOD);
    EPWM_setTimeBaseCounter(EPWM1_BASE, 0U);
    EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN);
    
    EPWM_disablePhaseShiftLoad(EPWM1_BASE);
    EPWM_setPhaseShift(EPWM1_BASE, 0U);
    EPWM_setSyncOutPulseMode(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
    
    EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_PERIOD);
    EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 0);
    
    // Set actions
    EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
    
    EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_RED, false);
    EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_FED, false);
    
    EPWM_disablePhaseShiftLoad(EPWM1_BASE);
    EPWM_setPhaseShift(EPWM1_BASE, 0U);
    EPWM_setSyncOutPulseMode(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
    
    
    SysCtl_setSyncOutputConfig(SYSCTL_SYNC_OUT_SRC_EPWM1SYNCOUT);
    XBAR_setOutputMuxConfig(XBAR_OUTPUT1, XBAR_OUT_MUX14_EXTSYNCOUT);
    XBAR_enableOutputMux(XBAR_OUTPUT1, XBAR_MUX14);
    XBAR_invertOutputSignal(XBAR_OUTPUT1, TRUE);
    GPIO_setPinConfig(GPIO_58_OUTPUTXBAR1);
    

    Chip2的 EPWM1配置如下。

    EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
    
    EPWM_setTimeBasePeriod(EPWM1_BASE, INV_PWM_PERIOD);
    EPWM_setTimeBaseCounter(EPWM1_BASE, 0U);
    EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN);
    
    EPWM_disablePhaseShiftLoad(EPWM1_BASE);
    EPWM_setPhaseShift(EPWM1_BASE, 0U);
    EPWM_setSyncOutPulseMode(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
    
    EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_PERIOD);
    EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 0);
    
    // Set actions
    EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
    
    EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_RED, false);
    EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_FED, false);
    
    EPWM_disablePhaseShiftLoad(EPWM1_BASE);
    EPWM_setPhaseShift(EPWM1_BASE, 0U);
    EPWM_setSyncOutPulseMode(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
    
    
    XBAR_setInputPin(XBAR_INPUT5, 66);
    EPWM_disablePhaseShiftLoad(EPWM1_BASE);
    EPWM_setPhaseShift(EPWM1_BASE, 10U);
    EPWM_setCountModeAfterSync(EPWM1_BASE, EPWM_COUNT_MODE_UP_AFTER_SYNC);
    EPWM_setSyncOutPulseMode(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
    
    EPWM_enablePhaseShiftLoad(EPWM1_BASE);

    同步电源通过 X-BAR 从 GPIO58发出。 它可以从示波器中看到、如上图所示。

    当我将 EPWM_O_TBPHS 的值从10U 更改为0U 时、输出变为正常。 我不知道为什么。

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

    尊敬的 Yue:

    感谢您附加这些配置。 查看这些信息、我想指出的是、如果问题是由于同步脉冲导致某个操作(设置 PWM 为高电平或清除 PWM 为低电平)缺失、则您需要实施软件来执行缺失的操作。 尤其是在使用可变相移时、可能会发生这种情况。 请查看此过去的主题、请告诉我这是否适用于您:

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1312604/tms320f28379d-tms320f28379d-phase-shift-pwm-missing-pulse 

    此致、

    Allison

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

    非常感谢您的答复。

    我在 TBPHS 中使用恒定相移而不是可变相移。 这就是我感到困惑的原因。 是否有其他可能的原因?

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

    尊敬的 Yue:

    每个同步脉冲是否发生了错过的操作?

    即使没有可变相移、如果 AQ 和 TBPHS 和 CMP 值以某种方式对齐(如我在另一线程中所述)、这可能会导致计数器跳过动作限定器事件并丢失它。

    此致、

    Allison

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

    您好、Allson:

    当发生这种缺失操作时、控制系统将触发故障保护。 每次系统启动时、都会触发故障保护、这意味着也会发生该错过的操作。

    当我将 TBPHS 从10U 更改为0U 时、PWM 变为正常。

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

    尊敬的 Yue:

    当 TBCTR < CMPA < TBPHS (或相反)时、错过的操作是否一直有效?  您是否已按照相关主题中的建议尝试实施了 T1和 T2?

    此致、

    Allison