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.

[参考译文] TMS320F280039C:启用/禁用死区子模块时的 PWM 尖峰问题

Guru**** 657500 points
Other Parts Discussed in Thread: TMDSCNCD280039C, TMDSHSECDOCK
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1281087/tms320f280039c-pwm-spike-problem-when-dead-band-submodule-is-enabled-disabled

器件型号:TMS320F280039C
主题中讨论的其他器件:TMDSCNCD280039CTMDSHSECDOCK

尊敬的德州仪器团队:

 目前、我正在开发用于控制 LLC 转换器的软件。 如您所知、在启动期间、前几个 PWM 周期需要非对称 PWM、而后需要对称互补 PWM 模式。 在随附的 图中、 前6个 PWM 周期显示了 LLC 启动过程中的 PWM 图形示例。

1:启动过程的 PWM 模式。

以下是前六个 PWM 模式的一些注意事项:

第1个 PWM 周期–只应开启低侧 MOSFET。 高侧 MOSFET 关断。 PWM 在互补模式下不工作。

第2个 PWM 周期–低侧和高侧 MOSFET 都应关断。 PWM 在互补模式下不工作。

第3个 PWM 周期–低侧和高侧 MOSFET 在互补模式下运行、其中高侧 MOSFET 的占空比小于低侧 MOSFET 的占空比。

第4个 PWM 周期-低侧和高侧 MOSFET 在互补模式下运行、这时高侧 MOSFET 的占空比与低侧 MOSFET 相比更小、但低侧和高侧占空比之间的比率现在发生了变化。 增加高侧 MOSFET 的占空比、降低低侧 MOSFET 的占空比。

第5个 PWM 周期-低侧和高侧 MOSFET 采用对称 PWM 模式在互补模式下运行-两个 PWM 信号的占空比均为50%。

第6个 PWM 周期-低侧和高侧 MOSFET 采用对称 PWM 模式在互补模式下运行–两个 PWM 信号的占空比均为50%。

我附上了 用于测试启动 PWM 模式的 main.c 文件。 在 PWM 中断内部、PWM 参数会针对每个新的 PWM 周期进行更新。 为了使一切都透明且同步、应选择全局加载选项以同时更新所有需要的寄存器。 出现的问题是在第3个 PWM 周期开始时、PWM 周期开始时会出现较小的尖峰。 这不是由干扰引起的尖峰、也不是由不良的测量设置引入的尖峰。 我假设发生这种情况是因为死区子模块在第二个 PWM 周期中被旁路、而在第三个 PWM 周期中被启用。 但我不明白为什么启用了全局加载。 您能告诉我发生这种情况的原因以及如何解决尖峰问题吗? 这种行为是不可接受的。

