ePWM相关记录

此处记录TMS320F28x ePWM模块相关理解。

此处先介绍几个名词概念和知识点

TBCTR(时基计数器):时基计数器保存当前的计数值,用于生成PWM信号周期。

TBPRD(时基周期寄存器):这个寄存器存储PWM信号的周期值,计数器从0开始计数,直到TBPRD的值。

TBPHS(时基相位寄存器):这个寄存器控制PWM信号的相位偏移,主要用于调整PWM信号的起始点,以便实现相位调节。

CMPA(比较寄存器A):这是第一个比较寄存器,用来与TBCTR比较产生信号。

CMPB(比较寄存器B):这是第二个比较寄存器,用来与TBCTR比较产生信号。

ePWMxSYNCI(时基同步信号输入):输入脉冲用于时基计数器与之前的 ePWM模块同步,每个 ePWM 模块可以通过软件配置为使用或者忽略此信号。ePMW1的时基同步信号输入来自外部引脚,而ePMW2的时基同步信号输入来自ePMW1的时基同步信号输出,之后的ePWM模块3、4等以此类推。

ePWMxSYNCO(时基同步信号输出):输出脉冲用于随后的 ePWM 的时基计数器同步。该输出信号取决于以下三个事件之一,具体如何选择看软件配置:

  • ePWMxSYNCI
  • TBCTR=CMPB
  • TBCTR=0

ePWM模块有两个输出通道:ePWMAePWMB。这两个通道通常用来输出两个独立的PWM信号,并且它们可以在很多应用场景中协同工作,尤其是在需要多相控制(例如三相电机控制)时。ePWMA和ePWMB不仅可以独立配置和控制,还可以通过不同的方式组合,以实现更复杂的波形和信号输出。

四个关键的条件信号:

CTR=PRD:时基计数值等于周期值信号。

CTR=zero:时基计数值等于零值信号。

CTR=CMPB:时基计数值等于比较寄存器B信号。

CTR=CMPA:时基计数值等于比较寄存器A信号。

以上四个信号被ePWM的AQ模块使用,来决定ePWMA和ePWMB的波形(EPwm1Regs.AQCTLA)。

以上四个信号被ePWM的ET模块使用,来决定ePWM的中断选择条件(EPwmxRegs.ETSEL.bit.INTSEL)。

 

 

 

ePWM的模式

ePWM模块通常有多种模式,比如单极性模式双极性模式

a) 单极性模式(TB_COUNT_UPDOWN模式)

该模式下ePWMA和ePWMB是完全独立的,可以为每个通道设置不同的占空比、频率和波形。通过独立的CMPA和CMPB寄存器,可以设置两个通道输出不同的PWM信号。

b) 双极性模式(TB_COUNT_UP模式)

该模式下ePWMA和ePWMB之间的关系通常由相位控制来决定,在这个模式下,两个信号之间会有180度的相位差。这在三相电机控制和其他多相负载驱动中非常常见。

 

 

 

ePWM 周期和频率的计算

ePWM 的频率是由时基周期寄存器值(TBPRD)和时基计数器的计数模式(TBCTRL)共同决定的。时基计数器的计数模式有向上计数(递增)模式、向下计数(递减)模式、向上-向下计数(先递增后递减)模式。下边就以周期寄存器设置为 4(TBPRD=4)举例说明。

向上-向下计数模式(先递增后递减)

在此模式下,时基计数器先从 0 开始向上计数(递增)直到递增到周期寄存器的值 4,然后再由 4 向下计数(递减)直到减到 0,再重复以上动作,如下图所示:

在此模式下,随着同步信号的到来,时基模块的输出波形有两种情形,需要通过设置相位方向 TBCTL[PHSDIR]来确定。如果 TBCTL[PHSDIR]=0 时,那么当同步信号到来时,对应的输出波形如下图所示:

如果 TBCTL[PHSDIR]=1 时,那么当同步信号到来时,对应的输出波形如下图所示:

 上图第一层为TBCTR的值的变化,第二层ePWMxSYNCI时基同步信号输入,第三层为CTR的方向,第四层为CTR值为0的信号,第五层为CRT值为PRD的信号。

当时基同步信号输入激活时,CTR无论是多少,都会被置为TBPHS的值。而TBCTL[PHSDIR]决定了CTR重置后的递增或递减,即CTR方向。当CTR的值达到特殊值时就会触发对应特殊信号,如当CTR达到TBPRD的值时,CTR=PRD信号就会被激活。

向上计数模式(递增)

在此模式下,时基计数器从 0 开始向上计数,直到递增到周期寄存器的值后,时基计数器会自动复位到 0,重复以上动作,如下图所示:

在此模式下,随着同步信号的到来,时基模块的输出波形如下所示:

向下计数模式(递减)

在此模式下,时基计数器首先加载周期寄存器的值,然后开始递减,直到减到 0 时,自动在加载周期寄存器的值,重复以上动作,如下图所示:

在此模式下,随着同步信号的到来,时基模块的输出波形如下所示:

 

 

ePWM的AQ模块

