Other Parts Discussed in Thread: C2000WARE, SYSCONFIG
这个是ePWM的配置
这个是ECAP2的APWM的配置
这个是ePWM7A的波形和eCAP2的APWM的波形
是哪个配置没配么 一直都对不上
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
以下是我的初始化程序
void ePWM_Config(Uint16 ePWMx,float period,float dutyfactor_A)
{
float count;
if(ePWMx==1) ePWM=&EPwm1Regs; //是初始化ePWM1
else if(ePWMx==2) ePWM=&EPwm2Regs; //是初始化ePWM2
else if(ePWMx==3) ePWM=&EPwm3Regs; //是初始化ePWM3
else if(ePWMx==4) ePWM=&EPwm4Regs; //是初始化ePWM4
else if(ePWMx==5) ePWM=&EPwm5Regs; //是初始化ePWM5
else if(ePWMx==6) ePWM=&EPwm6Regs; //是初始化ePWM6
else if(ePWMx==7) ePWM=&EPwm7Regs; //是初始化ePWM7
dutyfactor_A = 1-dutyfactor_A / 100.0;
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
count=50000000.0/period; //获取计数次数(是带小数的)
(*ePWM).TBPRD = (Uint16)(count); //PWM频率=1/(2*TBPRD)
(*ePWM).CMPA.bit.CMPA = (Uint16)(count * dutyfactor_A); // 初始设定占空比
(*ePWM).TBPHS.all = 0; //忽略同步事件
(*ePWM).TBCTR = 0;
(*ePWM).TBCTL.bit.PRDLD = TB_SHADOW;
(*ePWM).TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //选择上下计数模式
(*ePWM).TBCTL.bit.HSPCLKDIV = TB_DIV1;
(*ePWM).TBCTL.bit.CLKDIV = TB_DIV1;
(*ePWM).TBCTL.bit.FREE_SOFT = 11; //仿真模式位
(*ePWM).TBCTL.bit.SWFSYNC = 1; // Synchronize high resolution phase to start HR period
(*ePWM).TBCTL.bit.PHSEN = TB_DISABLE; // 不使用移相方式
if(ePWMx % 2 == 0) //如果是ePWM2、4、6就配置同步源输输入为上一个ePWM 禁止同步输出
{
(*ePWM).EPWMSYNCINSEL.bit.SEL = ePWMx -1;
(*ePWM).EPWMSYNCOUTEN.all= SYNC_OUT_SRC_DISABLE_ALL;
}
else //如果是ePWM1、3、5、7就配置同步源输出 禁止同步输入
{
(*ePWM).EPWMSYNCINSEL.all = SYNC_IN_SRC_DISABLE_ALL;
(*ePWM).EPWMSYNCOUTEN.bit.ZEROEN= 1;
}
(*ePWM).CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; //A模块比较使能
(*ePWM).CMPCTL.bit.SHDWAMODE = CC_SHADOW; //A模块比较模式
//AQCTLx为输出A比较方式控制寄存器
if(ePWMx % 2 == 0) //如果是ePWM2、4、6就先低后高
{
(*ePWM).AQCTLA.bit.CAU = AQ_CLEAR; //PWM开关高/低
(*ePWM).AQCTLA.bit.CAD = AQ_SET;
}
else
{
(*ePWM).AQCTLA.bit.CAU = AQ_SET; //PWM开关高/低
(*ePWM).AQCTLA.bit.CAD = AQ_CLEAR;
}
EALLOW;
// 开启ePWMx中断进入服务函数
(*ePWM).ETSEL.bit.INTSEL= ET_CTR_PRD; // Select INT on PRD event
(*ePWM).ETSEL.bit.INTEN = 1;// Enable INT
(*ePWM).ETPS.bit.INTPRD = ET_1ST;// Generate INT on 1ST event
EDIS;
}
可能是我没讲清楚 同步的两个PWM频率是一样的 不同步的频率不一样(可能也会在某时频率一样)
解释一下:
1、我的目的是为了将PWM1和PWM2同步 PWM3和PWM4同步 PWM5和PWM6同步 PWM7和eCAP的APWM同步
2、即将这8个PWM分为4组,同组频率相同且同步, 不同组的频率没有直接关系(频率可能在某一时刻会相同,没有硬性要求他们频率必须相同或者同步)
3、当前我是通过示波器看出前3组可以实现同步 第4组PWM7和APWM(eCAP2)不能同步,APWM在PWM7的高电平的一半的位置才发生跳变,就是说他们没有同步,我需要他们同步
4、我发现我不配置EPWMSYNCINSEL.bit.SEL 和 EPWMSYNCOUTEN.bit.ZEROEN 前3组也会同步,所以我不确定是他们本来就可以同步还是因为我配置了所以才同步,这一点可以后面讲,希望可以优先帮忙解答第3点
↑↑↑我实现了EPWM7和ECAP1的同步。
信号从上到下依次是:
ECAP1 : GPIO2
EXTSYNCOUT(EPWM7_SYNC_OUT) : GPIO11
EPWM7B : GPIO13
(EPWM7A-GPIO12)
配置摘要:
时钟都是默认不分频,即一个计数值为10ns; 周期为20us(PRD=2000,EPWM7 up counter mode),EPWM CMPA=1000,CMPB=500,ECAP APWM Compare=1500; EPWM7在CTR=0时输出同步脉冲信号到ECAP1,以及通过OUTPUTXBAR作为EXTSYNCOUT输出到GPIO11(这样就可以通过示波器在外部观察)。
在此基础上做出如下修改,观察现象:
section1:
修改EPWM7的周期TBPRD为2300
可以看到两个波形的周期都变成了23us,并且APWM有明显超前(超前多少取决于TBPRD修改为多少),这个和你说的:
APWM在PWM7的高电平的一半的位置才发生跳变
类似。
因为在TBCTR=0时发生了同步(左侧那根垂直黄色光标右边的紫色同步脉冲处),此时两个计数器的计数值都为0。当APWM的计数值到达2000时,溢出到0重新计数(右侧那根黄色光标处);而EPWM7则计数到2300时才溢出到0,并发出同步脉冲(右侧那根黄色光标右边的紫色同步脉冲处),此时APWM已经计数到了300,同步脉冲到来,重新归0。所以APWM的周期被迫也变为23us,并且由于动作不变,所以便产生了整个波形超前的效果。
*****************************************************************************************************************************************************
section2:
修改APWM的周期PRD为2300
可以看到没有什么变化。因为虽然APWM的PRD为2300,但计数到2000时,就会被EPWM7的同步脉冲清零(右侧那根黄色光标处)。
周期是由发出同步脉冲的模块来控制。
*****************************************************************************************************************************************************
section3:
在section1的基础上,将同步信号的方向对调,即由APWM发出同步脉冲
可以看到周期不受影响,验证了上述结论。
*****************************************************************************************************************************************************
section4:
将TBCLK二分频
紫色脉冲减半
*****************************************************************************************************************************************************
section5:
设置APWM的移相值为200
可以观察到明显的移相。
你一直纠结的地方应该是section1描述的那种情况。
比较值得注意的点在于时钟、周期、移相值这3个地方。
另外sysconfig非常好用。这个工程就是完全用sysconfig配置的,高效便捷,强烈推荐!
再补充一点,经过我的测量,紫色的同步脉冲信号幅值为3.3V,持续100ns左右。