e2e.ti.com/.../3681.main.c

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

    您好、Haris:

    感谢您提出问题并对您的问题进行了很好的简要描述。

    在跳到技术细节之前,我想了解几件事:
    1) 1)您在哪里测量 PWMH 和 PWML、这是在 GPIO 引脚和接地端吗?
    2)品红色波形代表什么,这是 ePWM_ISR 的开始吗?

    仅需确保您了解以下 TRM (技术参考手册)中的注意事项:


    CMPA = 0或 CMPB = 0边界上的影子到活动加载动作限定器输出 A/B 控制寄存器[AQCTLA 和 AQCTLB]
    如果将计数器比较 A 寄存器(CMPA)或计数器比较 B 寄存器(CMPB)设置为值0、并且将 AQCTLA 和 AQCTLB 上的动作限定器操作配置为在影子到活动加载相同的时刻发生(即、 CMPA= 0和 AQCTLA 使用 AQCTL 寄存器 LDAQAMODE 和 LDAQAMODE 位在 TBCTR=0时影子到活动加载、然后这两个事件都进入争用状态当在 TBCTR = 0边界上使用影子到活动加载动作限定器输出 A/B 控制寄存器时、建议使用非零计数器比较。

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

    Prarthan,您好!

    感谢您的快速响应。

    1)是的、我直接在 GPIO 引脚上测量 PWMH 和 PWML 信号(我使用 TMDSHSECDOCK 集线站和 TMDSCNCD280039C 控制卡)来进行此类测试。

    2) 2) Magneta 彩色线表示 PWM 中断的执行(GPIO 管脚44)。 在 PWM1中断 GPIO 引脚开始设置为高电平、并且在 PWM1 ISR 结束时、GPIO 引脚设置为低电平。

    感谢您提供这些信息。 我以前没有看到这一点。 根据此技术参考手册的注释、要停止 PWM 开关、您不建议将比较值设置为零、建议在 PWM 引脚上持续强制。 您能确认一下吗?

    在所示的示例中、我认为这不是会发生的问题。 这证明了我更改了代码。 在新代码中、比较值永远不等于零。 我正在使用武力将 PWM 设置为低电平状态、仍然发生同样的问题。 这就是为什么我仍然不能理解问题的根源。

    我附上了更改后的代码。

    e2e.ti.com/.../2728.main.c

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

    您好!

    正如我在之前的代码中看到的、CMPA 为0、影子到活动负载为零、因此我指出了注释。

    2) Magneta 彩色线代表 PWM 中断的执行(GPIO 管脚44)。 在 PWM1中断 GPIO 管脚开始设置为高电平、在 PWM1 ISR 结束时、GPIO 管脚设置为低电平。

    好的、在我看来、如果 ISR 中发生了开关情况、那么在 ePWM 切换之前脉冲是如何结束的呢?

    此外、尖峰似乎在进入 ePWM_ISR 之前或前不久才会发生。 您能否指出在品红色脉冲之间运行的代码,该代码似乎就在 ISR 触发之前,出现尖峰?

    如果可以将代码的执行时间安排分解成块、则故障排除将更容易

    谢谢。
    Prarthan.

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

    Prarthan,您好!

    对于我来说,有一件不有意义的事情是,如果在 ISR 中发生了切换情况,脉冲在 ePWM 切换前如何结束?

    在本示例中、代码从闪存执行。 如果从 RAM 存储器执行代码、则 PWM 周期开始到您可以看到 GPIO 引脚变为高电平之间的延迟可以忽略不计。 因此、如果代码从闪存执行、则代码执行速度会较慢、并且会存在一些开销、我猜会有一定的延迟。 在这两种情况下都会出现尖峰。 我使用了您的通用链接器脚本。 我附上了从 RAM 执行代码的相同案例。

    此外,似乎尖峰甚至在它进入 ePWM_ISR 之前或刚刚出现。 您能否指出品红色脉冲之间运行的代码,该代码似乎就在 ISR 触发之前,是否出现尖峰?

    当 PWM 计数器等于 PRD 或0时、都会出现尖峰。 这是我不能告诉你的。 如果我能回答这个问题、我不会请求您提供帮助。 我猜是、它发生在 PWM 计数器等于0时。 在磁力脉冲之间运行的代码是在  pwm1_isr 停止。 它是非常简单的代码。 如果您分析代码、您将看到下一个 PWM 周期的 PWM 中断参数已准备就绪、应在计数器等于零时准确更新这些参数。

    您是否尝试在您身边重建和调试我的问题? 我想了解您对此问题的处理方法。

    如果您可以将代码的执行时间安排分解成块,则故障排除将更容易

    我在图中标记了前3个 PWM 周期的执行说明。 对于其他 PWM 周期、原理是相同的。 代码很容易理解、而且不是太大。

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

    您好、Haris:
    感谢您的澄清。

    在查看您的代码时、我发现您正在执行连续的软件强制、因此只是想让您意识到、您需要将 RLDCSF 设置为影子到活动加载。 如果您需要立即加载、操作也会在影子加载到活动寄存器之后的下一个 TBCLK 边沿生效 相应地设置 RLDCSF-AQSFRC[7]。 我想您做得正确、但只需确保。

    另一个问题为什么要全局加载 HR 寄存器是否要使用高分辨率 DBRED/FED?如果是、我要强调  高分辨率死区 RED 和 FED 需要半个周期的时钟模式(DBCTL[HALFCYCLE]= 1)。

    我建议   在 ePWM_init 函数中使用 ePWM_setDeadBandControlShadowLoadMode、ePWM_setRisingEdgeDelayCountShadowLoadMode 和 ePWM_setFallingEdgeDelayCountShadowLoadMode 函数执行影子加载 DB、DBRED 和 DBFED、而不是在 ISR 中显式写入寄存器。
    我将在本周结束前试用该代码、

    谢谢。
    普拉森

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

    Prarthan,您好!

    是的、我知道这一点。 默认情况下、该设置为0、这意味着时基计数器上的加载等于零。

    在这一阶段、我不会使用 HR 寄存器。 未来可能我们将需要它、但目前开关频率低于250 kHz、我们不需要高分辨率。

    我可以尝试使用这些函数、但我不希望出现任何偏差行为。 如果我能在本周结束前得到一些答案,我将不胜感激。 提前感谢您。

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

    您好、Haris:

    关于您的设置、我有几个问题。 似乎你在使用 TBPRDHR 上的全局加载。 我们有一个 TRM 说明、建议不要对 TBPRDHR 使用全局加载。 下面介绍了当前解决方法。

     

    仅需确认一下、您看到的是启用/未启用 HR 的情况下的这一尖峰、正确吗?

     此致!

    马瑞安

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

    您好、Ryan、

    根据参考手册、我不知道如何仅针对 TBPRD 启用全局加载。 它自动启用 TBPRDHR 的全局加载。 这与函数调用 EPWM_enableGlobalLoadRegisters (EPWM1_base、EPWM_GL_REGISTER_TBPRD_TBPRDHR)相关;它会自动将 GLDCFG 寄存器内的位0设置为1。 在此代码中、我未启用可在初始化代码中看到的 HR PWM。 在代码执行期间、我检查了 ePWM 寄存器、在此示例中 HR 被禁用。

    这是否意味着我们无法使用  EPWM_enableGlobalLoadRegisters (EPWM1_BASE、EPWM_GL_REGISTER_TBPRD_TBPRDHR)、因为您建议不要在 TBPRDHR 上使用全局加载 。 或者我们可以使用它、但我们需要禁用 HR 功能。 您能为我解释一下吗?

    感谢您的支持!

    哈里斯

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

    您好、Haris:

    是的、回答正确、您无法对4类系统使用 TBPRDHR 上的全局加载。 在5类 ePWM 中、此错误已修复、以启用对 TBPRDHR、CMP、DB 和 AQ 寄存器的支持。

    我们将运行您的代码、看看我们是否能重现此尖峰。 在您这边、您能禁用 TBPRDHR 全局加载吗?

    此致!

    马瑞安

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

    您好、Haris:

    在开关案例2中、您会在 PWM_init 中将动作限定符设置为 epwmA 或 H 上的高电平。 并且影子加载动作限定符、用于在 TBCTR 零上将 epwmA 设置为低电平、该限定符将在下一个 TBCLK 边沿生效(请参阅 AQCSFRC 寄存器说明)、 因此、我怀疑该尖峰本质上是计数器零和下一个 TBCLK 边沿之间的时间、在这里、尖峰被限定符设置为高电平、并通过软件强制推低。
    我会确认、通过在前一个周期中更改动作限定符、并在明天回复您、您也可以尝试相同的操作。

    谢谢。
    Prarthan.

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

    您好、Ryan、

    感谢您的支持。 我禁用了  TBPRDHR 上的全局加载、但仍会出现尖峰(删除了函数调用 EPWM_enableGlobalLoadRegisters (EPWM1_BASE、EPWM_GL_REGISTER_TBPRD_TBPRDHR))。

    要100%确定、您是否能够确认以下陈述:

    1.对于 F280039C 器件、不建议使用所示的参数调用函数 EPWM_enableGlobalLoadRegisters (EPWM1_BASE、EPWM_GL_REGISTER_TBPRD_TBPRDHR)。 无论是启用还是禁用 HR PWM 功能。

    根据您的回答、将会出现新问题:

    1. 由于 F280039C 器件不能使用 PWM 周期的全局加载、因此在我们需要同时更新所有使用的 PWM 的 LLC 或多相 LLC 情况下、您建议如何配置 PWM? 请注意、我们具有可变频率、在某些地方还具有可调比较值和可调死区时间值? 全局加载的主要优势列举了示例。

    2.对于死区时间寄存器和比较寄存器,HR 寄存器会怎样? 在这些寄存器上使用全局加载是否安全?

    3.在哪里可以找到哪些器件有4类和5类 ePWM 的信息?

    4.您使用新的5类 ePWM 修复了这个错误、但要尝试使用4类 ePWM 器件呢? 我没有在勘误表文件中看到任何报告的错误。 您是否有一些其他文件,我可以看到这些漏洞和解决方案如何修复它们?

    提前感谢您!

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

    您好、Haris:

    我们仔细研究了各个情况下的信号情况、并认为我们已经找到了解决方案。

    在代码的情况2中、我们所做的更改被设定为 DBCTL = 0x0C0B 至 DBCTL = 0x0C2B。  

    在本例中、ePWM1A 同时用作 RED 和 FED 延迟的输入。 而对于 OUTB、您可以将 ePWMB 信号与 DBFED 一起使用。 AQ 将负责设置它。

    在代码的情况7中、我们所做的更改是将 DBCTL=0x0C09设置为 DBCTL=0x0C23。

    在本例中、ePWM1A 再次用作 RED 和 FED 延迟的输入。 相反、对于 OUTB、您可以使用 ePWMB 的信号、不进行反转。

    下面是附加的代码片段:

    //#############################################################################
    //
    // FILE:   empty_driverlib_main.c
    //
    //! \addtogroup driver_example_list
    //! <h1>Empty Project Example</h1> 
    //!
    //! This example is an empty project setup for Driverlib development.
    //!
    //
    //#############################################################################
    //
    //
    // $Copyright:
    // Copyright (C) 2023 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.
    // $
    //#############################################################################
    /******************************************************************************/
    /* COPYRIGHT (c) 2023                                                         */
    /* AEconversion                                                               */
    /* All rights reserved.                                                       */
    /******************************************************************************/
    /*!
    * @file     main.c
    * @author   Haris Kovacevic
    * @date     September 19, 2023
    * @brief    Main function
    * @version  V1.0.0
    */
    /******************************************************************************/
    /*!
     * @addtogroup MAIN
     * @{ <!-- BEGIN GROUP -->
     */
    /******************************************************************************/
    
    /******************************************************************************/
    /* Includes                                                                   */
    /******************************************************************************/
    #include "device.h"
    #include "interrupt.h"
    #include "board.h"
    //#include "sw_interrupt_prioritization_logic.h"
    
    /******************************************************************************/
    /* Definitions                                                                */
    /******************************************************************************/
    
    
    /******************************************************************************/
    /* Typedefs                                                                   */
    /******************************************************************************/
    
    
    /******************************************************************************/
    /* Variables                                                                  */
    /******************************************************************************/
    extern uint16_t RamfuncsLoadStart;
    extern uint16_t RamfuncsLoadEnd;
    extern uint16_t RamfuncsLoadSize;
    extern uint16_t RamfuncsRunStart;
    extern uint16_t RamfuncsRunEnd;
    extern uint16_t RamfuncsRunSize;
    extern uint16_t Cla1ProgLoadStart;
    extern uint16_t Cla1ProgRunStart;
    extern uint16_t Cla1ProgLoadSize;
    
    volatile uint32_t cnt_test = 0UL;
    
    /******************************************************************************/
    /* Function prototypes                                                        */
    /******************************************************************************/
    __interrupt void    pwm1_isr        (void);
    static void         flash_init      (void);
    static void         cpu_init        (void);
    static void         gpio_init       (void);
    static void         pwm_init        (void);
    
    /******************************************************************************/
    /* Functions                                                                  */
    /******************************************************************************/
    
    /******************************************************************************/
    /*
     * MAIN FUNCTION
     */
    /******************************************************************************/
    void main(void)
    {
        /* Copy time critical code and flash setup code to RAM.
         * The RamfuncsLoadStart, RamfuncsLoadSize, RamfuncsRunStart, Cla1ProgRunStart,
         * Cla1ProgLoadStart, and Cla1ProgLoadSize are created by the linker.
         * Refer to the device .cmd file. */
        //memcpy((uint32_t *)&RamfuncsRunStart, (uint32_t *)&RamfuncsLoadStart,
               //(uint32_t)&RamfuncsLoadSize );
       //memcpy((uint32_t *)&Cla1ProgRunStart, (uint32_t *)&Cla1ProgLoadStart,
              // (uint32_t)&Cla1ProgLoadSize );
    
        /* 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();
    
        /* Flash initialization */
        //flash_init();
        /* CPU initialization */
        cpu_init();
        /* GPIO initialization */
        gpio_init();
        /* PWM initialization */
        pwm_init();
        Board_init();
        EPWM_setTimeBaseCounter(EPWM1_BASE, 1U);
        EPWM_enableSyncOutPulseSource(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);
    
        /* Enable PWM 1 interrupt */
        Interrupt_enable(INT_EPWM1);
        EPWM_setTimeBaseCounter(EPWM1_BASE, 1U);
        /* Enable sync and clock to PWM */
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    
        /* Enable Global Interrupt (INTM) and realtime interrupt (DBGM) */
        EINT;
        ERTM;
    
        while(1)
        {
            /* Infinite loop */
    
        }
    }
    
    /******************************************************************************/
    /*
     * FLASH INITIALIZATION
     */
    /******************************************************************************/
    static void flash_init(void)
    {
        /* Set the bank fallback power modes to active */
        Flash_setBankPowerMode(FLASH0CTRL_BASE, FLASH_BANK0, FLASH_BANK_PWR_ACTIVE);
        Flash_setBankPowerMode(FLASH0CTRL_BASE, FLASH_BANK1, FLASH_BANK_PWR_ACTIVE);
        Flash_setBankPowerMode(FLASH0CTRL_BASE, FLASH_BANK2, FLASH_BANK_PWR_ACTIVE);
    
        /* Power up flash bank and pump and this also sets the fall back mode of
         * flash and pump as active */
        Flash_setPumpPowerMode(FLASH0CTRL_BASE, FLASH_PUMP_PWR_ACTIVE);
    
        /* Disable cache and prefetch mechanism before changing wait states */
        Flash_disableCache(FLASH0CTRL_BASE);
        Flash_disablePrefetch(FLASH0CTRL_BASE);
    
        /* Set waitstates according to frequency */
        Flash_setWaitstates(FLASH0CTRL_BASE, 5);
    
        /* Enable cache and prefetch mechanism to improve performance of code
         * executed from flash */
        Flash_enableCache(FLASH0CTRL_BASE);
        Flash_enablePrefetch(FLASH0CTRL_BASE);
    
        /* At reset, ECC is enabled.  If it is disabled by application software and
         * if application again wants to enable ECC. */
        Flash_enableECC(FLASH0ECC_BASE);
    
        /* Force a pipeline flush to ensure that the write to the last register
         * configured occurs before returning */
        __asm(" RPT #7 || NOP");
    }
    
    /******************************************************************************/
    /*
     * CPU INITIALIZATION
     */
    /******************************************************************************/
    static void cpu_init(void)
    {
        /* Disable Watchdog */
        SysCtl_disableWatchdog();
    
        SysCtl_setClock(SYSCTL_OSCSRC_OSC1 |
                        SYSCTL_IMULT(24U) |
                        SYSCTL_REFDIV(2U) |
                        SYSCTL_ODIV(1U) |
                        SYSCTL_SYSDIV(1U) |
                        SYSCTL_PLL_ENABLE);
    
        /* Set Low speed clock divider */
        SysCtl_setLowSpeedClock(SYSCTL_LSPCLK_PRESCALE_4);
    
        /* Clock source connected to output pin */
        SysCtl_selectClockOutSource(SYSCTL_CLOCKOUT_SYSCLK);
        SysCtl_setXClk(SYSCTL_XCLKOUT_DIV_1);
    
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER0);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER1);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER2);
        SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    //    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM1);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM2);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM3);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM4);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM5);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM6);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM7);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM8);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_HRCAL);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIA);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIB);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCA);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCB);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCC);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS1);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS2);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS3);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS4);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DACA);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DACB);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CLB1);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CLB2);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CLB3);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CLB4);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CLA1);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP1);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP2);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP3);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_I2CA);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_I2CB);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SPIA);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SPIB);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CANA);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_MCANA);
    }
    
    /******************************************************************************/
    /*
     * GPIO INITIALIZATION
     */
    /******************************************************************************/
    static void gpio_init(void)
    {
        /* Configure GPIO pin 0 */
        GPIO_setDirectionMode(0, GPIO_DIR_MODE_OUT);
        GPIO_setPadConfig(0, GPIO_PIN_TYPE_STD);
        GPIO_setMasterCore(0, GPIO_CORE_CPU1);
        GPIO_writePin(0, (uint32_t)0);
        GPIO_setPinConfig(GPIO_0_EPWM1_A);
    
        /* Configure GPIO pin 1 */
        GPIO_setDirectionMode(1, GPIO_DIR_MODE_OUT);
        GPIO_setPadConfig(1, GPIO_PIN_TYPE_STD);
        GPIO_setMasterCore(1, GPIO_CORE_CPU1);
        GPIO_writePin(1, (uint32_t)0);
        GPIO_setPinConfig(GPIO_1_EPWM1_B);
    
        /* Configure GPIO pin 44 */
        GPIO_setDirectionMode(33, GPIO_DIR_MODE_OUT);
        GPIO_setPadConfig(33, GPIO_PIN_TYPE_STD);
        GPIO_setMasterCore(33, GPIO_CORE_CPU1);
        GPIO_writePin(33, (uint32_t)0);
        GPIO_setPinConfig(GPIO_33_GPIO33);
    }
    
    /******************************************************************************/
    /*
     * PWM INITIALIZATION
     */
    /******************************************************************************/
    static void pwm_init(void)
    {
        /* Disable sync (Freeze clock to PWM as well) */
        SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    
        /* Connect interrupt functions to vector addresses */
        Interrupt_register(INT_EPWM1, &pwm1_isr);
    
        /* Set PWM counter type and clock dividers */
        EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP);
        EPWM_setTimeBaseCounter(EPWM1_BASE, 0U);
        EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
        EPWM_setTimeBasePeriod(EPWM1_BASE, 1200U);
    
        /* Set PWM emulation mode */
        EPWM_setEmulationMode(EPWM1_BASE, EPWM_EMULATION_FREE_RUN);
        /* Phase shift load setup */
        EPWM_disablePhaseShiftLoad(EPWM1_BASE);
        EPWM_setPhaseShift(EPWM1_BASE, 0U);
    
        /* Set PWM period load configuration */
        EPWM_setPeriodLoadMode(EPWM1_BASE, EPWM_PERIOD_SHADOW_LOAD);
        EPWM_selectPeriodLoadEvent(EPWM1_BASE, EPWM_SHADOW_LOAD_MODE_COUNTER_ZERO);
    
        /* Set PWM compare register load configuration and initial duty cycle */
        EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
        EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
        EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_C, EPWM_COMP_LOAD_ON_CNTR_ZERO);
        EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_D, EPWM_COMP_LOAD_ON_CNTR_ZERO);
    
        /* Action qualifier setting */
        EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
    
        EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
        EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
        EPWM_setActionQualifierT1TriggerSource(EPWM1_BASE, EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_1);
        EPWM_setActionQualifierT2TriggerSource(EPWM1_BASE, EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_1);
    
        /* Set Dead-Band settings for Complementary Mode */
        HWREGH(EPWM1_BASE + EPWM_O_DBCTL2) = 0x4U;  // All writes and reads to bits [5:0] of the DBCTL register are shadowed
        EPWM_setDeadBandCounterClock(EPWM1_BASE, EPWM_DB_COUNTER_CLOCK_FULL_CYCLE);
        EPWM_setRisingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMA);
        EPWM_setRisingEdgeDelayCount(EPWM1_BASE, 25U);
        EPWM_setRisingEdgeDelayCount(EPWM1_BASE, 0U); // added this
        EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW);
        EPWM_setFallingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMA);
        EPWM_setFallingEdgeDelayCount(EPWM1_BASE, 25U);
        HWREGH(EPWM1_BASE + EPWM_O_AQCSFRC) = 0x5;  // Force PWM1 A and B to LOW state
    
        /* Set compare values */
        EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 0U);
        EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, 6000U);
    
        /* Enable PWM1 interrupt */
        EPWM_setInterruptSource(EPWM1_BASE, EPWM_INT_TBCTR_ZERO);
        EPWM_enableInterrupt(EPWM1_BASE);
        EPWM_setInterruptEventCount(EPWM1_BASE, 1U);
    
        /* Global load configuration */
        EPWM_enableGlobalLoadRegisters(EPWM1_BASE, EPWM_GL_REGISTER_TBPRD_TBPRDHR);
        EPWM_enableGlobalLoadRegisters(EPWM1_BASE, EPWM_GL_REGISTER_CMPA_CMPAHR);
        EPWM_enableGlobalLoadRegisters(EPWM1_BASE, EPWM_GL_REGISTER_CMPB_CMPBHR);
        //EPWM_enableGlobalLoadRegisters(EPWM1_BASE, EPWM_GL_REGISTER_CMPC);
        //EPWM_enableGlobalLoadRegisters(EPWM1_BASE, EPWM_GL_REGISTER_CMPD);
        EPWM_enableGlobalLoadRegisters(EPWM1_BASE, EPWM_GL_REGISTER_DBRED_DBREDHR);
        EPWM_enableGlobalLoadRegisters(EPWM1_BASE, EPWM_GL_REGISTER_DBFED_DBFEDHR);
        EPWM_enableGlobalLoadRegisters(EPWM1_BASE, EPWM_GL_REGISTER_DBCTL);
        //EPWM_enableGlobalLoadRegisters(EPWM1_BASE, EPWM_GL_REGISTER_AQCTLA_AQCTLA2);
        //EPWM_enableGlobalLoadRegisters(EPWM1_BASE, EPWM_GL_REGISTER_AQCTLB_AQCTLB2);
        EPWM_enableGlobalLoadRegisters(EPWM1_BASE, EPWM_GL_REGISTER_AQCSFRC);
    
        EPWM_setGlobalLoadEventPrescale(EPWM1_BASE, 1U);
        EPWM_disableGlobalLoadOneShotMode(EPWM1_BASE);
        EPWM_setGlobalLoadTrigger(EPWM1_BASE, /*EPWM_GL_LOAD_PULSE_CNTR_PERIOD*/EPWM_GL_LOAD_PULSE_CNTR_ZERO);
        EPWM_enableGlobalLoad(EPWM1_BASE);
        //EPWM_disableGlobalLoad(EPWM1_BASE);
    }
    
    /******************************************************************************/
    /*
     * PWM1 ISR
     */
    /******************************************************************************/
    __interrupt void pwm1_isr(void)
    {
    //    HWREG(GPIODATA_BASE + GPIO_O_GPBSET) = (0x1U << 12U);
        GPIO_writePin(33, 1U);
        /* Save IER register on stack */
        volatile uint16_t tempPIEIER = HWREGH(PIECTRL_BASE + PIE_O_IER3);
    
        /* Set the global and group priority to allow CPU interrupts
           with higher priority */
        //IER |= M_INT3;
        //IER &= MINT3;
        //HWREGH(PIECTRL_BASE + PIE_O_IER3) &= MG3_1;
    
        /* Enable Interrupts */
        Interrupt_clearACKGroup(0xFFFFU);
        __asm("  NOP");
        EINT;
    
    
        /* Code to execute inside interrupt */
            switch(cnt_test)
            {
                case 0:
    
                    /******************************** 2nd PWM CYCLE ********************************/
    
        #if 1
                    /* Update PWM parameters */
                    HWREGH(EPWM1_BASE + EPWM_O_TBPRD) = 1200UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPA + 0U + 0x1U) = 600UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPB + 0U + 0x1U) = 600UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBRED) = 25UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBFED) = 25UL;
    
                    /* Force PWM1 A and PWM1 B is defined by CMPA register and counter equal to
                     * period/zero */
                    HWREGH(EPWM1_BASE + EPWM_O_AQCSFRC) = 0x1;
                    /* Load on time-base counter equals zero */
                    HWREGH(EPWM1_BASE + EPWM_O_AQSFRC) = 0x0/*0xC0*/;
        #endif
    
        #if 0
                    /* Update PWM parameters */
                    HWREGH(EPWM1_BASE + EPWM_O_TBPRD) = 1200UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPA + 0U + 0x1U) = 0UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPB + 0U + 0x1U) = 600UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBRED) = 25UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBFED) = 25UL;
    
                    HWREGH(EPWM1_BASE + EPWM_O_AQCTLA) = 0x0012U;
                    HWREGH(EPWM1_BASE + EPWM_O_AQCTLB) = 0x0201U;
    
                    /* Force PWM1 A and PWM1 B is defined by CMPA register and counter equal to
                     * period/zero */
                    HWREGH(EPWM1_BASE + EPWM_O_AQCSFRC) = 0x0;
                    /* Load on time-base counter equals zero */
                    HWREGH(EPWM1_BASE + EPWM_O_AQSFRC) = 0x0/*0xC0*/;
        #endif
    
                    /* All writes and reads to bits[5:0] of the DBCTL registers are shadowed. */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL2) = 0x4U;
                    /* Bypass dead band submodule */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL) = 0x0C08U;
    
                    cnt_test += 1U;
    
                    /*******************************************************************************/
    
                    break;
                case 1:
    
                    /******************************** 3rd PWM CYCLE ********************************/
    
        #if 1
                    /* Update PWM parameters */
                    HWREGH(EPWM1_BASE + EPWM_O_TBPRD) = 1200UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPA + 0U + 0x1U) = 600UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPB + 0U + 0x1U) = 600UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBRED) = 25UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBFED) = 25UL;
    
                    /* Load on time-base counter equals zero */
                    HWREGH(EPWM1_BASE + EPWM_O_AQSFRC) = 0x0;
                    /* Force PWM1 A and B to LOW state */
                    HWREGH(EPWM1_BASE + EPWM_O_AQCSFRC) = 0x5;
        #endif
    
        #if 0
                    /* Update PWM parameters */
                    HWREGH(EPWM1_BASE + EPWM_O_TBPRD) = 1200UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPA + 0U + 0x1U) = 0UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPB + 0U + 0x1U) = 0UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBRED) = 25UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBFED) = 25UL;
    
                    HWREGH(EPWM1_BASE + EPWM_O_AQCTLA) = 0x0012U;
                    HWREGH(EPWM1_BASE + EPWM_O_AQCTLB) = 0x0102U;
    
                    /* Force PWM1 A and PWM1 B is defined by CMPA register and counter equal to
                     * period/zero */
                    HWREGH(EPWM1_BASE + EPWM_O_AQCSFRC) = 0x0;
                    /* Load on time-base counter equals zero */
                    HWREGH(EPWM1_BASE + EPWM_O_AQSFRC) = 0x0/*0xC0*/;
        #endif
    
                    /* All writes and reads to bits[5:0] of the DBCTL registers are shadowed. */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL2) = 0x4U;
                    /* Bypass dead band submodule */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL) = 0x0C08U;
    
                    cnt_test += 1U;
    
                    /*******************************************************************************/
    
                    break;
                case 2:
    
                    /******************************** 3rd PWM CYCLE ********************************/
    
        #if 1
                    /* Update PWM parameters */
                    HWREGH(EPWM1_BASE + EPWM_O_TBPRD) = 1200UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPA + 0U + 0x1U) = 150UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPB + 0U + 0x1U) = 150UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBRED) = 25UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBFED) = 25UL;
    
                    /* Load on time-base counter equals zero */
                    HWREGH(EPWM1_BASE + EPWM_O_AQSFRC) = 0x0;
                    /* Forcing for PWM1 A and B is disabled */
                    HWREGH(EPWM1_BASE + EPWM_O_AQCSFRC) = 0x0;
        #endif
    
        #if 0
                    /* Update PWM parameters */
                    HWREGH(EPWM1_BASE + EPWM_O_TBPRD) = 1200UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPA + 0U + 0x1U) = 150UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPB + 0U + 0x1U) = 150UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBRED) = 25UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBFED) = 25UL;
    
                    HWREGH(EPWM1_BASE + EPWM_O_AQCTLA) = 0x0012U;
                    HWREGH(EPWM1_BASE + EPWM_O_AQCTLB) = 0x0102U;
        #endif
    
                    /* All writes and reads to bits[5:0] of the DBCTL registers are shadowed. */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL2) = /*0x4U*/0x4U;
                    /* Bypass dead band submodule */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL) =         /*0x0C0A*//*0x0C09*/;
    
                    cnt_test += 1U;
    
                    /*******************************************************************************/
    
                    break;
    
                case 3:
    
                    /******************************** 4th PWM CYCLE ********************************/
    
                    /* Update PWM parameters */
                    HWREGH(EPWM1_BASE + EPWM_O_TBPRD) = 1200UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPA + 0U + 0x1U) = 450UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPB + 0U + 0x1U) = 450UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBRED) = 25UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBFED) = 25UL;
    
                    /* Load on time-base counter equals zero */
                    HWREGH(EPWM1_BASE + EPWM_O_AQSFRC) = 0x0;
                    /* Forcing for PWM1 A and B is disabled */
                    HWREGH(EPWM1_BASE + EPWM_O_AQCSFRC) = 0x0;
    
                    /* All writes and reads to bits[5:0] of the DBCTL registers are shadowed. */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL2) = /*0x4U*/0x4U;
                    /* Bypass dead band submodule */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL) = 0x0C0B;
    
                    cnt_test += 1U;
    
                    /*******************************************************************************/
    
                    break;
    
                case 4:
    
                    /******************************** 5th PWM CYCLE ********************************/
    
                    /* Update PWM parameters */
                    HWREGH(EPWM1_BASE + EPWM_O_TBPRD) = 1200UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPA + 0U + 0x1U) = 600UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPB + 0U + 0x1U) = 600UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBRED) = 25UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBFED) = 25UL;
    
                    /* Load on time-base counter equals zero */
                    HWREGH(EPWM1_BASE + EPWM_O_AQSFRC) = 0x0;
                    /* Forcing for PWM1 A and B is disabled */
                    HWREGH(EPWM1_BASE + EPWM_O_AQCSFRC) = 0x0;
    
                    /* All writes and reads to bits[5:0] of the DBCTL registers are shadowed. */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL2) = /*0x4U*/0x4U;
                    /* Bypass dead band submodule */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL) = 0x0C0B;
    
                    cnt_test += 1U;
    
                    /*******************************************************************************/
    
                    break;
    
                case 5:
    
                    /******************************** 6th PWM CYCLE ********************************/
    
                    /* Update PWM parameters */
                    HWREGH(EPWM1_BASE + EPWM_O_TBPRD) = 1200UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPA + 0U + 0x1U) = 600UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPB + 0U + 0x1U) = 600UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBRED) = 25UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBFED) = 25UL;
    
                    /* All writes and reads to bits[5:0] of the DBCTL registers are shadowed. */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL2) = 0x4U;
                    /* Bypass dead band submodule */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL) = 0x0C0B;
    
                    /* Load on time-base counter equals zero */
                    HWREGH(EPWM1_BASE + EPWM_O_AQSFRC) = 0x0;
                    /* Force PWM1 A and B to LOW state */
                    HWREGH(EPWM1_BASE + EPWM_O_AQCSFRC) = 0x0;
    
                    cnt_test += 1U;
    
                    /*******************************************************************************/
                    break;
    
                case 6:
    
                    /******************************** 7th PWM CYCLE ********************************/
    
                    /* Update PWM parameters */
                    HWREGH(EPWM1_BASE + EPWM_O_TBPRD) = 1200UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPA + 0U + 0x1U) = 600UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPB + 0U + 0x1U) = 600UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBRED) = 25UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBFED) = 25UL;
    
                    /* Load on time-base counter equals zero */
                    HWREGH(EPWM1_BASE + EPWM_O_AQSFRC) = 0x0;
                    /* Force PWM1 A and B to LOW state */
                    HWREGH(EPWM1_BASE + EPWM_O_AQCSFRC) = 0x5;
    
                    /* All writes and reads to bits[5:0] of the DBCTL registers are shadowed. */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL2) = 0x4U;
                    /* Bypass dead band submodule */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL) = 0x0C08/*0x0C0A*/;
    
                    cnt_test += 1U;
    
                    /*******************************************************************************/
    
                    break;
    
                case 7:
    
                    /******************************** 8th PWM CYCLE ********************************/
    
                    /* Update PWM parameters */
                    HWREGH(EPWM1_BASE + EPWM_O_TBPRD) = 1200UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPA + 0U + 0x1U) = 600UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPB + 0U + 0x1U) = 600UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBRED) = 25UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBFED) = 25UL;
    
                    /* Load on time-base counter equals zero */
                    HWREGH(EPWM1_BASE + EPWM_O_AQSFRC) = 0x0;
                    /* Force PWM1 A and B to LOW state */
                    HWREGH(EPWM1_BASE + EPWM_O_AQCSFRC) = 0x0;
    
                    /* All writes and reads to bits[5:0] of the DBCTL registers are shadowed. */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL2) = 0x4U;
                    /* Bypass dead band submodule */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL) = /*0x0C0B*/0x0C23;
    
                    cnt_test += 1U;
    
                    /*******************************************************************************/
    
                    break;
    
                case 8:
    
                    /******************************** 9th PWM CYCLE ********************************/
    
                    /* Update PWM parameters */
                    HWREGH(EPWM1_BASE + EPWM_O_TBPRD) = 1200UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPA + 0U + 0x1U) = 600UL;
                    HWREGH(EPWM1_BASE + EPWM_O_CMPB + 0U + 0x1U) = 600UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBRED) = 25UL;
                    HWREGH(EPWM1_BASE + EPWM_O_DBFED) = 25UL;
    
                    /* Load on time-base counter equals zero */
                    HWREGH(EPWM1_BASE + EPWM_O_AQSFRC) = 0x0;
                    /* Force PWM1 A and B to LOW state */
                    HWREGH(EPWM1_BASE + EPWM_O_AQCSFRC) = 0x5;
    
                    /* All writes and reads to bits[5:0] of the DBCTL registers are shadowed. */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL2) = 0x4U;
                    /* Bypass dead band submodule */
                    HWREGH(EPWM1_BASE + EPWM_O_DBCTL) = 0x0C08;
    
                    cnt_test += 1U;
    
                    /*******************************************************************************/
    
                    break;
                default:
                    break;
            }
    
    
    
        /* Clear interrupt flag */
        EPWM_clearEventTriggerInterruptFlag(EPWM1_BASE);
    
        /* Acknowledge this interrupt to receive more interrupts from group 3 */
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3);
    
        /* Disable interrupts and restore registers saved */
        DINT;
        HWREGH(PIECTRL_BASE + PIE_O_IER3) = tempPIEIER;
        GPIO_writePin(33, 0U);
    //    HWREG(GPIODATA_BASE + GPIO_O_GPBCLEAR) = (0x1U << 12U);
    }
    

    如果您有任何问题、敬请告知。

    此致!

    马瑞安

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于无法在 F280039C 器件上使用 PWM 周期的全局负载、对于需要同时更新所有已使用 PWM 的 LLC 或多相 LLC、您建议如何配置 PWM? 请注意、我们具有可变频率、在某些地方还具有可调比较值和可调死区时间值? 全局加载的主要优点是举个例子。

    在我们的 TRM 说明中、我们建议在 ePWM ISR 内写入独立 ePWM HR 寄存器。

    2.对于死区时间寄存器和比较寄存器,HR 寄存器会怎样? 在这些寄存器上使用全局加载是否安全?

    [/报价]

    使用起来很安全。

    3.在哪里可以找到哪些器件有4类和5类 ePWM 的信息?

    [/报价]

    我们在此提供了5类视频以及迁移指南。

    1. 5类视频: https://www.ti.com/video/series/C2000-enhanced-pulse-width-modulator.html?keyMatch=TYPE-5%20EPWM

    2.我们目前拥有5类 ePWM 的器件是 F28P65X。

    4.这种类型5相当新、仅适用于 F28P65X、我将采取措施对 TRM/Errata 进行更新。 为困惑道歉!

    此致!

    马瑞安

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

    您好、Ryan、

    感谢您的支持。 我检查了您的解决方案、但不幸的是、这对我们来说仍然不好。

    在代码中的第7种情况下,我们所做的更改是将 DBCTL=0x0C09设置为 DBCTL=0x0C23[/报价]

    这样、高侧和低侧 PWM 之间没有死区时间。 这是我以前尝试过的方法。 以下是测量结果:

    在第2种代码中,我们所做的更改是将 DBCTL = 0x0C0B 设置为 DBCTL = 0x0C2B[/报价]

    在这种情况下、高侧和低侧 PWM 不再是互补的。 下面对我们需要的内容以及您针对第三个 PWM 周期的解决方案进行了比较:

    我使用  DBCTL 寄存器的不同组合玩了很多次、但未能找到合适的解决方案。 您是否有提供符合我们预期的 PWM 模式的解决方案?

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

    感谢您的所有回答和支持。

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

    Ryan 和 Prarthan、您好!

    您对这个错误是否有任何进展?

    此致、

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

    您好、Haris:

    我们目前仍在努力解决此错误、并试图确定 ePWM 的哪一部分可能出现此错误。 对响应延迟表示歉意。

    对于计数器模式、您是否仅使用向上计数模式?  或者您可以使用向上向下双向计数模式吗?

    此致!

    马瑞安

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

    您好、Ryan、

    通常、对计数器模式没有限制。 也可以使用上-下计数模式。

    感谢您的支持!

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

    您好、Haris:

    在第2种情况下、您可以使用添加了延迟的 CMPB 值、而不是对输出 B 使用极性反转 (CMPB = CMPA +25)
    CMPB = 175 (150 + 25 (延迟))的 DBCTL = 0x0C02
    因此、针对 epwmB 输出旁路死区模块、并针对 epwmA 输出使用相同的死区方法、如下所示。

    因此、您的 OUTMODE 位应该为10。 APath =带红色并 IN Bpath 的非信号路径= INB

    POLSEL 应该为00、根本没有反转。



    谢谢。
    Prarthan.  

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

    Prarthan,您好!

    感谢您的答复。 我会尝试测试您提出的内容。 这正是您认为可以帮助您或您实际测试您的解决方案的东西吗? 您能否确认这解决了尖峰问题? 您能否确认这种行为的实际原因是什么?

    此致、

    哈里斯

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

    Prarthan,您好!

    我测试了您的解决方案。 您的解决方案解决了尖峰问题。 感谢您的支持。 在我们结束该问题之前、您能否简单说明发生此类行为的原因? 我的问题是否得到了这一确认?

    在开关情况2上,您在 PWM_init 中将动作限定符设置为高电平 epwmA 或 H。 并且影子加载动作限定符、用于在 TBCTR 零上将 epwmA 设置为低电平、该限定符将在下一个 TBCLK 边沿生效(请参阅 AQCSFRC 寄存器说明)、 因此、我怀疑该尖峰本质上是计数器零和下一个 TBCLK 边沿之间的时间、在这里、尖峰被限定符设置为高电平、并通过软件强制推低。
    我会确认,通过在之前的周期中更改动作限定符,并在明天返回给你,你也可以尝试相同的在你身边。[/报价]

    提前感谢您!

    哈里斯

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

    您好、Haris:

    我之前建议的不使用极性反转的解决方案基于以下假设:上升沿反转(极性反转) 在 epwmb 上显示为下降沿尖峰。
    我将自行尝试这一点、并在设置极性反转位之前设置信号的上升沿、以查看我之前的假设是否正确。
    我们也会让我们的设计团队确认相同的情况、但这需要一些时间。

    谢谢。
    普拉森