TMS320F28335: 上电运行后,pwm有几次高低电平翻转,请问是哪里配置出了问题么。

Part Number: TMS320F28335
Other Parts Discussed in Thread: C2000WARE

用示波器测试了pwmA2(黄色)和pwmB2(绿色)引脚,配置的是pwmA2为高电平,pwmB2为低电平,发现pwmA2(黄色)和pwmB2(绿色)开始有三次高低电平翻转(并且死区和我配置的死区时间是一致的),翻转后pwmA2为高电平,pwmB2为低电平,请问为什么上电后有高低电平翻转,需要配置什么才能把这个现象清除。

并且不只是pwmA2和pwmB2有这个现象,pwmA1和pwmB1,pwmA3和pwmB3同样有此现象。

  • 可以参考下C2000WARE里面是否有相关示例,有的话可以对照检查下配置:

    www.ti.com/.../C2000WARE

  • 请贴出完整PWM初始化代码来分析问题

  • 您好,这是我的配置,请帮忙看一下是否配置正确,谢谢。

    *在PCLKCR1寄存器中启用ePWM模块时钟。
    •将TBCLKSYNC设置为0。
    •配置预分频器值和ePWM模式。
    •将TBCLKSYNC设置为1

    DSP2833x_SysCtrl.c文件

    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // Disable TBCLK within the ePWM
    SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1; // ePWM1
    SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1; // ePWM2
    SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1; // ePWM3
    SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1; // ePWM4
    SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1; // ePWM5
    SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1; // ePWM6
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Enable TBCLK within the ePWM

    DSP2833x_EPwm.c文件

    //###########################################################################
    //
    // FILE: DSP2833x_EPwm.c
    //
    // TITLE: DSP2833x ePWM Initialization & Support Functions.
    //
    //###########################################################################
    // $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
    // $Release Date: November 1, 2016 $
    // $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
    // http://www.ti.com/ ALL RIGHTS RESERVED $
    //###########################################################################

    //
    // Included Files
    //
    #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
    #include "DSP2833x_Examples.h" // DSP2833x Examples Include File
    #include "ProjectConfig.h"
    //
    // InitEPwm - This function initializes the ePWM(s) to a known state.
    //
    void
    InitEPwm(void)
    {

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;

    InitEPwm1();
    InitEPwm2();
    InitEPwm3();
    InitEPwm4();
    InitEPwm5();
    InitEPwm6();

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;

    }

    //
    // InitEPwmGpio - This function initializes GPIO pins to function as ePWM pins
    //
    // Each GPIO pin can be configured as a GPIO pin or up to 3 different
    // peripheral functional pins. By default all pins come up as GPIO
    // inputs after reset.
    //
    void
    InitEPwmGpio(void)
    {
    InitEPwm1Gpio();
    InitEPwm2Gpio();
    InitEPwm3Gpio();
    InitEPwm4Gpio();
    InitEPwm5Gpio();
    InitEPwm6Gpio();
    }

    //
    // InitEPwm1Gpio - This function initializes GPIO pins to function as ePWM1
    //
    void
    InitEPwm1Gpio(void)
    {
    EALLOW;

    //
    // Enable internal pull-up for the selected pins
    // Pull-ups can be enabled or disabled by the user.
    // This will enable the pullups for the specified pins.
    // Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; // Enable pull-up on GPIO0 (EPWM1A)
    GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; // Enable pull-up on GPIO1 (EPWM1B)

    //
    // Configure ePWM-1 pins using GPIO regs
    // This specifies which of the possible GPIO pins will be ePWM1 functional
    // pins. Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // Configure GPIO0 as EPWM1A
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // Configure GPIO1 as EPWM1B

    EDIS;
    }

    //
    // InitEPwm2Gpio - This function initializes GPIO pins to function as ePWM2
    //
    void
    InitEPwm2Gpio(void)
    {
    EALLOW;

    //
    // Enable internal pull-up for the selected pins
    // Pull-ups can be enabled or disabled by the user.
    // This will enable the pullups for the specified pins.
    // Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0; // Enable pull-up on GPIO2 (EPWM2A)
    GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0; // Enable pull-up on GPIO3 (EPWM3B)

    //
    // Configure ePWM-2 pins using GPIO regs
    // This specifies which of the possible GPIO pins will be ePWM2 functional
    // pins. Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; // Configure GPIO2 as EPWM2A
    GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1; // Configure GPIO3 as EPWM2B

    EDIS;
    }

    //
    // InitEPwm3Gpio - This function initializes GPIO pins to function as ePWM3
    //
    void
    InitEPwm3Gpio(void)
    {
    EALLOW;

    //
    // Enable internal pull-up for the selected pins
    // Pull-ups can be enabled or disabled by the user.
    // This will enable the pullups for the specified pins.
    // Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAPUD.bit.GPIO4 = 0; // Enable pull-up on GPIO4 (EPWM3A)
    GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0; // Enable pull-up on GPIO5 (EPWM3B)

    //
    // Configure ePWM-3 pins using GPIO regs
    // This specifies which of the possible GPIO pins will be ePWM3 functional
    // pins. Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1; // Configure GPIO4 as EPWM3A
    GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1; // Configure GPIO5 as EPWM3B

    EDIS;
    }

    #if DSP28_EPWM4
    //
    // InitEPwm4Gpio - This function initializes GPIO pins to function as ePWM4
    //
    void
    InitEPwm4Gpio(void)
    {
    EALLOW;

    //
    // Enable internal pull-up for the selected pins
    // Pull-ups can be enabled or disabled by the user.
    // This will enable the pullups for the specified pins.
    // Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0; // Enable pull-up on GPIO6 (EPWM4A)
    GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0; // Enable pull-up on GPIO7 (EPWM4B)

    //
    // Configure ePWM-4 pins using GPIO regs
    // This specifies which of the possible GPIO pins will be ePWM4 functional
    // pins. Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 1; // Configure GPIO6 as EPWM4A
    GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 1; // Configure GPIO7 as EPWM4B

    EDIS;
    }
    #endif // endif DSP28_EPWM4

    #if DSP28_EPWM5
    //
    // InitEPwm5Gpio - This function initializes GPIO pins to function as ePWM5
    //
    void
    InitEPwm5Gpio(void)
    {
    EALLOW;

    //
    // Enable internal pull-up for the selected pins
    // Pull-ups can be enabled or disabled by the user.
    // This will enable the pullups for the specified pins.
    // Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAPUD.bit.GPIO8 = 0; // Enable pull-up on GPIO8 (EPWM5A)
    GpioCtrlRegs.GPAPUD.bit.GPIO9 = 0; // Enable pull-up on GPIO9 (EPWM5B)

    //
    // Configure ePWM-5 pins using GPIO regs
    // This specifies which of the possible GPIO pins will be ePWM5 functional
    // pins. Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 1; // Configure GPIO8 as EPWM5A
    GpioCtrlRegs.GPAMUX1.bit.GPIO9 = 1; // Configure GPIO9 as EPWM5B

    EDIS;
    }
    #endif // endif DSP28_EPWM5

    #if DSP28_EPWM6
    //
    // InitEPwm6Gpio - This function initializes GPIO pins to function as ePWM6
    //
    void
    InitEPwm6Gpio(void)
    {
    EALLOW;

    //
    // Enable internal pull-up for the selected pins
    // Pull-ups can be enabled or disabled by the user.
    // This will enable the pullups for the specified pins.
    // Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAPUD.bit.GPIO10 = 0; // Enable pull-up on GPIO10 (EPWM6A)
    GpioCtrlRegs.GPAPUD.bit.GPIO11 = 0; // Enable pull-up on GPIO11 (EPWM6B)

    //
    // Configure ePWM-6 pins using GPIO regs
    // This specifies which of the possible GPIO pins will be ePWM6 functional
    // pins. Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 1; // Configure GPIO10 as EPWM6A
    GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 1; // Configure GPIO11 as EPWM6B

    EDIS;
    }
    #endif // endif DSP28_EPWM6

    //
    // InitEPwmSyncGpio - This function initializes GPIO pins to function as ePWM
    // Synch pins
    //
    void
    InitEPwmSyncGpio(void)
    {
    EALLOW;

    //
    // Configure EPWMSYNCI
    //

    //
    // Enable internal pull-up for the selected pins
    // Pull-ups can be enabled or disabled by the user.
    // This will enable the pullups for the specified pins.
    // Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0; //Enable pull-up on GPIO6 (EPWMSYNCI)
    //GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0;//Enable pull-up on GPIO32 (EPWMSYNCI)

    //
    // Set qualification for selected pins to asynch only
    // This will select synch to SYSCLKOUT for the selected pins.
    // Comment out other unwanted lines.
    //

    //
    // Synch to SYSCLKOUT GPIO6 (EPWMSYNCI)
    //
    GpioCtrlRegs.GPAQSEL1.bit.GPIO6 = 0;

    //
    //Synch to SYSCLKOUT GPIO32 (EPWMSYNCI)
    //
    //GpioCtrlRegs.GPBQSEL1.bit.GPIO32 = 0;

    //
    // Configure EPwmSync pins using GPIO regs
    // This specifies which of the possible GPIO pins will be EPwmSync
    // functional pins. Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 2; //Enable pull-up on GPIO6(EPWMSYNCI)
    //GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 2;//Enable pull-up on GPIO32(EPWMSYNCI)

    //
    // Configure EPWMSYNC0
    //

    //
    // Enable internal pull-up for the selected pins
    // Pull-ups can be enabled or disabled by the user.
    // This will enable the pullups for the specified pins.
    // Comment out other unwanted lines.
    //

    //
    // Enable pull-up on GPIO6 (EPWMSYNC0)
    //
    //GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0;

    //
    // Enable pull-up on GPIO33 (EPWMSYNC0)
    //
    GpioCtrlRegs.GPBPUD.bit.GPIO33 = 0;

    //
    // Enable pull-up on GPIO6 (EPWMSYNC0)
    //
    //GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 3;

    //
    // Enable pull-up on GPIO33 (EPWMSYNC0)
    //
    GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 2;
    }

    //
    // InitTzGpio - This function initializes GPIO pins to function as Trip Zone
    // (TZ) pins
    //
    // Each GPIO pin can be configured as a GPIO pin or up to 3 different
    // peripheral functional pins. By default all pins come up as GPIO
    // inputs after reset.
    //
    void
    InitTzGpio(void)
    {
    EALLOW;

    //
    // Enable internal pull-up for the selected pins
    // Pull-ups can be enabled or disabled by the user.
    // This will enable the pullups for the specified pins.
    // Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0; // Enable pull-up on GPIO12 (TZ1)
    GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0; // Enable pull-up on GPIO13 (TZ2)
    GpioCtrlRegs.GPAPUD.bit.GPIO14 = 0; // Enable pull-up on GPIO14 (TZ3)
    GpioCtrlRegs.GPAPUD.bit.GPIO15 = 0; // Enable pull-up on GPIO15 (TZ4)

    GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; // Enable pull-up on GPIO16 (TZ5)
    //GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // Enable pull-up on GPIO28 (TZ5)

    GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; // Enable pull-up on GPIO17 (TZ6)
    //GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0; // Enable pull-up on GPIO29 (TZ6)

    //
    // Set qualification for selected pins to asynch only
    // Inputs are synchronized to SYSCLKOUT by default.
    // This will select asynch (no qualification) for the selected pins.
    // Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 3; // Asynch input GPIO12 (TZ1)
    GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 3; // Asynch input GPIO13 (TZ2)
    GpioCtrlRegs.GPAQSEL1.bit.GPIO14 = 3; // Asynch input GPIO14 (TZ3)
    GpioCtrlRegs.GPAQSEL1.bit.GPIO15 = 3; // Asynch input GPIO15 (TZ4)

    GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3; // Asynch input GPIO16 (TZ5)
    //GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3; // Asynch input GPIO28 (TZ5)

    GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch input GPIO17 (TZ6)
    //GpioCtrlRegs.GPAQSEL2.bit.GPIO29 = 3; // Asynch input GPIO29 (TZ6)

    //
    // Configure TZ pins using GPIO regs
    // This specifies which of the possible GPIO pins will be TZ functional
    // pins. Comment out other unwanted lines.
    //
    GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 1; // Configure GPIO12 as TZ1
    GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 1; // Configure GPIO13 as TZ2
    GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 1; // Configure GPIO14 as TZ3
    GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 1; // Configure GPIO15 as TZ4

    GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 3; // Configure GPIO16 as TZ5
    //GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 3; // Configure GPIO28 as TZ5

    GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 3; // Configure GPIO17 as TZ6
    //GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 3; // Configure GPIO29 as TZ6

    EDIS;
    }


    //---------------------------------------------------------------------------
    // Example: InitEPwm:
    //---------------------------------------------------------------------------

    void InitEPwm1(void)
    {

    EPwm1Regs.TBPRD =PWM_PERIOD;// Set timer period 16KHz
    EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
    EPwm1Regs.TBCTR = 0x0000; // Clear counter

    // Setup compare
    EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD>>1; //0% Duty EPwm1Regs.TBPRD*0.8
    EPwm1Regs.CMPB = EPwm1Regs.CMPA.half.CMPA; //50% Duty

    // Setup TBCLK
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up
    EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Disable phase loading
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
    EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    // EPwm1Regs.TBCTL.bit.PHSDIR = TB_UP;

    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO or PRD
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; //0:影子模式; 1:立即模式
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; //计数寄存器CTR=0是装载新的比较值

    // Set actions
    EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A 斩波
    EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;

    // Active Low PWMs - Setup Deadband
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
    EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
    EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;

    // 设置ePWM中断生成
    EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // 在计数为零的时候生成中断事件
    EPwm1Regs.ETSEL.bit.INTEN = 1; // 使能中断
    EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // 每个事件生成中断,选择INTCNT和INTPRD作为事件判断标志

    // 设置ePWM的SOCA的生成
    EPwm1Regs.ETSEL.bit.SOCAEN = 1; //
    EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; //等于PRD时触发启动转换ADC脉冲,上桥臂关闭中间采样 ET_CTR_PRD
    EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST; //电流环16KHz ET_1ST
    EPwm1Regs.ETCLR.bit.SOCA = 1; //Clear SOCA flag

    }


    void InitEPwm2(void)
    {
    EPwm2Regs.TBPRD = EPwm1Regs.TBPRD;
    EPwm2Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
    EPwm2Regs.TBCTR = 0x0000; // Clear counter

    // Setup compare
    EPwm2Regs.CMPA.half.CMPA = EPwm2Regs.TBPRD>>1; //EPwm2Regs.TBPRD; //0% Duty
    EPwm2Regs.CMPB = EPwm2Regs.CMPA.half.CMPA; //0% Duty

    // Setup TBCLK
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up
    EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Disable phase loading
    EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
    EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    // EPwm2Regs.TBCTL.bit.PHSDIR = TB_UP;

    EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO or PRD
    EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    // Set actions
    EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A 斩波
    EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;

    EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
    EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
    EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL;

    }

    void InitEPwm3(void)
    {
    EPwm3Regs.TBPRD = EPwm1Regs.TBPRD;// Set timer period 20KHz=80/4000
    EPwm3Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
    EPwm3Regs.TBCTR = 0x0000; // Clear counter

    // Setup compare
    EPwm3Regs.CMPA.half.CMPA = EPwm3Regs.TBPRD>>1; //50% Duty
    EPwm3Regs.CMPB = EPwm3Regs.CMPA.half.CMPA; //50% Duty

    // Setup TBCLK
    EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up
    EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Disable phase loading
    EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
    EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW;
    EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
    EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    // EPwm3Regs.TBCTL.bit.PHSDIR = TB_UP;

    EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO or PRD
    EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    // Set actions
    EPwm3Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A 斩波
    EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR;

    EPwm3Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
    EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
    EPwm3Regs.DBCTL.bit.IN_MODE = DBA_ALL;

    EALLOW;

    //保护设置
    EPwm3Regs.TZSEL.bit.CBC3 = TZ_ENABLE; //过流保护触发 cycle by cycle

    EPwm3Regs.TZCTL.bit.TZA = TZ_FORCE_LO; //过流时PWMA输出高阻 TZ_HIZ
    EPwm3Regs.TZCTL.bit.TZB = TZ_FORCE_LO; //过流时PWMB输出高阻 TZ_HIZ

    EPwm3Regs.TZEINT.bit.CBC=1;
    EPwm3Regs.TZCLR.all = 0; //清除所有中断标志

    EDIS;

    }

    void InitEPwm4(void)
    {

    EPwm4Regs.TBPRD =EPwm1Regs.TBPRD;// Set timer period 16KHz
    EPwm4Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
    EPwm4Regs.TBCTR = 0x0000; // Clear counter

    // Setup compare
    EPwm4Regs.CMPA.half.CMPA = EPwm4Regs.TBPRD>>1; //50% Duty EPwm1Regs.TBPRD*0.8
    EPwm4Regs.CMPB = EPwm4Regs.CMPA.half.CMPA; //50% Duty

    // Setup TBCLK
    EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up
    EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Disable phase loading
    EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
    EPwm4Regs.TBCTL.bit.PRDLD = TB_SHADOW;
    EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
    EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO or PRD
    EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; //0:影子模式; 1:立即模式
    EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; //计数寄存器CTR=0是装载新的比较值

    // Set actions
    EPwm4Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A 斩波
    EPwm4Regs.AQCTLA.bit.CAD = AQ_CLEAR;

    EPwm4Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
    EPwm4Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
    EPwm4Regs.DBCTL.bit.IN_MODE = DBA_ALL;

    EALLOW;

    //保护设置 TZ4触发保护
    EPwm4Regs.TZSEL.bit.CBC4 = TZ_ENABLE; //过流保护触发 cycle by cycle

    EPwm4Regs.TZCTL.bit.TZA = TZ_FORCE_LO; //过流时PWMA输出高阻 TZ_HIZ
    EPwm4Regs.TZCTL.bit.TZB = TZ_FORCE_LO; //过流时PWMB输出高阻 TZ_HIZ

    EPwm4Regs.TZEINT.bit.CBC=1;
    EPwm4Regs.TZCLR.all = 0; //清除所有中断标志

    EDIS;
    }


    void InitEPwm5(void)
    {
    EPwm5Regs.TBPRD = EPwm1Regs.TBPRD;// Set timer period 20KHz=80/4000
    EPwm5Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
    EPwm5Regs.TBCTR = 0x0000; // Clear counter

    // Setup compare
    EPwm5Regs.CMPA.half.CMPA = EPwm5Regs.TBPRD>>1; //50% Duty
    EPwm5Regs.CMPB = EPwm5Regs.CMPA.half.CMPA; //50% Duty

    // Setup TBCLK
    EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up
    EPwm5Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Disable phase loading
    EPwm5Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
    EPwm5Regs.TBCTL.bit.PRDLD = TB_SHADOW;
    EPwm5Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
    EPwm5Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    // EPwm5Regs.TBCTL.bit.PHSDIR = TB_UP;

    EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO or PRD
    EPwm5Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm5Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm5Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    // Set actions
    EPwm5Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A 斩波
    EPwm5Regs.AQCTLA.bit.CAD = AQ_CLEAR;

    EPwm5Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
    EPwm5Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
    EPwm5Regs.DBCTL.bit.IN_MODE = DBA_ALL;

    // EPwm5Regs.DBCTL.bit.IN_MODE = DBA_ALL; //输入都是PWMA
    // EPwm5Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //B路不取反 IRS2103 负逻辑
    // EPwm5Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //
    //
    // EPwm5Regs.DBRED = Dead_Time; //死区时间1us
    // EPwm5Regs.DBFED = Dead_Time;

    EALLOW;

    //保护设置 TZ4触发保护
    EPwm5Regs.TZSEL.bit.CBC4 = TZ_ENABLE; //过流保护触发 cycle by cycle

    EPwm5Regs.TZCTL.bit.TZA = TZ_FORCE_LO; //过流时PWMA输出高阻 TZ_HIZ
    EPwm5Regs.TZCTL.bit.TZB = TZ_FORCE_LO; //过流时PWMB输出高阻 TZ_HIZ

    EPwm5Regs.TZEINT.bit.CBC=1;
    EPwm5Regs.TZCLR.all = 0;

    EDIS;

    }

    void InitEPwm6(void)
    {
    EPwm6Regs.TBPRD = EPwm1Regs.TBPRD;// Set timer period 20KHz=80/4000
    EPwm6Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
    EPwm6Regs.TBCTR = 0x0000; // Clear counter

    // Setup compare
    EPwm6Regs.CMPA.half.CMPA = EPwm6Regs.TBPRD>>1; //50% Duty
    EPwm6Regs.CMPB = EPwm6Regs.CMPA.half.CMPA; //50% Duty

    // Setup TBCLK
    EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up
    EPwm6Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Disable phase loading
    EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
    EPwm6Regs.TBCTL.bit.PRDLD = TB_SHADOW;
    EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
    EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    // EPwm6Regs.TBCTL.bit.PHSDIR = TB_UP;

    EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO or PRD
    EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    // Set actions
    EPwm6Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A 斩波
    EPwm6Regs.AQCTLA.bit.CAD = AQ_CLEAR;

    EPwm6Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
    EPwm6Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
    EPwm6Regs.DBCTL.bit.IN_MODE = DBA_ALL;


    // EPwm6Regs.DBCTL.bit.IN_MODE = DBA_ALL; //输入都是PWMA
    // EPwm6Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //B路不取反 IRS2103 负逻辑
    // EPwm6Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //
    //
    // EPwm6Regs.DBRED = Dead_Time; //死区时间1us
    // EPwm6Regs.DBFED = Dead_Time;

    EALLOW;

    //保护设置 TZ4触发保护
    EPwm6Regs.TZSEL.bit.CBC4 = TZ_ENABLE; //过流保护触发 cycle by cycle

    EPwm6Regs.TZCTL.bit.TZA = TZ_FORCE_LO; //过流时PWMA输出高阻 TZ_HIZ
    EPwm6Regs.TZCTL.bit.TZB = TZ_FORCE_LO; //过流时PWMB输出高阻 TZ_HIZ

    EPwm6Regs.TZEINT.bit.CBC=1;
    EPwm6Regs.TZCLR.all = 0;
    //清除所有中断标志

    EDIS;

    }

    //
    // End of file
    //