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.

[参考译文] AM2432:【ePWM】如何单独控制每个 PWM FET (高侧、低侧)。

Guru**** 2455560 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1484817/am2432-epwm-how-to-contorol-each-of-pwm-fet-high-side-low-side-individually

器件型号:AM2432
主题中讨论的其他器件:SysConfig

工具与软件:

[英文]

你好。

我是 Bun。

我有一个关于如何控制每个 PWM FET 的问题。

我知道、使用函数  EPWM_aqSwTriggerContactAction、我可以在需要时控制 PWM FET。

但这种方法对 PWM 高侧和低侧都有效。

我想 单独控制每个 PWM FET (高侧、低侧)。

例如、当一侧开启时、另一侧关闭。

此致。

按钮

[日语]

こんにちは。μ A

文と言います。μ A

私はPWMのFETを個別で操作について質問があります。μ A

関数EPWM aqSwTriggerContActionを使うことで、任意のタイミングでPWMを操作できることは分かったのですが、

これだと、High側とLow側が連動して動いてしまいます。μ A

私は、片方がアクティブの時にもう片方が非アクティブにしたいです。μ A

どうすれば良いでしょうか。μ A

よろしくお願いします。μ A

文 μ A

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

    嗨、Bun、请向我们提供有关您用例的更多详细信息、因为我不确定您要尝试控制哪些 FET。

    EPWM_aqSwTriggerContAction () API 强制在 PWM 输出通道上连续输出值。 输出可被强制为低电平或高电平。 因此、您可能具有通道 A 高电平和通道 B 低电平(或相反)  
    谢谢!
    Paula.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [英文]

    尊敬的 Paula:

    感谢您的答复。

    我希望分别控制通道 A 和 B。
    例如、我想在通道 B 保持高电平时将通道 A 设置为高电平或低电平。

    我绘制了一个图像、用作我的用例。

    请看一下。  

    此致。

    按钮

    [日语]

    Paulaさん、返信ありがとうございます。μ A

    私はチャンネルAとBを別々に操作したいです。μ A

    例えば、チャンネルBをHighに保った状態で、チャンネルAをHighかLowに設定したいです。μ A

    私のやりたいことのイメージ図を描きましたので、ご覧ください。μ A

    よろしくお願いします。μ A

    文 μ A

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

    嗨、Bun、从 ePWM 的驱动程序中、我看到两个通道都可以独立触发。 这应该适合您的用例

    来自 AM243x MCU+SDK source\drivers\epwm\v0\ePWM.c 的片段代码:

    谢谢!

    Paula.

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

    [英文]

    尊敬的 Paula:

    感谢您的答复。

    是的、我尝试了这个 API (请看图1)、但这样有效了 PWM 高侧和低侧。
    因此、此 API 不适用于我的用例。

    根据 TI HP、第二个参数 pwmOutputCh 被写入"由于 A 和 B 的位字段值相同、将使用相同的宏来配置 A 和 B PWM 输出。"(请查看图2)

    如何使用此 API 来实现我的用例?

    此致。

    按钮

    [日语]
    Paulaさん、返信ありがとうございます。μ A

    はい、この API を試しました(図1 μ s)。ただし、この方法は PWM をご覧ください のハイサイドとローサイドの両方に影響しました。
    そのため、この API は私の使用例では機能しませんでした。

    TI HP によると、2番目のパラメータ pwmOutputCh は「A と B の両方のビット フィールド値が同じであるため、A の両方の B と PWM 出力の構成に同じマクロが使用されます」と書かれています(図2 をご覧ください μ s)。

    この API を使用してユースケースを実行するにはどうすればよいですか?

    よろしくお願いいたします。μ A

    文 μ A

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

    你好、Bun、请让我内部检查一下、然后回到您的身边

    谢谢!

    Paula.

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

    你好、Paula。


    我理解。  

    我将等待您的回复。

    谢谢你。

    按钮。

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

    你好、Bun、请帮我澄清、以确认我不是误会你

    • 您尝试使用 EPWM_aqSwTriggerContactAction ()来实现您的用例(下面的 pict ),但它没有按预期工作。 您会看到一种行为、如果将通道 A 设置为高电平、则无法将通道 B 设置为低电平(或相反)。 换句话说、使用此 API 无法单独控制通道 A 和通道 B。 我对问题的理解是否正确? 否则、请澄清。

    • 另一方面、我发现文档中的评论来自哪里

    正确的、这些位字段的值与下面所示的值相同

    但是 、*_shift 和*_mask 不同。 我希望  ePWM_aqSwTriggerContactAction ()工作正常。  

    请告诉我您的发现、如果您有一些尝试的代码和示波器快照、可能会有所帮助

    谢谢!

    Paula.

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

    [英文]
    感谢你的评分

    是的、我认为您的理解与我的理解相同。

    还有其他方法可以实现我的用例吗?
    我不会坚持使用此 API (EPWM_aqSwTriggerContactAction)。
    我希望单独控制通道 A 和通道 B

    顺便说一句,什么是参数在以下图?
    这些其他参数是否不是 EPWM_AqSwTrigContAction_t?

    此致、

    按钮

    [日语]

    Paulaさん、返信ありがとうございます。μ A

    はい、Paulaさんの認識と合っていると思います。μ A
    私のユースケースを実行する他の方法はありますか μ A?
    この API (EPWM_aqSwTriggerContactAction)の使用にこだわるつもりはありません。
    チャンネル A とチャンネル B を個別に制御したいです。

    ところで、下の図のパラメーターは何ですか μ A?
    これらは EPWM_AqSwTrigContAction_t の代わりのパラメーターですか?

    よろしくお願いいたします。μ A

    文 μ A

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

    嗨、Bun、来自 AM243x TRM、我看到了以下内容:

    https://www.ti.com/lit/ug/spruim2h/spruim2h.pdf 

    因此、您应该能够通过 AQCTLA 和 AQCTLB 控制 ePWM 通道 A 和通道 B。  此外、在"12.4.3.4.4.2控制和监控 ePWM 动作限定器子模块"同一节中:

    • 软件强制操作对于异步事件很有用、REA 通过 EPWM_AQSFRC 和 EPWM_AQCSFRC 寄存器进行处理。

    也许你可以在使用 EPWM_aqSwTriggerContAction ()时检查这些寄存器是否设置正确,或者你可以尝试  EPWM_aqSwTriggerOneTimeAction ()看看这是否对你有效。

    谢谢!

    Paula.

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

    [英文]
    感谢你的评分

    我会尝试它。
    我将展示如何使用此 API 和引用。
    这是如何正确使用的方法吗?

    ------- 我的图像(来自这里)--------------------------------

    /*将通道 A 设置为高电平或低电平*/
    EPWM_aqSwTriggerOneTimeAction (BaseAddress + AQCTLA、ChannelA、高电平或低电平);

    /*将通道 B 设置为高电平或低电平*/
    EPWM_aqSwTriggerOneTimeAction (BaseAddress + AQCTLB、ChannelB、高电平或低电平);

    ------- 我的图像(直至此处)--------------------------------------------------------
    注意:
    BaseAddress 是使用的 PWMSS 实例的基址。

    此致、

    按钮。

    [日本語 μ A]
    こんにちは、Paulaさん。返信ありがとうございます。μ A

    試してみます。μ A
    このAPIとレジスタの使い方を示します。μ A
    この使い方は正しいですか μ A?

    ------- 私の画像(ここから)-------------------------------------------------------

    /*チャネルAを高または低に設定*/
    EPWM_aqSwTriggerOneTimeAction (BaseAddress + AQCTLA、ChannelA、高电平或低电平);

    /*チャネルBを高または低に設定*/
    EPWM_aqSwTriggerOneTimeAction (BaseAddress + AQCTLB、ChannelB、高电平或低电平);

    ------- 私の画像(ここまで)-------------------------------------------------------
    注:
    BaseAddressは、使用されるPWMSSインスタンスのベースアドレスです。μ A

    よろしくお願いいたします。μ A

    文 μ A

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

    嗨、Bun、从驱动程序代码(source\drivers\epwm\v0\ePWM.c)我看到下面

    void EPWM_aqSwTriggerOneTimeAction(uint32_t baseAddr,
                                       uint32_t pwmOutputCh,
                                       uint32_t swTrigAction)
    {
        uint32_t regVal = 0U;
    
        if (EPWM_OUTPUT_CH_A == pwmOutputCh)
        {
            regVal =
                HW_RD_REG16((baseAddr + PWMSS_EPWM_OFFSET) + PWMSS_EPWM_AQSFRC);
    
            /* Configure the software triggered one-time action for A channel */
            HW_SET_FIELD32(regVal, PWMSS_EPWM_AQSFRC_ACTSFA, swTrigAction);
            /* Initiate single software forced event on A channel output */
            HW_SET_FIELD32(regVal,
                PWMSS_EPWM_AQSFRC_OTSFA, PWMSS_EPWM_AQSFRC_OTSFA_SW_EVENT);
    
            HW_WR_REG16(((baseAddr + PWMSS_EPWM_OFFSET) + PWMSS_EPWM_AQSFRC),
                (uint16_t)regVal);
        }
        else if (EPWM_OUTPUT_CH_B == pwmOutputCh)
        {
            regVal =
                HW_RD_REG16((baseAddr + PWMSS_EPWM_OFFSET) + PWMSS_EPWM_AQSFRC);
    
            /* Configure the software triggered one-time action for B channel */
            HW_SET_FIELD32(regVal, PWMSS_EPWM_AQSFRC_ACTSFB, swTrigAction);
            /* Initiate single software forced event on B channel output */
            HW_SET_FIELD32(regVal,
                PWMSS_EPWM_AQSFRC_OTSFB, PWMSS_EPWM_AQSFRC_OTSFB_SW_EVENT);
    
            HW_WR_REG16(((baseAddr + PWMSS_EPWM_OFFSET) + PWMSS_EPWM_AQSFRC),
                (uint16_t)regVal);
        }
        else
        {
            /* This error does not happen because of check done already */
        }
    }
    
    void EPWM_aqSwTriggerContAction(uint32_t baseAddr,
                                    uint32_t pwmOutputCh,
                                    uint32_t swTrigAction,
                                    uint32_t activeRegReloadMode)
    {
        /* Program AQCSFRC Active Register Reload From Shadow Options */
        HW_WR_FIELD16(((baseAddr + PWMSS_EPWM_OFFSET) + PWMSS_EPWM_AQSFRC),
            PWMSS_EPWM_AQSFRC_RLDCSF, (uint16_t)activeRegReloadMode);
    
        if (EPWM_OUTPUT_CH_A == pwmOutputCh)
        {
            /* Continuous software forced output on A */
            HW_WR_FIELD16(((baseAddr + PWMSS_EPWM_OFFSET) + PWMSS_EPWM_AQCSFRC),
                PWMSS_EPWM_AQCSFRC_CSFA, (uint16_t)swTrigAction);
        }
        else if (EPWM_OUTPUT_CH_B == pwmOutputCh)
        {
            /* Continuous software forced output on B */
            HW_WR_FIELD16(((baseAddr + PWMSS_EPWM_OFFSET) + PWMSS_EPWM_AQCSFRC),
                PWMSS_EPWM_AQCSFRC_CSFB, (uint16_t)swTrigAction);
        }
        else
        {
            /* This error does not happen because of check done already */
        }
    }

    请注意、我目前没有用于测试的设置、但它 应该类似于以下示例代码"

    /*将通道 A 设置为低电平*/
    EPWM_aqSwTriggerOneTimeAction (BaseAddress、EPWM_OUTPUT_CH_A、 EPWM_AQ_SW_TRIG_OT_ACTION_LOW);

    /*将通道 B 设置为高电平*/
    EPWM_aqSwTriggerOneTimeAction (BaseAddress + EPWM_OUTPUT_CH_B、 EPWM_AQ_SW_TRIG_OT_ACTION_HIGH);

    在我的上一篇文章中、我提到了动作限定器寄存器 A/B (AQCTLA/ AQCTLB)(如果您想探索、也可以使用它们。 它可能适合您的用例、也可能不适合。 在任何情况下、我强烈建议您查看我们的 TRM"12.4.3.4.4.2 控制和监控 ePWM 动作限定器子模块"部分、以了解更多详细信息。

    谢谢!

    Paula.

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

    尊敬的 Paula:

    我很抱歉这么晚才答复。

    我阅读了 TRM 的"12.4.3.4.4.2控制和监控 ePWM 动作限定器子模块"部分以了解更多详细信息。

    我认为、使用下图的函数和 动作限定器寄存器 A/B (AQCTLA/) AQCTLB)我可以做我的用例。

    但我不知道我使用哪个 API。

    ①那么、我使用哪个 API?

    EPWM_OUTPUT_CH_A/B 的 Δ ②A 与 COMA/B 的 A/B 相同?
    A 是 PWM 高侧、B 是 PWM 低侧?

    此致、  

    按钮

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

    嗨、Bun、您可以查看我们的一些 MCU+SDK 示例、因为它们使用"EPWM_AqActionCfg"结构和其他动作限定器 API (例如:EPWM_aqActionOnOutputCfg)。

    EPWM - AM243x MCU+SDK 示例:

    AM243x MCU+ SDK:ePWM 占空比

    此外、MCU+SDK 中有一些代码、但它不是完整的示例。 在以下任何情况下、示例路径仅供参考。

    C:\ti\mcu_plus_sdk_am243x_10_01_00_32\examples\drivers\epwm\EPWM_UP_AQ

    此代码展示了如何通过动态调整 EPWM 中断服务例程(ISR)内的比较值(CMPA 和 CMPB)、在 EPWMxA 和 EPWMxB 输出上生成独立调制的 PWM 信号。 该计时器配置为向上计数模式。 我看不到 API 在这里使用、因此 这可能是一个旧代码。 那么、仅供参考。

    谢谢!

    Paula.

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

    尊敬的 Paula:
    感谢您的答复。

    我读取 TRM 和示例代码(EPWM_DUTY_CYCLE.c)。
    只要我设置下面的图、使用 writecmpA 并写入 CMPB、我就可以做这个用例。
     




    现在、我想使用 CMB 使用 ET 子模块。
    然后、当我运行 cmpA 时、PWM-CHA 和 ChB 都用作 互补 PWM?

     

    此致。

    按钮。

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

    尊敬的 Paula

    很抱歉我要继续留言。

    关于我的最后一个问题、
    在 ePWM 死区发生器(DB)子模块上、CHA 和 ChB PWM 作为互补 PWM 运行、对吧?



    我再补充一句、
    如何控制 PWM 输出启动和停止?  

    I thoight API (ePWM_etIntrEnable 和 ePWM_etIntrDisable)、但是我没有使用 API (ePWM_etIntrDisable)停止 PWM 输出。

    最棒的地方

    按钮

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

    嗨、Bun、是的、您可以让它们用作互补信号对。 下面是 C2000的一个好视频  

    C2000 增强型脉宽调制器(ePWM):死区子模块|视频|德州仪器 TI.com

    对于第二个问题、在进行调试时、您可以使用以下命令停止输出:  

    ePWM_tbSetEmulationMode (gEpwmBaseAddr、EPWM_TB_EMU_MODE_STP_AFT_NEXT_CYCLE);

    谢谢!

    Paula.

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

    尊敬的 Paula:

    感谢您的答复。
    我将尝试使用 API。

    抱歉、让我添加两个位置、

    [第1号]
    我不知道如何使用 COMPA 和 COMPB 来实现互补 PWM。

    设置波纹图和波纹代码,它是正确的吗?
    在以下图中、相同的值:"APP_EPWM_COMPA_VAL"设置为 cmpA 和 compB。
    所以、我想这样。

    *** 我的图像代码(从这里开始

    FOC_LOOP{

         /* A、B、C 相的计算占空比后*/

         /*设置 DUTY CHA (高侧)*/
         writeCmpA (gEpwm0BaseAddr、(uint16_t)(DutyPhaseA *(float32_t) gEpwmPrdVal));
         writeCmpA (gEpwm1BaseBdr、(uint16_t)(DutyPhaseB *(float32_t) gEpwmPrdVal));
         writeCmpA (gEpwm2BaseCdr、(uint16_t)(DutyPhaseC *(float32_t) gEpwmPrdVal));

         /*设置 Duty ChB (低侧)*/
         writeCmpB (gEpwm0BaseAddr、(uint16_t)(DutyPhaseA *(float32_t) gEpwmPrdVal));
         writeCmpB (gEpwm1BaseBdr、(uint16_t)(DutyPhaseB *(float32_t) gEpwmPrdVal));
         writeCmpB (gEpwm2BaseCdr、(uint16_t)(DutyPhaseC *(float32_t) gEpwmPrdVal));
    }

    *** 我的图像代码(直到这里)*****

    [第2号]
    关于死区、在您向我展示的视频中、它的设置在 SysConfig 中执行。
    另一方面、在代码上使用时、以下图右侧的设置是否正确?
    使用该设置、通道 A 和通道 B 之间的死区时间是有效的、对吧?
    以下设置与您的示例代码"single_chip_servo.c"相同。



    此致、


    按钮

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

    嗨、Bun、我建议(如果您还没有)运行演示以更熟悉它、因为代码检查可能很困难。

    1)从 AM243x MCU+ SDK:ePWM 占空比中 、我们有:

    • 将 ePWM0配置为生成占空比为25%且持续60秒的1KHz 信号。
    • 本示例中使用了输出通道 A。
    • 参数频率、占空比和应用运行时间可由用户配置。
    • 在该示例中、死区子模块和斩波器子模块完全被旁路掉。
    • ISR 用于跟踪经过的时间的跟踪。
    • 展示 ePWM API 的用法

    示例 代码使用 APP_EPWM_DUTY_CYCLE=25、这稍后用于计算 APP_EPWM_COMPA_VAL。 在此示例中、仅使用 EPWM A 输出通道、因此 CMP_A 和 CMP_B 都应用于生成通道 A 占空比为25%的波形

    2) 2)是的、C2000团队将所有这些特性集成在 SysConfig 中。 在本例中、其中的一些配置必须在代码中完成。 不过、他们的视频系列非常不错、而且(最后一个5类除外)适用于我们使用相同的 ePWM IP (4类)

    C2000 增强型脉宽调制器(ePWM)|德州仪器 TI.com

    谢谢!

    Paula.

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

    BUN、从您的代码中、我相信您要实现某种类型的电机控制。 如果是、我们可以提供电机控制 SDK、为您提供更好的示例。 以下链接供您参考:

    SDK-AM243X-SDK 软件开发套件(MOTOR-CONTROL-SDK)|德州仪器 TI.com

    AM243x 电机控制 SDK:简介

    电机控制 SDK 示例主要使用 PRU-ICSS  与编码器和电流检测进行实时通信。 PRU-ICSS 是一个协处理器子系统、包含可编程实时(PRU)内核、该内核可实现低级固件。 PRU-ICSS 将器件中的主要 ARM 内核释放用于其他功能、例如控制和数据处理。

    谢谢!

    Paula.

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

    尊敬的 Paula:

    谢谢你。

    我会读你给我的信息。

    此致、

    按钮