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.

[参考译文] TMS320F28P650DK:强制跳闸操作出现意外结果

Guru**** 2540980 points
Other Parts Discussed in Thread: TMS320F28P650DK

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1345272/tms320f28p650dk-unexpected-results-of-force-trip-action

器件型号:TMS320F28P650DK

尊敬的 TI 专家:

我使用的是编译器版本 v22.6.0.1.LTS 的 F28P650DK9。

我的目标是让软件强制三个 ePWM 模块跳闸、但我无法每次执行代码时都跳闸所有这些模块。

以下是该问题的说明:

[案例1]

我依次执行软件强制跳闸到 EPwm15Regs、EPwm17Regs 和 EPwm18Regs、并且还使用 EALLOW 和 EDIS 以确保寄存器正确设置。

EALLOW;
EPwm15Regs.TZFRC.bit.OST = 1;
EPwm17Regs.TZFRC.bit.OST = 1;
EPwm18Regs.TZFRC.bit.OST = 1;
EDIS;

下面的波形代表 EPWM15A、EPWM15B、 EPWM17A、EPWM17B、EPWM18A、  EPWM18B 信号。 红线左侧表示正常波形(所有 PWM 模块激活)、红线右侧表示强制跳闸操作的结果。 但是、只有 EPWM15未成功跳闸。

[案例2]

我已经尝试在后面添加一行代码用于调试。 我发现结果发生变化、事实证明 EPWM17未成功跳闸。

EALLOW;
EPwm15Regs.TZFRC.bit.OST = 1;
EPwm17Regs.TZFRC.bit.OST = 1;
EPwm18Regs.TZFRC.bit.OST = 1;
GpioDataRegs.GPCTOGGLE.bit.GPIO68 = 1;
EDIS;

