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.

[参考译文] AM2612:为什么 PWM 生成的 PWMA 和 PWMB 总是在时序结束时有随机重叠的高位部分?

Guru**** 2513185 points
Other Parts Discussed in Thread: AM2612

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1533314/am2612-why-do-pwma-and-pwmb-generated-by-pwm-always-have-random-overlapping-high-parts-at-the-end-of-timing

器件型号:AM2612


工具/软件:

尊敬的 TI 专家:

我们现在使用 AM2612 r5f 4 通道 PWM 模块与高速继电器输出配合使用。

我们希望在 GPIO 输出上的指定时间段内生成 PWMA&B 脉冲被闭合或断开、并且   PWMA 和 PWMB 的波形完全反转。

现在波形有一个像下图所示的问题:黄色是 PWMA、蓝色是 PWMB。 当计时器时钟超时时、存在随机重叠的高电平部分、这是不允许的。

但我不知道如何防止它。

请找到 example.syscfg 文件的附件。

e2e.ti.com/.../7206.example.syscfg.txt

STOP PWM 的计时器时钟功能代码如下所示:

void PWMTimerCb (ClockP_Object *clkInst、void *arg)

uint32_t temp =(int) arg;

CNT ++;
如果是 1
/*如果 EnableMask = 1&DisableMask = 1、则设置 PWM 禁用*/
IF (temp & 1)

