TMS2833X之ePWM模块_3

上一篇讲述到了ePWM模块中的计数比较子模块(CC)、动作限定子模块(AQ),如下图所示,AQ模块出来的高低电平信号还需要经过死区模块(DB)、斩波模块(PC)、及错误联防信号(TZ)后才输出EPWMxA/B波形,所以就接着逐一介绍这些子模块。
TMS2833X之ePWM模块_3

1.死区模块(DB)

1.1 为什么要产生死区模块

PWM电路通常是一个全桥控制或者半桥控制的电路,如下图所示是一个典型的三相全桥PWM控制逆变电路原理图,该电路由三桥臂6个开关管组成,每个开关管由调制电路产生的PWM波形驱动,同一桥臂上的开关管由一对互补的PWM波控制,但是由于同一桥臂上的开关管不能同时导通,否则会导致短路。理想情况下产生的互补PWM波如下图2所示,但是实际情况下,在脉冲信号形成时,总有上升、下降时间,V1在上升沿时开通,V4在下降沿时关断,为了避免造成同一桥臂上下开关管同时导通的情况,V1延时一个V4下降沿的时间再上升,这样就能够避免同时导通的情况,但是在这个时间区域内,有可能两个管子都是不在导通状态,所以这个时间区域称为死区。
TMS2833X之ePWM模块_3TMS2833X之ePWM模块_3

1.2 F2833x死区模块的作用机制

F2833x死区模块通过三路开关控制量决定,如下图所示,寄存器BDCTL[IN_MODE]决定进入死区模块PWM波形的来源,DBCTL[POLSEL]决定从上升沿延迟和下降沿延迟模块输出的波形是否进行高低电平的极性翻转,DBCTL[OUT_MODE]决定进入死区模块PWM波形是否需要处理。
TMS2833X之ePWM模块_3死区模块的寄存器具体解释如下表所示:
TMS2833X之ePWM模块_3
几种典型死区模块寄存器开关选择及对应波形如下图所示:
TMS2833X之ePWM模块_3TMS2833X之ePWM模块_3

2.斩波模块(PC)

PWM斩波器子模块通过高频脉冲信号来调制由动作模块和死区模块产生的PWM波形,该功能主要用于基于脉冲变压器的门级驱动型功率器件控制中,如下图所示,载波时钟来源于系统时钟SYSCLKOUT,他的频率和占空比由CHPCTL寄存器中的[CHPFREQ]和[CHPDUTY]进行控制。一次模块OSHT主要用于提供较大能量的第一个脉冲,迅速有效地开通功率开关,接下来的脉冲只要维持开关的状态就行,例如多数功率器件的开通电流要比维持电流大得多。单触发模块的第一个脉冲的宽度可以由CHPCTL寄存器中的[OSHTWTH]位来控制。[CHEPHN]用来使能是否使用斩波模块。
TMS2833X之ePWM模块_3
如下图所示为EPWMxA/B经斩波模块后的输出波形,即将EPWMxA/B与斩波高频信号PSCLK进行与操作。
TMS2833X之ePWM模块_3
如下图所示为EPWMxA/B经斩波模块(带有第一次脉冲宽度调节)后的输出波形,即将EPWMxA/B与斩波高频信号PSCLK进行与操作,再与首次脉冲(通过OSHTWTH设置占空比)进行或操作。
TMS2833X之ePWM模块_3

3.代码实例

以下代码为实例中的关于EPWM的设置,主要涉及时基模块、比较模块、动作模块、死区模块、触发模块。

void InitEPwm1Example()
{
   EPwm1Regs.TBPRD = 6000;                        // 周期计数器计数周期为6000
   EPwm1Regs.TBPHS.half.TBPHS = 0x0000;           // 相位寄存器值为0
   EPwm1Regs.TBCTR = 0x0000;                      // 计数值清零

   // 时基子模块设置
   EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 采用增减计数的计数方式
   EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // 禁止加载相位寄存器
   EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4;       // 预分频设置
   EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV4;
  
  // 比较子模块设置
   EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;    // 使用影子寄存器,且每次计数值为0时从影子寄存器加载比较计数值
   EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
   EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
   EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
   EPwm1Regs.CMPA.half.CMPA = 3000;               //CMPA的值设置为3000

   // 动作子模块设置
   EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;             // PWM1A计数每次递增过程中等于CMPA时CTR_CMPA输出高电平
   EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;           // PWM1A计数每次递减过程中等于CMPA时CTR_CMPA输出低电平

   EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;          // PWM1B计数每次递增过程中等于CMPA时CTR_CMPB输出高电平
   EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;            // PWM1A计数每次递减过程中等于CMPA时CTR_CMPB输出低电平

   // 死区子模块设置
   EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;//死区模块使能双边缘死区延时操作
   EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_LO;      //ePWMxA和ePWMxB都进行极性翻转
   EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;        //ePWMxA时双边沿延时的输入沿,从以上可判断出该死区选择主低模式输出
   EPwm1Regs.DBRED = EPWM1_MIN_DB;               //上升沿延时时间设置
   EPwm1Regs.DBFED = EPWM1_MIN_DB;               //下降沿延时时间设置
   EPwm1_DB_Direction = DB_UP;

   // 触发子模块设置
   EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;     // CTR_ZERO事件发生时触发INT中断
   EPwm1Regs.ETSEL.bit.INTEN = 1;                // EPWM INT中断使能
   EPwm1Regs.ETPS.bit.INTPRD = ET_3RD;           // 每发生三次中断触发一次INT中断
}