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:ePWM/GPIO 问题

Guru**** 2604225 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/679411/tms320f28379d-epwm-gpio-problem

器件型号:TMS320F28379D

我正在尝试开发用于打开和关闭 ePWM 的函数。

ePWM 设置在不同的功能中完成、并且在 ePWM 运行时工作正常。

我编写了以下函数来操作运行 ePWM 的引脚。

来打开 ePWM。

void start_pwm_gpio (void)
{

InitEPwm1Gpio();
InitEPwm2Gpio();
InitEPwm5Gpio();


} 

以关闭所有 ePWM 引脚

void stop_pwm_gpio (void)
{

EALLOW;

GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;
GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;

GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1=1;

GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;

GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO3=1;

GpioCtrlRegs.GPAMUX1.bit.GPIO8=0;
GpioCtrlRegs.GPAMUX1.bit.GPIO9=0;

GpioCtrlRegs.GPADIR.bit.GPIO8=1;
GpioCtrlRegs.GPADIR.bit.GPIO9=1;

EDIS;

GpioDataRegs.GPADD.bit.GPIO0 = 0;
GpioDataRegs.GPADAT.bit.GPIO1=0;

GpioDataRegs.GPADAT.bit.GPIO2 = 0;
GpioDataRegs.GPADAT.bit.GPIO3=0;

GpioDataRegs.GPADAT.bit.GPIO8=0;
GpioDataRegs.GPADAT.bit.GPIO9=0;

}

以关闭下部 IGBT

void stop_lust_gpio (void)
{

InitEPwm1Gpio();
InitEPwm2Gpio();
InitEPwm5Gpio();



EALLOW;

GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;

GpioCtrlRegs.GPADIR.bit.GPIO1=1;

GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;

GpioCtrlRegs.GPADIR.bit.GPIO3=1;

GpioCtrlRegs.GPAMUX1.bit.GPIO9=0;

GpioCtrlRegs.GPADIR.bit.GPIO9=1;

EDIS;

GpioDataRegs.GPADAT.bit.GPIO1=0;

GpioDataRegs.GPADAT.bit.GPIO3=0;

GpioDataRegs.GPADAT.bit.GPIO9=0;


}

以关闭上部 IGBT

void stop_upper _gpio (void)
{

InitEPwm1Gpio();
InitEPwm2Gpio();
InitEPwm5Gpio();


EALLOW;

GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;

GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;

GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;

GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;

GpioCtrlRegs.GPAMUX1.bit.GPIO8=0;

GpioCtrlRegs.GPADIR.bit.GPIO8=1;

EDIS;

GpioDataRegs.GPADD.bit.GPIO0 = 0;

GpioDataRegs.GPADAT.bit.GPIO2 = 0;

GpioDataRegs.GPADAT.bit.GPIO8=0;

}

我在运行时使用 putty 通过 UART 从命令运行这些函数。

令人惊讶的是、当我尝试关闭上部 IGBT (GPIO0、GPIO2、GPIO8)时、它们不是"关闭"而是"打开"""""""实时"。 在这种情况下、当较低的 ePWM 打开时、ePWMxA 和 ePWMxB 在一个瞬间都打开、从而导致短路。 在执行此命令后、如果我尝试关闭整个 PWM、我会看到 ePWM 连接到上部 IGBT "打开"、而连接到下部 IGBT "关闭"。

这是一个错误。 这种情况并非总是发生、有时会发生、在关闭 ePWM 时仍然保持不变。

这是通过 GPIO 关闭 ePWM 的正确方法。 用户也可以通过 AQCTLA 设置执行该操作。 我使用 GPIO 只是为了使其成为硬"关闭"。

下面是从寄存器内容中查看的一个摘录。 当命令用于停止 ePWM 并关闭 GPIO0、1、2、3、8、 9 GPIO2仍然打开。

我的应用程序有下拉电阻器、我在180引脚 HSEC 扩展坞上尝试了相同的代码、我的应用程序也尝试了相同的代码、同一问题仍然存在。 当发出关闭命令时、不仅 GPIO2、而且所有连接到 ePWM 的其他 GPIO 会突然"打开"。

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

    您好、Soham、

    最好的方法是 ePWM 中内置的 tripzone 函数。 您实际上可以将所有这些设置为同时跳闸、这似乎在 CPU 周期和系统性能方面都有一些固有优势。

    但是、如果您选择走那个路由、改变 GPIO 多路复用器没有任何问题。 但是、请记住、多路复用器切换回的潜在可能性是固有的、如果确实如此、则 PWM 仍在运行、并将在引脚上变为有效状态。 tripzone 的另一个优势是您可以控制 PWM 重新启动的方式和时间(周期开始)。

    如果您选择保留 GPIO 多路复用器路由、则问题可能出在对 GPxDAT 寄存器进行".bit"访问的 R-M-W 操作方面。 请看以下文档中的6.1.2 GPxDAT 寄存器:

    www.ti.com/lit/an/spraa85e/spraa85e.pdf

    我还建议在切换多路复用器之前执行写入操作、因为它们将在开关上生效。 如果 DAT 寄存器当前包含"1"、则当前的方法会给 IO 带来干扰风险。

    此致、
    Kris