TMS320F28069的EPWM模块同步设置

TMS320F28069的EPWM模块内有8个PWM模块,即PWM1,PWM2,...PWM8,如何把根据需要把这几个PWM模块同步起来呢?

1.每个PWM模块内一个TIME-BASE子模块,故首先需要把每个TIME-BASE子模块的时钟TBCLK同步起来。

根据技术参考手册可查知,同步TBCLK的操作如下:

TMS320F28069的EPWM模块同步设置_第1张图片

代码如下:

​   EALLOW;
   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
   EDIS;
   InitEPwm1Example();    
   InitEPwm2Example();
   EALLOW;
   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
   EDIS;
​

2.除了需要TBCLK时钟同步之外,还需要对PWM的相位进行同步,在28069中各个PWM模块使用的是同步信号来进行同步

TMS320F28069的EPWM模块同步设置_第2张图片

上图表明,各个PWM模块之间同步信号的传递,芯片已经通过EPWMxSYNCI与EPWMxSYNCO这二个接口已经连接好了,我们只需要通过寄存器来选择这二个接口的信号即可。从图中可知PWM1模块的EPWMxSYNCI为外部IO信号,这用于二片28069芯片之间的PWM同步。如果只是同一芯片内PWM模块之间的同步,故不需要外部IO信号。

每个EPWM模块的同步输入信号可以有三种:1、EPWMxSYNCI    2、软件强制同步脉冲  3、数字比较事件同步脉冲

其中EPWM1有点特殊,它的EPWMxSYNCI是来自于外部的IO,而其它的EPWM模块的EPWMxSYNCI来自于上一个EPWM模块的EPWMxSYNCO输出信号,即EPWM5模块的EPWMxSYNCI信号来自于 EPWM4模块的EPWMxSYNCO输出信号

每一个PWM模块可以通过配置接收或忽略这个同步输入信号 ,如果EPWM模块的TBCTL[PHSEN]=0,则表示该EPWM模块不接收上一个EPWM模块的同步信号;如果EPWM模块的TBCTL[PHSEN]=1,则当EPWM模块接收到同步信号时,TBPHS的内容自动加载到TBCTR寄存器中,达到与上一个EPWM模块同步的效果。

每一个EPWM模块的同步输出信号(即下一个EPWM模块的EPWMxSYNCI的输入信号)可以通过寄存器TBCTL[SYNCOSEL]来进行选择

现对各个值进行说明:

00 表示EPWM模块的同步输出信号与该模块的同步输入信号相同

01 表示EPWM模块的同步输出信号是该模块的计数器值等于0

10 表示EPWM模块的同步输出信号是该模块的计数器值等于CMPB

11 表示EPWM模块不产生同步输出信号 

如果用户想要实现如下功能:EPWM1模块在CTR=ZERO时同步EPWM2,EPWM3,EPWM4模块,则EPWM1的同步输出信号可以选择CTR=ZERO,则EPWM2的同步输入信号为EPWM1的CTR=ZERO,另外设置EPWM2的同步输出信号设置为00,则EPWM3的同步输入信号也为EPWM1的CTR=ZERO,再设置EPWM3的同步输出信号设置为00,则EPWM4的同步输入信号也为EPWM1的CTR=ZERO; 

上文提到,每一个EPWM模块的同步输入信号有三种:1、EPWMxSYNCI  2、软件强制同步脉冲  3、数字比较事件同步脉冲

但是EPWM模块如何选择自己的同步输入信号呢?假如EPWM3与EPWM4需要进行同步,EPWM3与EPWM2不进行同步信号,

则可以这样设置:由于EPWM3模块的EPWMxSYNCI接口不需要收到任何信号,可以在EPWM2中的TBCTL[SYNCOSEL]设置成11,则不输出同步输出信号给EPWM3。

软件强制同步脉冲信号 ,在EPWM模块中软件强制制步信号与EPWMxSYNCI是或的关系,可以通过EPWM模块内的TBCTL[SWFSYNC]来进行控制,当该位置1时,该模块就会自己产生一个同步脉冲信号给自己使用,而不需要上一个模块的EPWMxSYNCI的同步信号,这就提供了一个在PWM中断程序中,当检测到某个条件满足,需要同步多个EPWM模块时,只需要把TBCTL[SWFSYNC]置位即可。例如:EPWM3,EPWM4,EPWM5是同步模块,当EPWM3的计数器达到某一个值时,可以在EPWM3中断中置位TBCTL[SWFSYNC],则可以马上同步EPWM3,EPWM4,EPWM5;