ePWM的动作限定模块(AQ)主要负责在特定的时刻根据设定的条件,控制PWM信号输出的高电平、低电平,或是触发事件(例如输出一个特定的状态信号)。这个模块使得PWM输出可以更加灵活地控制,能够应对一些复杂的应用需求。ePWMA 和 ePWMB 的输出信号是由 Action Qualifier (AQ) 模块 来决定的

以下为例:

单边非对称波形(ePWMxA 和 ePWMxB 独立调制,高电平有效)如下所示:

 相关设置代码如下:

EPwm6Regs.TBPRD = tbprd;//设定 PWM 周期为 tbprd+1 个 TBCLK 时钟周期
EPwm6Regs.CMPA.half.CMPA = 350;//比较器 A 的值为 350
EPwm6Regs.CMPB = 200;//比较器 B 的值为 200
EPwm6Regs.TBPHS.half.TBPHS = 0;//相位寄存器清零
EPwm6Regs.TBCTR = 0x0000;//时基计数器清零
EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//设定为增计数模式
EPwm6Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁止相位控制
EPwm6Regs.TBCTL.bit.PRDLD = TB_SHADOW;//TBPRD 寄存器采用影子寄存器模式
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;//禁止同步信号
EPwm6Regs.TBCTL.bit.HSPCLKDIV=TB_DIV1;//设定 TBCLK=SYSCLK 时基时钟=系统时钟
EPwm6Regs.TBCTL.bit.CLKDIV=TB_DIV1;
EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;//设定 CMPA 为影子寄存器模式
EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//在 CTR=Zero 时装载
EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm6Regs.AQCTLA.bit.ZRO = AQ_SET;//CTR=ZERO 时,将 ePWM6A 置高
EPwm6Regs.AQCTLA.bit.CAU = AQ_CLEAR;//CTR=CAU 时,将 ePWM6A 置低
EPwm6Regs.AQCTLB.bit.ZRO = AQ_SET;//CTR=ZERO 时,将 ePWM6B 置高
EPwm6Regs.AQCTLB.bit.CBU = AQ_CLEAR;//CTR=CAU 时,将 ePWM6B 置低
EPwm6Regs.CMPA.half.CMPA = Duty1A;//调整 ePWM6A 的占空比
EPwm6Regs.CMPB = Duty1B;//调整 ePWM6B 的占空比

 

 再举一个更常用的例子,配置代码如下:

   EALLOW;
   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;      // Stop all the TB clocks
   EDIS;
   InitEPwmGpio();
   EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;  // sent SYN signal
   EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE;
   EPwm1Regs.TBPHS.half.TBPHS = 0;
   EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
   EPwm1Regs.TBPRD = PWM1_TIMER_TBPRD;  //时基计数器周期
   EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;   //采用上下计数模式,即时基计数器先增后减
   EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;           //使用影子寄存器装填TBPRD(即当计数器为0时将影子寄存器值填入TBPRD中,缓冲保险)
   EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;      //比较寄存器A使用影子装填模式,原理同上
   EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;      //比较寄存器B使用影子装填模式,
   EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;    //比较寄存器A影子装填模式装载条件选择,此处为CTR=0时装载
   EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;    //比较寄存器B影子装填模式装载条件选择,此处为CTR=0时装载
   EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;//AQ_SET;    //向上计数时,CTR=CMPA,ePWM1A输出低电平
   EPwm1Regs.AQCTLA.bit.CAD = AQ_SET; //AQ_CLEAR;   //向下计数时,CTR=CMPA,ePWM1A输出高电平
   EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;//AQ_SET;    //向上计数时,CTR=CMPB,ePWM1B输出低电平
   EPwm1Regs.AQCTLB.bit.CBD = AQ_SET; //AQ_CLEAR;   //向下计数时,CTR=CMPB,ePWM1B输出高电平
   EPwm1Regs.DBCTL.bit.OUT_MODE = DB_DISABLE;       //禁用死区模块,即ePWM1A和ePWM1B不经过死区模块
   // interrupt source set up
   EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_PRD;     //ePWM1中断产生条件:CTR=PRD
   EPwm1Regs.ETSEL.bit.INTEN = PWM1_INT_ENABLE;  //使能ePWM1中断
   EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;           //在第一个事件发生时产生中断信号,即每次满足中断产生条件都发出中断信号

上述代码配置了epwm1,同时配置了epwm1中断相关的内容。注意代码中配置了epwm1A的高低电平与CMPA绑定,epwm1B的高低电平与CMPB绑定,具体变化见代码注释。

可以得知,我们仅需要改变CMPA和CMPB的值,即可改变epwm1A和epwm1B的占空比

即:EPwm1Regs.CMPA.half.CMPA = (Uint16)(TBPRD*DCR);  //TBPRD为周期值,DCR为占空比值(0≤DCR≤1)

  EPwm1Regs.CMPB = (Uint16)(TBPRD*DCR);

对于中断,无论epwm是否使能GPIO,只要使能epwm中断,其就会产生,需注意在中断向量表绑定中断函数:PieVectTable.EPWM1_INT = &Main_Ctrl;

同时使能PIE级中断 PieCtrlRegs.PIEIER3.bit.INTx1 = PWM1_INT_ENABLE;

 

待更新...

posted @ 2024-11-06 16:18  _Explosion!  阅读(16)  评论(0编辑  收藏  举报