我想问一下如何解释上述两种情况、或者我的寄存器设置是否存在问题?

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

    抱歉、请注意这是一个新问题、不是"TMS320F28P650DK:VerifyXTAL ()失败原因"中的相关问题。  

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

    Andy、您好!

    我将与其他 PWM 专家讨论此问题、之前可能在 F28P65x 上遇到过此案例。

    谢谢!

    Luke

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

    Andy、您好!

    对延迟响应深表歉意。 您是否仍然看到此问题?

    谢谢!

    Luke

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

    是的、我仍然想知道此问题的原因。

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

    好了、您是否能够在 F28P65x LaunchPad 或控制卡上发送您的代码或任何可以重现此问题的代码? 我将在我这边进行测试以确定根本原因。

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

    大家好、我也有同样的问题。 可以复制原始帖子中提到的相同方式-配置多个 EPWM (在我的案例中、所有 EPWM 都设置为强制输出为低电平)、尝试通过设置 OST 在所有 EPWM 上强制软件跳闸、请注意某些 EPWM 仍处于启用状态。 在较旧的目标(例如28379d)上使用相同的代码是没有问题的。 对电路板进行测试。

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

    你好、Sean、

    我正在努力在我身边重现此问题、将在本周的某个时间回复我的结果。

    谢谢!

    Luke

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

    你好、Sean、

    我可以在我这边重现此问题。 我将与设计团队联系、确认此问题的根本原因。

    谢谢!

    Luke

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

    你好、Sean、

    我发现现在的解决方法似乎可以解决这个问题、但我无法解释为什么它现在起作用。

    只需连续写入两次 TZFRC 而不是一次。 在我这边这么做时、我总是看到两个 EPWM 都被触发。 当我只写入一次时、有时我看到 PWM1跳闸了、但 PWM2跳闸了、反之亦然。

    我会告诉您我从设计团队收到了哪些反馈。

    谢谢!

    Luke

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

    这似乎起作用! 您一定会很好奇地听到原因、但很高兴在此期间有一个权变措施。 谢谢!

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

    没问题、我会告诉您我从设计团队收到的信息。

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

    你好、Sean、

    设计团队目前正在仿真此问题、我会随时向您通报最新情况。

    ——路加

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

    你好、Sean、

    我将在假期一直到6月底、设计团队仍在努力做到这一点。 我返回后会让您知道他们的结果。

    谢谢!

    Luke

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

    你好、Sean、

    如果您更改 EPWM 时钟分频器(PERCLKDIVSEL、 PWMDIVSEL)设置为0、那么只写入 TZFRC 一次时是否看到此问题?

    谢谢!

    Luke

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

    问题似乎仍然存在

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

    好的、设计团队回应称 PERCLKDIVSEL 时存在问题。 PWMDIVSEL 不是0、但当它为0时没有问题。 我将与他们分享您的结果、以便他们能够澄清问题。

    ——路加

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

    当然有! 我不是100%自信我设置了完美的测试,所以我可能会错. 无论哪种方式都绝对好奇这件事的本质!

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

    已理解、如果您在设置过程中遇到任何可能无法解释该问题的问题、请告诉我。

    ——路加

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

    该变通办法似乎并非在所有情况下都起作用。
    在 μ outìr 应用中、力在同一触发事件后在许多 PWM 上执行、并且力加倍是不起作用的。 也许我们错过了什么?

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

    您好、Silvio:

    设计团队尚未回复、但我会告诉他们这个问题很紧急。 我正在使用 PERCLKDIVSEL 重新创建问题。 PWMDIVSEL = 0x0。 能够做到这一点后、我会将我的结果与设计团队分享、以便他们能够阐明该问题的根本原因。

    谢谢!

    Luke

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

    您好、Silvio:

    我在本线程前面共享的代码片段中,在 Board_init ()之前添加了以下代码行:

    SYSCTL_setEPWMClockDivider (SYSCTL_EPWMCLK_DIV_1);

    添加此内容后、我无法重现问题。 如果没有这行代码、我就会始终看到两个 EPWM 中的一个出现问题。

    下面是我更新的主文件、您可以在您这边进行测试吗?

    //#############################################################################
    //
    // FILE:   epwm_ex1_trip_zone.c
    //
    // TITLE:  ePWM Using Trip-Zone Submodule.
    //
    //! \addtogroup driver_example_list
    //! <h1>ePWM Trip Zone</h1>
    //!
    //! This example configures ePWM1 and ePWM2 as follows
    //!  - ePWM1 has TZ1 as one shot trip source
    //!  - ePWM2 has TZ1 as cycle by cycle trip source
    //!
    //! Initially tie TZ1 high. During the test, monitor ePWM1 or ePWM2
    //! outputs on a scope. Pull TZ1 low to see the effect.
    //!
    //!  \b External \b Connections \n
    //!  - ePWM1A is on GPIO0
    //!  - ePWM2A is on GPIO2
    //!  - TZ1 is on GPIO12
    //!
    //! This example also makes use of the Input X-BAR. GPIO12 (the external
    //! trigger) is routed to the input X-BAR, from which it is routed to TZ1.
    //!
    //! The TZ-Event is defined such that ePWM1A will undergo a One-Shot Trip
    //! and ePWM2A will undergo a Cycle-By-Cycle Trip.
    //!
    //              _____________             __________________
    //              |           |             |                |
    //  GPIO12 -----| I/P X-BAR |-----TZ1-----| ePWM TZ Module |-----TZ-Event
    //              |___________|             |________________|
    //
    //
    //
    //#############################################################################
    //
    //
    // $Copyright:
    // Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com
    //
    // Redistribution and use in source and binary forms, with or without 
    // modification, are permitted provided that the following conditions 
    // are met:
    // 
    //   Redistributions of source code must retain the above copyright 
    //   notice, this list of conditions and the following disclaimer.
    // 
    //   Redistributions in binary form must reproduce the above copyright
    //   notice, this list of conditions and the following disclaimer in the 
    //   documentation and/or other materials provided with the   
    //   distribution.
    // 
    //   Neither the name of Texas Instruments Incorporated nor the names of
    //   its contributors may be used to endorse or promote products derived
    //   from this software without specific prior written permission.
    // 
    // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
    // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
    // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
    // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
    // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
    // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
    // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
    // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    // $
    //#############################################################################
    
    //
    // Included Files
    //
    #include "driverlib.h"
    #include "device.h"
    #include "board.h"
    
    //
    // Globals
    //
    uint32_t  epwm1TZIntCount;
    uint32_t  epwm2TZIntCount;
    
    //
    // Function Prototypes
    //
    __interrupt void epwm1TZISR(void);
    __interrupt void epwm2TZISR(void);
    
    void main(void)
    {
    
        //
        // Initialize global variables
        //
        epwm1TZIntCount = 0U;
        epwm2TZIntCount = 0U;
    
        //
        // Initialize device clock and peripherals
        //
        Device_init();
    
        //
        // Disable pin locks and enable internal pull-ups.
        //
        Device_initGPIO();
    
        //
        // Initialize PIE and clear PIE registers. Disables CPU interrupts.
        //
        Interrupt_initModule();
    
        //
        // Initialize the PIE vector table with pointers to the shell Interrupt
        // Service Routines (ISR).
        //
        Interrupt_initVectorTable();
    
        //
        // Disable sync(Freeze clock to PWM as well)
        //
        SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    
        //
        // Configure ePWM1, ePWM2, and TZ GPIOs/Modules
        //
    
        SysCtl_setEPWMClockDivider(SYSCTL_EPWMCLK_DIV_1);
    
        Board_init();
    
        EPWM_forceTripZoneEvent(myEPWM1_BASE, EPWM_TZ_FORCE_EVENT_OST);
        EPWM_forceTripZoneEvent(myEPWM2_BASE, EPWM_TZ_FORCE_EVENT_OST);
        //
        // Enable sync and clock to PWM
        //
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    
        //
        // Enable Global Interrupt (INTM) and real time interrupt (DBGM)
        //
        EINT;
        ERTM;
    
        //
        // IDLE loop. Just sit and loop forever (optional):
        //
        for(;;)
        {
            NOP;
        }
    }
    
    //
    // epwm1TZISR - ePWM1 TZ ISR
    //
    __interrupt void epwm1TZISR(void)
    {
        epwm1TZIntCount++;
    
        //
        // To re-enable the OST Interrupt, uncomment the below code:
        //
        // EPWM_clearTripZoneFlag(EPWM1_BASE,
        //                        (EPWM_TZ_INTERRUPT | EPWM_TZ_FLAG_OST));
    
        //
        // Acknowledge this interrupt to receive more interrupts from group 2
        //
        Interrupt_clearACKGroup(INT_myEPWM1_TZ_INTERRUPT_ACK_GROUP);
    }
    
    //
    // epwm2TZISR - ePWM2 TZ ISR
    //
    __interrupt void epwm2TZISR(void)
    {
        epwm2TZIntCount++;
    
        //
        // Toggle GPIO to notify when TZ is entered
        //
        GPIO_togglePin(myGPIO11);
    
        //
        // Clear the flags - we will continue to take this interrupt until the TZ
        // pin goes high.
        //
        //EPWM_clearTripZoneFlag(myEPWM2_BASE, (EPWM_TZ_INTERRUPT | EPWM_TZ_FLAG_CBC));
    
        //
        // Acknowledge this interrupt to receive more interrupts from group 2
        //
        Interrupt_clearACKGroup(INT_myEPWM2_TZ_INTERRUPT_ACK_GROUP);
    }
    

    谢谢!

    Luke

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

    尊敬的 Luke:

    将  SYSCTL_EPWMCLK_DIV 设置为1 (SO 200MHz EPWM)似乎可以解决我们的问题、当然、我们不能完全确定该问题不会再次发生。 您是否计划发布有关此方面的勘误表? 问题似乎是硬件或固件?

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

    嗨、Mattia、

    在硬件中、这似乎是意外情况、需要我与您共享的固件权变措施。 设计团队已确认、这只会在使用/2分频器时发生。

    我们将 在勘误表的下一修订版中记录此问题。

    谢谢!

    Luke