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.

TMS320F28035: 全桥LLC模块,EPWM1、EPWM2与EPWM3、EPWM4配置是一样的!但是出来的波形EPWM3不知道为什么翻转了?

Part Number: TMS320F28035


我在设计中用到4个PWM模块,其中EPWM1和EPWM2为低压侧全桥模块

EPWM3和EPWM4为高压侧全桥驱动模块

void EPWM1Init(void)
{
    EALLOW;
    
    EPwm1Regs.TBPRD = 200; // 150kHz
    EPwm1Regs.TBPHS.half.TBPHS = 0; // 不相移,计数器与时钟信号同步
    
    EPwm1Regs.TBCTL.bit.FREE_SOFT = 3; // Free run
    
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 采用向上计数模式;
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁用相移功能 Master方式
    
    EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 使用镜像寄存器,不直接操作TBPRD寄存器
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // CTR = ZERO 时,发出同步时钟,
    
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // TBCLK时钟分频; TBCLK = SYSCLKOUT/(CLKDIV * HSPCLKDIV),CLKDIV = 1;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // HSPCLKDIV = 1; TBCLK = SYSCLKOUT(60Mhz);
    
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // CMPA寄存器使用镜像模式;
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // CMPB寄存器使用镜像模式;
    
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD; // 当CTR = 0 时,将CMPA镜像中的数据加载到CMPA执行寄存器中;
    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_PRD; // 当CTR = 0 时,将CMPB镜像中的数据加载到CMPA执行寄存器中;
    
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // 拉高
    EPwm1Regs.AQCTLA.bit.CAD = AQ_SET; // 拉低
    
    EPwm1Regs.AQCTLB.bit.CAU = AQ_SET; // 拉低
    EPwm1Regs.AQCTLB.bit.CAD = AQ_CLEAR; // 拉高
    
    EPwm1Regs.DBCTL.bit.HALFCYCLE = 1;
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // enable Dead-band module DBA_ALL
    EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_LOC; // 上升沿延迟器输出端口不翻转,下升沿延迟器输出端口翻转;
    EPwm1Regs.DBFED = 50; // 死区150*1/60MHz
    EPwm1Regs.DBRED = 50; // 死区150*1/60MHz
    
    EPwm1Regs.CMPA.half.CMPA = 100; // 50%占空比
    
    //在每个PWM的中点位置采样,避开mos开通和关断的干扰对采样的影响
    EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能SOCA触发功能
    EPwm1Regs.ETSEL.bit.SOCASEL = 2; // Cnt=PERIOD信号
    
    EPwm1Regs.ETPS.bit.SOCAPRD = 1; // 立即触发Generate pulse on 1st event
    
    EPwm1Regs.TZFRC.bit.OST = 1;
    EDIS;
}

void EPWM2Init(void)
{
    EALLOW;
    
    EPwm2Regs.TBPRD = 200; // 150kHz
    EPwm2Regs.TBPHS.half.TBPHS = 0; // 不相移,计数器与时钟信号同步
    
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 采用向上计数模式;
    EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 允许相移功能 Master方式
    
    EPwm2Regs.TBCTL.bit.FREE_SOFT = 3; // Free run
    
    EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 使用镜像寄存器,不直接操作TBPRD寄存器
    EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // EPWMxSYNC
    
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; // TBCLK时钟分频; TBCLK = SYSCLKOUT/(CLKDIV * HSPCLKDIV),CLKDIV = 1;
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // HSPCLKDIV = 1; TBCLK = SYSCLKOUT(60Mhz);
    
    EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // CMPA寄存器使用镜像模式;
    EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // CMPB寄存器使用镜像模式;
    
    EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD; // 当CTR = 0 时,将CMPA镜像中的数据加载到CMPA执行寄存器中;
    EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_PRD; // 当CTR = 0 时,将CMPB镜像中的数据加载到CMPA执行寄存器中;
    
    EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; // 拉低
    EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 拉高
    
    EPwm2Regs.AQCTLB.bit.CAU = AQ_CLEAR; // 拉高
    EPwm2Regs.AQCTLB.bit.CAD = AQ_SET; // 拉低
    
    EPwm2Regs.DBCTL.bit.HALFCYCLE = 1;
    EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // enable Dead-band module DBA_ALL
    EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_LOC; // 上升沿延迟器输出端口不翻转,下升沿延迟器输出端口翻转;
    EPwm2Regs.DBFED = 50; // 死区150*1/60MHz
    EPwm2Regs.DBRED = 50; // 死区150*1/60MHz
    
    EPwm2Regs.CMPA.half.CMPA = 100; // 50%占空比
    EPwm2Regs.TZFRC.bit.OST = 1;
    
    EDIS;
}

