我在设计中用到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;
}
这个是逻辑分析仪抓到的波形


