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模块有两个输出通道:ePWMA和ePWMB。这两个通道通常用来输出两个独立的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 周期和频率的计算
向上-向下计数模式(先递增后递减)
上图第一层为TBCTR的值的变化,第二层ePWMxSYNCI时基同步信号输入,第三层为CTR的方向,第四层为CTR值为0的信号,第五层为CRT值为PRD的信号。
当时基同步信号输入激活时,CTR无论是多少,都会被置为TBPHS的值。而TBCTL[PHSDIR]决定了CTR重置后的递增或递减,即CTR方向。当CTR的值达到特殊值时就会触发对应特殊信号,如当CTR达到TBPRD的值时,CTR=PRD信号就会被激活。
向上计数模式(递增)
向下计数模式(递减)
ePWM的AQ模块
ePWM的动作限定模块(AQ)主要负责在特定的时刻根据设定的条件,控制PWM信号输出的高电平、低电平,或是触发事件(例如输出一个特定的状态信号)。这个模块使得PWM输出可以更加灵活地控制,能够应对一些复杂的应用需求。ePWMA 和 ePWMB 的输出信号是由 Action Qualifier (AQ) 模块 来决定的
以下为例:
相关设置代码如下:
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;
待更新...