下面的代码是EPWM1与EPWM2同步,EPWM3与EPWM4同步,EPWM2与EPWM3之间没有同步关系,

其中EPWM1的周期为0x1000,EPWM2的周期为0x2000,EPWM3的周期为0x1010,EPWM2的周期为0x1020,

EPWM1的同步输出信号为CTR=ZERO,EPWM3的同步输出信号为CTR=ZERO;

EPWM1,EPWM2,EPWM3,EPWM4产生中断的条件是各自的计数器值达到TBPRD,分别使用EPwm1TimerIntCount,EPwm2TimerIntCount,EPwm3TimerIntCount,EPwm4TimerIntCount各自表示产生中断的个数;

从代码我们可以分别,当EPWM1到达0x1000产生中断,计数器清零并发送同步信号给EPWM2 ,EPWM2的计数器也清零,故EPWM2的计数器永远不可能到达0x2000,故EPWM2的中断次数为 0;由于EPWM3与EPWM1之间不存在同步信号 ,故EPWM3不受影响,当EPWM3的计数器值达到0x1010时产生中断,计数器清零并发送同步信号给EPWM4,EPWM4的计数器也清零,故EPWM4的计数器永远不可能达到0x1010,故EPWM4的中断次数也为0;

   EALLOW;
   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;      // Stop all the TB clocks
   EDIS;
   // Setup Sync
   EPwm1Regs.TBCTL.bit.SWFSYNC = TB_DISABLE;  
   EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;  
   EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; 
   EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;  
   EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; 
   // Allow each timer to be sync'ed
   EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE;
   EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;
   EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;
   EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE;

   EPwm1Regs.TBPHS.half.TBPHS = 0;
   EPwm2Regs.TBPHS.half.TBPHS = 0;
   EPwm3Regs.TBPHS.half.TBPHS = 0;
   EPwm4Regs.TBPHS.half.TBPHS = 0;

   EPwm1Regs.TBPRD = 0x1000;
   EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;    // Count up
   EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_PRD;     // Select INT on Zero event
   EPwm1Regs.ETSEL.bit.INTEN = PWM1_INT_ENABLE;  // Enable INT
   EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;           // Generate INT on 1st event

   EPwm2Regs.TBPRD = 0x2000;
   EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;     // Count up
   EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_PRD;      // Enable INT on Zero event
   EPwm2Regs.ETSEL.bit.INTEN = PWM2_INT_ENABLE;   // Enable INT
   EPwm2Regs.ETPS.bit.INTPRD = ET_1ST;            // Generate INT on 2nd event

   EPwm3Regs.TBPRD = 0x1010;
   EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;     // Count up
   EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_PRD;      // Enable INT on Zero event
   EPwm3Regs.ETSEL.bit.INTEN = PWM3_INT_ENABLE;   // Enable INT
   EPwm3Regs.ETPS.bit.INTPRD = ET_1ST;            // Generate INT on 3rd event
   EPwm4Regs.TBPRD = 0x1020;
   EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;     // Count up
   EPwm4Regs.ETSEL.bit.INTSEL = ET_CTR_PRD;      // Enable INT on Zero event
   EPwm4Regs.ETSEL.bit.INTEN = PWM4_INT_ENABLE;   // Enable INT
   EPwm4Regs.ETPS.bit.INTPRD = ET_1ST;            // Generate INT on 1st event
   EALLOW;
   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;         // Start all the timers synced
   EDIS;

经过实验可得,确实EPWM1与EPWM3产生中断,EPWM2与EPWM4不产生中断,结果如下:

 

如果想要EPWM1同步EPWM2,EPWM3,EPWM4,当EPWM1计数器值为0时,发送同步信号 给EPWM2,EPWM3,EPWM4,此时EPWM2,EPWM3,EPWM4的计数器也为0,由于EPWM1的周期为0x1000是最小的,故EPWM2,EPWM3,EPWM4永远不可能达到它们各自设置的周期值,故永远不会产生中断。代码上只需要把EPWM2,EPWM3的同步输出信号设置为同步输入信号,即EPWM2,EPWM3,EPWM4的同步输入信号都为EPWM1的CTR=ZERO; 

   // Setup Sync
   EPwm1Regs.TBCTL.bit.SWFSYNC = TB_DISABLE;  
   EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; 
   EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;  // Pass through
   EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;  // Pass through
   EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;  

经过实验可知,确实只有EPWM1产生中断,EPWM2,EPWM3,EPWM4不产生中断

 

 

 

 

 

你可能感兴趣的:(TMS320F28069的EPWM模块同步设置)