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:根据 GPIO 输入设置 PWM 跳闸事件

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1395576/tms320f28379d-setting-up-pwm-trip-event-from-gpio-input

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

工具与软件:

专家们、您好!
我正在尝试从 GPIO 设置 PWM 跳闸、 并使用 GPIO 42作为输入。
这是 我目前拥有的:

// GPIO42
GPIO_setMasterCore(42, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_42_GPIO42);
GPIO_setDirectionMode(42, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(42, GPIO_PIN_TYPE_PULLUP);

void configurePWMTripFromGPIO()
{
//Select GPIO42 as INPUTXBAR1
XBAR_setInputPin(XBAR_INPUT1, 42);
//inputxbar1 trip
XBAR_setEPWMMuxConfig(XBAR_TRIP4, XBAR_EPWM_MUX01_INPUTXBAR1);
// Disable all the muxes first
XBAR_disableEPWMMux(XBAR_TRIP4, 0xFFFF);
// Enable Mux 0 OR Mux 4 to generate TRIP4
XBAR_enableEPWMMux(XBAR_TRIP4, XBAR_MUX00 | XBAR_MUX04 | XBAR_MUX10 | XBAR_MUX01);

//Setup trip zone actions
// EPWMxA will go low
// EPWMxB will go low
EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW);

EPWM_setTripZoneAction(EPWM2_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
EPWM_setTripZoneAction(EPWM2_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW);

EPWM_setTripZoneAction(EPWM3_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
EPWM_setTripZoneAction(EPWM3_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW);

//Enable the PWM trip zone signals (OSH1)
EPWM_enableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_OSHT1);
EPWM_enableTripZoneSignals(EPWM2_BASE, EPWM_TZ_SIGNAL_OSHT1);
EPWM_enableTripZoneSignals(EPWM3_BASE, EPWM_TZ_SIGNAL_OSHT1);
}

该引脚(GPIO42)已配置为"输入"、因为它也在其他一些控制逻辑中使用。

  1. 首先我的问题是,是否可以使用同一个 GPIO 引脚来设置 PWM 跳闸? 或者它是否应该是专用的 GPIO 引脚?
  2. 其次、如何 控制基于 GPIO 的 PWM 跳闸事件的逻辑电平?  我的意思是"仅当 GPIO42为低电平时、才激活 PWM 跳闸"
    将来、如果我希望 PWM 跳闸事件在 GPIO42为高电平时激活、 我该如何设置它?

谢谢!
AK

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

    Hi AK、

    是的、您可以将同一 GPIO 用作跳闸信号。

    您可以使用 ePWM 的数字比较子模块来反转跳闸信号的极性、以及许多其他功能、例如滤波或比较多个跳闸信号。 我建议阅读 ePWM 一章的数字比较子模块部分、并使用 SysConfig 进行配置。

    谢谢!

    Luke

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、您可以将同一 GPIO 用作跳闸信号。

    感谢您的确认。

    [报价 userid="529193" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1395576/tms320f28379d-setting-up-pwm-trip-event-from-gpio-input/5342676 #5342676"]您可以使用 ePWM 的数字比较子模块来反转跳闸信号的极性、以及许多其他功能(例如滤波或比较多个跳闸信号)。 我建议阅读 ePWM 一章的数字比较子模块部分并使用 SysConfig 进行配置。[/QUOT]

    我通读数字比较模块。 有没有任何示例展示所请求的功能?

    我尝试了以下方法、成功更改了极性、并在 LaunchPad 上对其进行了测试

    请您确认这是否是一种可以接受的方法:

    令人惊讶的是、它与 ePWM 模块完全无关。

    通读 TRM 手册的第15.9.2章、它指出 TZN 是 低电平有效输入信号。

    对于低电平有效配置[1 (High)至 0 (Low)]、我们将 GPIO 配置为输入

    示例:

    GPIO_setMasterCore(42, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_42_GPIO42);
    GPIO_setDirectionMode(42, GPIO_DIR_MODE_IN);
    GPIO_setPadConfig(42, GPIO_PIN_TYPE_PULLUP);

    对于高电平有效配置[0 (低电平 )至1 (高电平)]、 我们配置 GPIO 和"反相"输入:

    示例:

    GPIO_setMasterCore(42, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_42_GPIO42);
    GPIO_setDirectionMode(42, GPIO_DIR_MODE_IN);
    GPIO_setPadConfig(42, GPIO_PIN_TYPE_INVERT);

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

    Hi AK、

    我明天将回到这个问题上。

    谢谢!

    Luke

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

    Hi AK、

    通过 GPIO 模块将信号反相的方法非常好、这比使用数字比较模块简单得多。 如果您需要任何进一步的支持、请告诉我。

    谢谢!

    Luke

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

    感谢您的确认。

    我还有一个澄清:

    是否可以动态更改跳闸操作?

    或者我们是否应该每次都执行以下步骤:

    "禁用 PWM 时钟、-->设置行程操作-->启用 PWM 时钟。"

    我正在尝试实现类似这样的 somthing:

    //All pwms are already congifured as complementary during initialization. 
    
    if(state == brake)
    
    {
    	//Make 1A as low and 1B as High and force pwm trip.
    	EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
    	EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_HIGH);
    
    	EPWM_setTripZoneAction(EPWM2_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
    	EPWM_setTripZoneAction(EPWM2_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_HIGH);
    
    	EPWM_setTripZoneAction(EPWM3_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
    	EPWM_setTripZoneAction(EPWM3_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_HIGH);
    
    	//force pwm trip
    	EPWM_forceTripZoneEvent(EPWM1_BASE, EPWM_TZ_FORCE_EVENT_OST);
    	EPWM_forceTripZoneEvent(EPWM2_BASE, EPWM_TZ_FORCE_EVENT_OST);
    	EPWM_forceTripZoneEvent(EPWM3_BASE, EPWM_TZ_FORCE_EVENT_OST);
    }
    else if(state == stop)
    {
    	//Set the pwm trip back to its origenal conditions, incase a fault does occur from the gpio
    	EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
    	EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW);
    
    	EPWM_setTripZoneAction(EPWM2_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
    	EPWM_setTripZoneAction(EPWM2_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW);
    
    	EPWM_setTripZoneAction(EPWM3_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
    	EPWM_setTripZoneAction(EPWM3_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW);
    
    	//clear the trip flags which would have been set in the brake condition
    	EPWM_clearTripZoneFlag(EPWM1_BASE,EPWM_TZ_FLAG_OST);
    	EPWM_clearTripZoneFlag(EPWM1_BASE,EPWM_TZ_FLAG_OST);
    	EPWM_clearTripZoneFlag(EPWM1_BASE,EPWM_TZ_FLAG_OST);
    	
    	//The pwms should now go back to being complementary
    }
    else if(state == run)
    
    {
    	//DO nothin, make sure the trip actions are set so that to low, so that when ever the GPIO catches a fault, the pwms will go low.
    	EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
    	EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW);
    
    	EPWM_setTripZoneAction(EPWM2_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
    	EPWM_setTripZoneAction(EPWM2_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW);
    
    	EPWM_setTripZoneAction(EPWM3_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
    	EPWM_setTripZoneAction(EPWM3_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW);
    }

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

    Hi AK、

    是的、您应该在更改跳闸操作之前禁用 PWM 时钟。

    谢谢!

    Luke