EPWM_setActionQualifierAction (HSHB1_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_LOW、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setDeadBandDelayPolarity (HSHB1_BASE_ADDR、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_HIGH);
EPWM_setActionQualifierAction (HSHB1_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_LOW、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
}
IF (temp & 2)

EPWM_setActionQualifierAction (HSHB2_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_LOW、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setDeadBandDelayPolarity (HSHB2_BASE_ADDR、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_HIGH);
EPWM_setActionQualifierAction (HSHB2_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_LOW、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
}
IF (temp & 4)

EPWM_setActionQualifierAction (HSHB3_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_LOW、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setDeadBandDelayPolarity (HSHB3_BASE_ADDR、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_HIGH);
EPWM_setActionQualifierAction (HSHB3_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_LOW、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
}
IF (temp & 8)

EPWM_setActionQualifierAction (HSHB4_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_LOW、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setDeadBandDelayPolarity (HSHB4_BASE_ADDR、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_HIGH);
EPWM_setActionQualifierAction (HSHB4_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_LOW、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
}
#endif
}

PWM 启动代码:

if( j == 0 )

EPWM_setActionQualifierAction (HSHB1_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_HIGH、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction (HSHB1_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_HIGH、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setDeadBandDelayPolarity (HSHB1_BASE_ADDR、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_LOW);
}
else if( j ==1 )

EPWM_setActionQualifierAction (HSHB2_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_HIGH、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction (HSHB2_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_HIGH、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setDeadBandDelayPolarity (HSHB2_BASE_ADDR、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_LOW);
}
else if( j == 2 )

EPWM_setActionQualifierAction (HSHB3_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_HIGH、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction (HSHB3_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_HIGH、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setDeadBandDelayPolarity (HSHB3_BASE_ADDR、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_LOW);
}
else if( j == 3)

EPWM_setActionQualifierAction (HSHB4_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_OUTPUT_HIGH、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction (HSHB4_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_HIGH、EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setDeadBandDelayPolarity (HSHB4_BASE_ADDR、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_LOW);
}
}

此致、

Ly

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

    嗨、Yang

    您只是希望两个 PWM 相互反相、还是其他要求? 它们是需要相互依赖、还是我们可以展示上面单独控制两个 PWM 的场景?

    此致、
    阿克什特

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

    您好、Akshit、

    是的、我们希望两个 PWM 相互反相。 除此之外、PWMA 和 B 之间还需要约 10%的死区

    禁止同时将 PWMA 和 B 设置为高电平。

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

    感谢您的信息、我正在尝试重现并获取您的设置的运行实例。

    让我快速地回到您身边、介绍一些实用的设计和代码。

    感谢您的耐心!

    此致、
    阿克什特

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

    嗨、Yang

    [报价 userid=“626411" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1533314/am2612-why-do-pwma-and-pwmb-generated-by-pwm-always-have-random-overlapping-high-parts-at-the-end-of-timing/5900486 #5900486“]

    我们希望两个 PWM 能够相互反相。 除此之外、PWMA 和 B 之间还需要约 10%的死区

    禁止同时将 PWMA 和 B 设置为高电平。

    [/报价]

    PFA CCS 项目、用于复制 AM261x-LP 上的要求

    e2e.ti.com/.../empty_5F00_am261x_2D00_lp_5F00_r5fss0_2D00_0_5F00_nortos_5F00_ti_2D00_arm_2D00_clang.zip

    此程序将输出以下内容:

    我们可以看到、两个 PWM 在互斥时间处于高电平有效、每个时间之间具有 10%的死区。

    此致、
    阿克什特

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

    现在的问题不是如何生成正确的 PWM 波形、而是如何在不产生 PWMA 和 PWMB 同时处于高电平的波形的情况下正确停止 PWM。

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

    明白了!

    在同一示例中、您可以看到我使用了

    SoC_setMultipleEpwmTbClk (gEpwmTbClkSyncEnableMaskfalse);

    来选通 TBCLK、然后使用了

    /*在配置完成后取消 EPWM 时钟门控*/
    SoC_setMultipleEpwmTbClk (gEpwmTbClkSyncEnableMasktrue);

    为了取消选通 TBCLK、我刚刚修改了此示例、使其运行 10 秒、然后选通时钟以停止 PWM、如下所示:

    /*对配置的 EPWM 时钟进行门控*/
    SoC_setMultipleEpwmTbClk (gEpwmTbClkSyncEnableMaskfalse);

    EPWM_setTimeBaseCounter (gEpwmBaseAddr0);

    EPWM_setTimeBaseCounterMode (gEpwmBaseAddr、EPWM_COUNTER_MODE_UP);

    /*在配置完成后取消 EPWM 时钟门控*/
    SoC_setMultipleEpwmTbClk (gEpwmTbClkSyncEnableMasktrue);

    ClockP_SLEEP (10);

    SoC_setMultipleEpwmTbClk (gEpwmTbClkSyncEnableMaskfalse);

    这为我提供了以下输出、可以满足您的要求

    此 API 修改以下寄存器:

    此致、
    阿克什特

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

    谢谢!

    在 PWM 编码开始时、我认为  SOC_setMultipleEpwmTbClk () 是 PWM 函数开关。  

    只要在 syscfg 中正确完成配置、将 SOC_setMultipleEpwmTbClk 设置为 1 便会启动该配置、将其设置为 0 则会将其关闭。 当 PWM 停止时、PWMA&B 应该为低电平。

    但实际上不是。 与通道 0 和 1 的图片一样、当 PWM 停止时、通道 0 为高电平。

    然后、我必须通过调用 EPWM_setActionQualifierContSWForceAction (low)、在 PWM 停止之前将 PWMA&B 强制为低电平;

    然后会出现问题、但不是 100%。

    您能否请尝试在 PWM 停止后将 PWMA&B 保持在低电平?

    • 将 PWM1 配置为 EPWM3、将 PWM2 配置为 EPWM2、将 PWM3 配置为 EPWM1、将 PWM4 配置为 EPWM0。
    • 逐个停止 PWM1、2、3、4。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我对代码做了一些修改、

    /*对配置的 EPWM 时钟进行门控*/
    SoC_setMultipleEpwmTbClk (gEpwmTbClkSyncEnableMaskfalse);

    EPWM_setTimeBaseCounter (gEpwmBaseAddr0);

    EPWM_setTimeBaseCounterMode (gEpwmBaseAddr、EPWM_COUNTER_MODE_UP);

    /*在配置完成后取消 EPWM 时钟门控*/
    SoC_setMultipleEpwmTbClk (gEpwmTbClkSyncEnableMasktrue);

    ClockP_SLEEP (5);

    EPWM_setDeadBandDelayPolarity (gEpwmBaseAddr、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_LOW);
    EPWM_setDeadBandDelayPolarity (gEpwmBaseAddr、EPWM_DB_RED、EPWM_DB_POLARITY_ACTIVE_LOW);

    /*使用连续软件强制操作强制两个 PWM 输出为低电平*/
    EPWM_setActionQualifierContSWForceAction_opt_outputs (gEpwmBaseAddr、EPWM_AQ_A_SW_OUTPUT_LOW_B_SW_OUTPUT_LOW);

    SoC_setMultipleEpwmTbClk (gEpwmTbClkSyncEnableMaskfalse);

    死区设置为低电平有效互补、因此我们需要更改它以使两个通道都处于低电平。 确保先更换进给。 这使我能够在多次运行时获得以下输出:

    如果这样可以解决您的问题、请告诉我!

    此致、
    阿克什特

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

    typedef 枚举

    EPWM_DB_POLARITY_ACTIVE_HIGH = 0、//!< DB 极性不反转
    EPWM_DB_POLARITY_ACTIVE_LOW = 1 //!< DB 极性反转
    } EPWM_DeadBandPolarity;

    是否应该将 EPWM_setDeadBandDelayPolarity 设置为高电平以使 DB 极性不反转?  

    我将 EPWM_setDeadBandDelayPolarity 设置 为低电平以在 PWM 启动之前使 DB 极性反转。

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

    在我的代码中、初始配置如下:

    /*死区*/
    EPWM_disableDeadBandControlShadowLoadMode (CONFIG_EPWM0_BASE_ADDR);
    EPWM_setDeadBandControlShadowLoadMode (CONFIG_EPWM0_BASE_ADDR、EPWM_DB_LOAD_ON_CNTR_ZERO);
    EPWM_setRisingEdgeDeadBandDelayInput (CONFIG_EPWM0_BASE_ADDR、EPWM_DB_INPUT_EPWMA);
    EPWM_setFallingEdgeDeadBandDelayInput (CONFIG_EPWM0_BASE_ADDR、EPWM_DB_INPUT_EPWMA);
    EPWM_setDeadBandDelayPolarity (CONFIG_EPWM0_BASE_ADDR、EPWM_DB_RED、EPWM_DB_POLARITY_ACTIVE_HIGH);
    EPWM_setDeadBandDelayPolarity (CONFIG_EPWM0_BASE_ADDR、EPWM_DB_FEDEPWM_DB_POLARITY_ACTIVE_LOW);
    EPWM_setDeadBandDelayMode (CONFIG_EPWM0_BASE_ADDREPWM_DB_REDTRUE);
    EPWM_setDeadBandDelayMode (CONFIG_EPWM0_BASE_ADDR、EPWM_DB_FEDTRUE);
    EPWM_setDeadBandOutputSwapMode (CONFIG_EPWM0_BASE_ADDR、EPWM_DB_OUTPUT_A、FALSE);
    EPWM_setDeadBandOutputSwapMode (CONFIG_EPWM0_BASE_ADDREPWM_DB_OUTPUT_B、FALSE);

    因此、按如下方式修改代码也可以得到正确的输出:

    /*对配置的 EPWM 时钟进行门控*/
    SoC_setMultipleEpwmTbClk (gEpwmTbClkSyncEnableMaskfalse);

    EPWM_setTimeBaseCounter (gEpwmBaseAddr0);

    EPWM_setTimeBaseCounterMode (gEpwmBaseAddr、EPWM_COUNTER_MODE_UP);

    /*在配置完成后取消 EPWM 时钟门控*/
    SoC_setMultipleEpwmTbClk (gEpwmTbClkSyncEnableMasktrue);

    ClockP_SLEEP (5);

    // EPWM_setDeadBandDelayPolarity (gEpwmBaseAddr、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_LOW);
    EPWM_setDeadBandDelayPolarity (gEpwmBaseAddr、EPWM_DB_RED、EPWM_DB_POLARITY_ACTIVE_LOW);

    /*使用连续软件强制操作强制两个 PWM 输出为低电平*/
    EPWM_setActionQualifierContSWForceAction_opt_outputs (gEpwmBaseAddr、EPWM_AQ_A_SW_OUTPUT_LOW_B_SW_OUTPUT_LOW);

    SoC_setMultipleEpwmTbClk (gEpwmTbClkSyncEnableMaskfalse);

    此致、
    阿克什特

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

    是的、这一次您是对的。 我的原始 PWM 设置和停止与您的设置和停止相同。 PWM 停止没有问题、但存在另一个问题。  

    有时、当 PWM 启动时、PWMA&B 都为高电平。 为了解决这个问题,我更改了代码以 调用  EPWM_setActionQualifierAction ()。

    不管它是如何修改的,无论是在开始还是结束,总是会有一个情况下, PTMWA 和 B 同时处于高电平。

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

    在我与您分享的代码中、我无法在跑步过程中的任何时候看到它们同时处于高位!

    EPWM_setActionQualiffierAction ()。

    问题的根本原因似乎是用于从该PWMTimerCb函数中启动和停止 PWM 输出的方法、当前代码会  动态修改 ePWM 的动作限定器 (AQ) 设置以控制 PWM 输出状态

    EPWM_setActionQualifierAction (HSHB1_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_OUTPUT_LOW、...);

    这种方法很可能会创造 竞争条件。 计时器中断与 ePWM 的 TBCTR 异步。 当 C 代码执行时、它可能会在 PWM 周期内的随机点更改 PWM 生成逻辑。 这可能会导致不可预测的状态、包括您在示波器上观察到的短暂、重叠的高电平周期。

    与使用计时器和 AQ 设置相比、正确使用死区模块来生成互补波形并通过启动或停止 ePWM TBCLK 来控制 PWM 是一种更好的方法。

    此致、
    阿克什特

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

    感谢您对患者的回应。

    我展示了之前使用死区模块处理 PWM 启动和停止的代码。 通过代码、PWM 将始终在 PWM 波形开始时生成一个预脉冲、这也是不允许的。 注意:PWM 启动和停止将在代码运行期间重复。

    我发现我和您的 SDK 之间有一些区别,例如  DeadBandDelayPolarity 逻辑是反向的。  

    对于 EPWM_setActionQualifierContSWForceAction_opt_outputs、可以在一条命令中同时设置 A&B、但我只能分两步执行它。

    我认为 AM2612 字符可能与您的不同。

    PWM 启动:

    if( j == 0 )

    EPWM_setActionQualifierContSWForceAction (HSHB1_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_SW_DISABLED);
    EPWM_setActionQualifierContSWForceAction (HSHB1_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_SW_DISABLED);
    EPWM_setDeadBandDelayPolarity (HSHB1_BASE_ADDR、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_LOW);
    SoC_setMultipleEpwmTbClk (1、true);
    }
    else if( j ==1 )

    EPWM_setDeadBandDelayPolarity (HSHB2_BASE_ADDR、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_LOW);
    EPWM_setActionQualifierContSWForceAction (HSHB2_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_SW_DISABLED);
    EPWM_setActionQualifierContSWForceAction (HSHB2_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_SW_DISABLED);
    SoC_setMultipleEpwmTbClk (2、true);
    }
    else if( j == 2 )

    EPWM_setDeadBandDelayPolarity (HSHB3_BASE_ADDR、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_LOW);
    EPWM_setActionQualifierContSWForceAction (HSHB3_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_SW_DISABLED);
    EPWM_setActionQualifierContSWForceAction (HSHB3_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_SW_DISABLED);
    SoC_setMultipleEpwmTbClk (4、true);
    }
    else if( j == 3)

    EPWM_setDeadBandDelayPolarity (HSHB4_BASE_ADDR、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_LOW);
    EPWM_setActionQualifierContSWForceAction (HSHB4_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_SW_DISABLED);
    EPWM_setActionQualifierContSWForceAction (HSHB4_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_SW_DISABLED);
    SoC_setMultipleEpwmTbClk (8、true);
    }

    PWM 停止:

    void PWMTimerCb (ClockP_Object *clkInst、void *arg)

    uint32_t temp =(int) arg;

    /*如果 EnableMask = 1&DisableMask = 1、则设置 PWM 禁用*/
    IF (temp & 1)

    EPWM_setDeadBandDelayPolarity (HSHB1_BASE_ADDR、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_HIGH);
    EPWM_setActionQualifierContSWForceAction (HSHB1_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_SW_OUTPUT_LOW);
    EPWM_setActionQualifierContSWForceAction (HSHB1_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_SW_OUTPUT_LOW);
    }
    IF (temp & 2)

    EPWM_setDeadBandDelayPolarity (HSHB2_BASE_ADDR、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_HIGH);
    EPWM_setActionQualifierContSWForceAction (HSHB2_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_SW_OUTPUT_LOW);
    EPWM_setActionQualifierContSWForceAction (HSHB2_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_SW_OUTPUT_LOW);
    }
    IF (temp & 4)

    EPWM_setDeadBandDelayPolarity (HSHB3_BASE_ADDR、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_HIGH);
    EPWM_setActionQualifierContSWForceAction (HSHB3_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_SW_OUTPUT_LOW);
    EPWM_setActionQualifierContSWForceAction (HSHB3_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_SW_OUTPUT_LOW);
    }
    IF (temp & 8)

    EPWM_setDeadBandDelayPolarity (HSHB4_BASE_ADDR、EPWM_DB_FED、EPWM_DB_POLARITY_ACTIVE_HIGH);
    EPWM_setActionQualifierContSWForceAction (HSHB4_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_SW_OUTPUT_LOW);
    EPWM_setActionQualifierContSWForceAction (HSHB4_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_SW_OUTPUT_LOW);
    }
    SoC_setMultipleEpwmTbClk (temp、false);
    }

    蓝色是 PTMW B、黄色是 PTMW A

     e2e.ti.com/.../4353.example.syscfg.txt

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

    嗨、Yang

    对延误表示歉意、您是否在这个问题上取得了一些进展?
    我会将其分配给软件专家以获得更多帮助。

    此致、
    阿克什特

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

    您好、Akshit、

    无论如何、我无法使用死区模块机制正确控制 PWM 的启动和停止。

    最后、 通过强制禁用 AQ 输出或为低电平来启动或停止 PWM 输出波形。

    在测试过程中、仍然存在问题:

    首先、我配置了通道 1-EPWM3、2-EPWM2、3-EPWM1、4-EPWM0、、我发现通道 1 和 2 PWM 输出是正确的、但 3 和 4 PWM 输出有时会异常保持高电平。

    然后、我更改了 syscfg 中的通道序列:Channel1-EPWM0、2-EPWM1、3-EPWM2、4-EPWM3、所有通道 PWM 输出均正确。

    我不知道为什么。 似乎对不同 ePWM 通道的操作序列有所影响。

    请找到 example.syscfg 的附件

    e2e.ti.com/.../2870.example.syscfg.txt

    PWM 启动代码:

    /*软件强制禁用*/
    if( j == 0 )

    EPWM_setActionQualifierContSWForceAction (HSHB1_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_SW_DISABLED);
    EPWM_setActionQualifierContSWForceAction (HSHB1_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_SW_DISABLED);
    SoC_setMultipleEpwmTbClk (1、true);
    }
    else if( j ==1 )

    EPWM_setActionQualifierContSWForceAction (HSHB2_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_SW_DISABLED);
    EPWM_setActionQualifierContSWForceAction (HSHB2_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_SW_DISABLED);
    SoC_setMultipleEpwmTbClk (2、true);
    }
    else if( j == 2 )

    EPWM_setActionQualifierContSWForceAction (HSHB3_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_SW_DISABLED);
    EPWM_setActionQualifierContSWForceAction (HSHB3_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_SW_DISABLED);
    SoC_setMultipleEpwmTbClk (4、true);
    }
    else if( j == 3)

    EPWM_setActionQualifierContSWForceAction (HSHB4_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_SW_DISABLED);
    EPWM_setActionQualifierContSWForceAction (HSHB4_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_SW_DISABLED);
    SoC_setMultipleEpwmTbClk (8、true);
    }

    PWM 停止代码:

    void PWMTimerCb (ClockP_Object *clkInst、void *arg)

    uint32_t temp =(int) arg;
    IF (temp & 1)

    EPWM_setActionQualifierContSWForceAction (HSHB1_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_SW_OUTPUT_LOW);
    EPWM_setActionQualifierContSWForceAction (HSHB1_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_SW_OUTPUT_LOW);
    }
    IF (temp & 2)

    EPWM_setActionQualifierContSWForceAction (HSHB2_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_SW_OUTPUT_LOW);
    EPWM_setActionQualifierContSWForceAction (HSHB2_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_SW_OUTPUT_LOW);
    }
    IF (temp & 4)

    EPWM_setActionQualifierContSWForceAction (HSHB3_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_SW_OUTPUT_LOW);
    EPWM_setActionQualifierContSWForceAction (HSHB3_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_SW_OUTPUT_LOW);
    CNT ++;

    }
    IF (temp & 8)

    EPWM_setActionQualifierContSWForceAction (HSHB4_BASE_ADDR、EPWM_AQ_OUTPUT_A、EPWM_AQ_SW_OUTPUT_LOW);
    EPWM_setActionQualifierContSWForceAction (HSHB4_BASE_ADDR、EPWM_AQ_OUTPUT_B、EPWM_AQ_SW_OUTPUT_LOW);
    }

    SoC_setMultipleEpwmTbClk (temp、false);

    }

    此致、

    Ly

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

    尊敬的 Yang:

    感谢您的耐心,我们的专家在这个线程是不在办公室。 我们可以继续、快速解决问题。

    启动/停止方法取决于 AQ 连续软件强制和针对 ePWM TBCLK 门控。 没关系、但只有当所有 ePWM 模块针对 AQ 软件强制使用相同的“重新加载模式“时、它才会确定有效。 在您的 SYSCFG 中、EPWM3 具有

    epwm3.epwmActionQualifier_continousSwForceReloadMode               = "EPWM_AQ_SW_IMMEDIATE_LOAD";

    而其他 (HSHB1–3) 看起来保留为默认值(TBCTR = 0 时重新加载)。 当 RLDCSF≠Immediate 时、对 AQCSFRC(强制低电平/禁用)的写入操作在计数器事件之前不会生效。 如果 TBCLK 停止、则该事件永远不会发生、因此您的最后一次写入可以“布防“一种在您稍后启动时不可预测地锁存的变化。 根据 TBCLK 重新启动时 TBCTR 的相位、输出可以保持高电平、直到出现第一个符合条件的事件。 这与“Ch1&2 ok、Ch3&4 有时会保持高电平“完全匹配、以及更改通道顺序修复该问题的原因。

    此致、

    Masoud