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.

[参考译文] TMS320F28379D:生成互补 PWM 信号

Guru**** 2611705 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/981928/tms320f28379d-make-complementary-pwm-signals

器件型号:TMS320F28379D
主题中讨论的其他器件:C2000WARE

尊敬的 TI 团队:

为了使用 ePWM 模块生成互补信号、我使用并修改了代码部分(从 :C:\ti\c2000\C2000Ware_3_04_00_00\device_support\f2837xd\examples\cpu1\ePWM_dul带\cpu01)

EPwm1Regs.TBPRD = 1000;//设置定时器周期
EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0
EPwm1Regs.TBCTR = 0x0000;

EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//TB_COUNT_UP;//计数模式
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载。 #define TB_DISABLE 0x0
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//TB_DIV1 = 0x0 ->除以1
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;//TB_DIV1 = 0x0 ->除以1
//EPwm1Regs.PERCLKDIVSEL.bit.EPWMCLKDIV =

EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;//每0加载一次寄存器
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

//
//设置比较
//
EPwm1Regs.CMPA.bit.CMPA = 750;

EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//将 EPWMxA 设置为高电平
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;//将 EPWMxA 设为低电平

// AQCTLB:输出 B 的操作限定器控制寄存器
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;//将 EPWMxB 设为低电平
EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;//将 EPWMxB 设置为高电平

从上面的代码部分可以看出、EPWM1A 和 EPWM1B 输出信号应该是互补的、对吗? 但是、在我的示波器上、这两个信号是相同的。  

我的问题是:

(1)我的代码或设置是否有任何错误?

(2)在以下代码中隐藏寄存器的目的是什么:

EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;//每0加载一次寄存器
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

非常感谢你的帮助。 因为我是 C2000的新手、所以您的指导对我非常有意义。

此致、

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

    尊敬的 Van:

    [引用 user="van Nguyen "](1)我的代码或设置是否有任何错误?[/引用]

    我看不到您上面的代码有任何不正确的地方。 这是您初始化所拥有的吗? 如果您配置了死区子模块、则这可能会影响您的输出、因为死区子模块位于动作限定符子模块之后。  

    [引用 user="van Nguyen "](2)在以下代码中隐藏寄存器的目的是什么:[/引用]

    影子寄存器用于在 LOADAMODE/LOADBMODE 定义的特定事件或实例上加载 CMPA/CMPB 寄存器、而不是立即生效。 TRM 中的以下部分对此进行了更详细的解释:"计数器比较子模块的运行亮点"

    此致、

    Marlyn

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

    您好、Marlyn、

    感谢您的回答。

    [引用 user="Marlyn Rosales Castaneda20"]我看不到您上面的代码有任何不正确的地方。 这是您初始化所拥有的吗? 如果您配置了死区子模块、则这可能会影响您的输出、因为死区子模块位于动作限定符子模块之后。[/quot]

    我明白了。 在死区子模块中、有一个选项可对由 POLSEL 位指定的信号进行反相。

    [引用 USER="Marlyn Rosales Castaneda20]影子 寄存器用于在 LOADAMODE/LOADBMODE 定义的特定事件或实例时加载 CMPA/CMPB 寄存器、而不是立即生效。 TRM 中的以下部分对此进行了更详细的解释:"计数器比较子模块的操作亮点"[/QUERPLET]

    我读取并看到有这样的解释:"计数器比较寄存器 CMPA 和 CMPB 都有一个关联的影子寄存器。 影子寄存器提供了一种使寄存器更新与硬件保持同步的方法。 使用影子功能时、仅在策略点发生活动寄存器的更新。 这可防止由于寄存器被软件异步修改而导致损坏或虚假操作。"

    我仍然不明白隐藏的目的。 那么、在什么情况下、我们应该使用阴影还是不使用? 我们应该何时按照上述说明更新活动寄存器?

    感谢您的耐心等待。

    此致、

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

    尊敬的 Van:

    [引用 user="van Nguyen ]我看到了。 在死区子模块中、有一个反相信号的选项、由 POLSEL 位指定。[/QUERP]

    是的! 您是否设置了 POLSEL 值?

    [引用 user="van Nguyen ]那么,在什么情况下,我们应该使用阴影还是不使用? 何时应按照上述说明更新活动寄存器?[/quot]

    这在很大程度上取决于您的应用和安全要求。 建议使用影子寄存器、以便避免在未知状态下更改系统中的关键值。 例如、如果您在不使用影子模式的情况下更改 CMPA、则会面临跳过 CMPA 事件的风险、因为您在更改 CMPA 时不知道计数器的确切位置。 如果执行影子加载、则可以选择在计数器处于零、周期或两者都处于零时加载 CMPA 的新值(这意味着您知道新的 CMPA 更改将如何影响您的系统)。 对于其他系统、该设计可能需要立即更改、但大多数人使用影子加载来帮助防止其输出波形中出现任何问题。

    此致、

    Marlyn