void EPWM3Init(void)
{
    EALLOW;
    
    EPwm3Regs.TBPRD = 200; // 150kHz
    EPwm3Regs.TBPHS.half.TBPHS = 0; // 不相移,计数器与时钟信号同步
    
    EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 采用向上计数模式;
    EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Load the time-base counter with the phase register when an EPWMxSYNCI input signal occurs
    
    EPwm3Regs.TBCTL.bit.FREE_SOFT = 3; // Free run
    
    EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 使用镜像寄存器,不直接操作TBPRD寄存器
    EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // EPWMxSYNC
    
    EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1; // TBCLK时钟分频; TBCLK = SYSCLKOUT/(CLKDIV * HSPCLKDIV),CLKDIV = 1;
    EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // HSPCLKDIV = 1; TBCLK = SYSCLKOUT(60Mhz);
    
    EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // CMPA寄存器使用镜像模式;
    EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // CMPB寄存器使用镜像模式;
    
    EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD; // 当CTR = 0 时,将CMPA镜像中的数据加载到CMPA执行寄存器中;
    EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_PRD; // 当CTR = 0 时,将CMPB镜像中的数据加载到CMPA执行寄存器中;
    
    EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR; // 拉高
    EPwm3Regs.AQCTLA.bit.CAD = AQ_SET; // 拉低
    
    EPwm3Regs.AQCTLB.bit.CAU = AQ_SET; // 拉低
    EPwm3Regs.AQCTLB.bit.CAD = AQ_CLEAR; // 拉高
    
    EPwm3Regs.DBCTL.bit.HALFCYCLE = 1;
    EPwm3Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // enable Dead-band module DBA_ALL
    EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_LOC; // 上升沿延迟器输出端口不翻转,下升沿延迟器输出端口翻转;
    EPwm3Regs.DBFED = 50; // 死区150*1/60MHz
    EPwm3Regs.DBRED = 50; // 死区150*1/60MHz
    
    EPwm3Regs.CMPA.half.CMPA = 100; // 50%占空比
    EPwm3Regs.TZFRC.bit.OST = 1;
    EDIS;
}

void EPWM4Init(void)
{
    EALLOW;
    
    EPwm4Regs.TBPRD = 200; // 150kHz
    EPwm4Regs.TBPHS.half.TBPHS = 0; // 不相移,计数器与时钟信号同步
    
    EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 采用向上计数模式;
    EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Load the time-base counter with the phase register when an EPWMxSYNCI input signal occurs
    
    EPwm4Regs.TBCTL.bit.FREE_SOFT = 3; // Free run
    
    EPwm4Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 使用镜像寄存器,不直接操作TBPRD寄存器
    EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // EPWMxSYNC
    
    EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1; // TBCLK时钟分频; TBCLK = SYSCLKOUT/(CLKDIV * HSPCLKDIV),CLKDIV = 1;
    EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // HSPCLKDIV = 1; TBCLK = SYSCLKOUT(60Mhz);
    
    EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // CMPA寄存器使用镜像模式;
    EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // CMPB寄存器使用镜像模式;
    
    EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD; // 当CTR = 0 时,将CMPA镜像中的数据加载到CMPA执行寄存器中;
    EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_CTR_PRD; // 当CTR = 0 时,将CMPB镜像中的数据加载到CMPA执行寄存器中;
    
    EPwm4Regs.AQCTLA.bit.CAU = AQ_SET; // 拉低
    EPwm4Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 拉高
    
    EPwm4Regs.AQCTLB.bit.CAU = AQ_CLEAR; // 拉高
    EPwm4Regs.AQCTLB.bit.CAD = AQ_SET; // 拉低
    
    EPwm4Regs.DBCTL.bit.HALFCYCLE = 1;
    EPwm4Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // enable Dead-band module DBA_ALL
    EPwm4Regs.DBCTL.bit.POLSEL = DB_ACTV_LOC; // 上升沿延迟器输出端口不翻转,下升沿延迟器输出端口翻转;
    EPwm4Regs.DBFED = 50; // 死区150*1/60MHz
    EPwm4Regs.DBRED = 50; // 死区150*1/60MHz
    
    EPwm4Regs.CMPA.half.CMPA = 100; // 50%占空比
    EPwm4Regs.TZFRC.bit.OST = 1;
    
    EDIS;
}

这个是逻辑分析仪抓到的波形