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.

TMS320F28335: 外部方波信号通过Ecap模块产生中断,配置EPWM输出信号时的同步问题

Part Number: TMS320F28335


首先,我的外部输入信号是一个频率为60hz的,0到3.3V的一个方波信号。

其次,我的Ecap模块配置如下。可以看到,此处我将Ecap1(GPIO24)与Ecap2(GPIO25)使能,且均工作在捕获工作状态下。其中Ecap1用于捕获外部输入方波信号的4个上升沿,而Ecap2用于捕获外部输入方波信号的4个下降沿。Ecap1和Ecap2四个捕获中断均使能。

void SetCap1Mode(void)
{
  ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
  ECap1Regs.ECCTL1.bit.CAP2POL = EC_RISING;
  ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING;
  ECap1Regs.ECCTL1.bit.CAP4POL = EC_RISING;
  ECap1Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE;
  ECap1Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE;
  ECap1Regs.ECCTL1.bit.CTRRST3 = EC_ABS_MODE;
  ECap1Regs.ECCTL1.bit.CTRRST4 = EC_ABS_MODE;
  ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
  ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
  ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
  ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
  ECap1Regs.CTRPHS=0;
  ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
  ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;
  ECap1Regs.ECEINT.all=0x0000;//stop all interrupt
  ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
  ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
  ECap1Regs.ECEINT.bit.CEVT1=1;// Enable all interrupt
  ECap1Regs.ECEINT.bit.CEVT2=1;
  ECap1Regs.ECEINT.bit.CEVT3=1;
  ECap1Regs.ECEINT.bit.CEVT4=1;
}


void SetCap2Mode(void)
{
  ECap2Regs.ECCTL1.bit.CAP1POL = EC_FALLING;
  ECap2Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
  ECap2Regs.ECCTL1.bit.CAP3POL = EC_FALLING;
  ECap2Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
  ECap2Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE;
  ECap2Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE;
  ECap2Regs.ECCTL1.bit.CTRRST3 = EC_ABS_MODE;
  ECap2Regs.ECCTL1.bit.CTRRST4 = EC_ABS_MODE;
  ECap2Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
  ECap2Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
  ECap2Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
  ECap2Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
  ECap2Regs.CTRPHS=0;
  ECap2Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
  ECap2Regs.ECCTL2.bit.SYNCI_EN = 1;
  ECap2Regs.ECEINT.all=0x0000;//stop all interrupt
  ECap2Regs.ECCLR.all=0xFFFF;//clare all flag
  ECap2Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
  ECap2Regs.ECEINT.bit.CEVT1=1;// Enable all interrupt
  ECap2Regs.ECEINT.bit.CEVT2=1;
  ECap2Regs.ECEINT.bit.CEVT3=1;
  ECap2Regs.ECEINT.bit.CEVT4=1;
}

我的Epwm模块配置如下,其中Epwm1输出一个频率为50kHz的PWM波,AB口输出波形相同,上下沿处设置死区。Epwm2通过AQ子模块设置,将A口置高,B口置低。

void EPwmSetup()
{
    InitEPwm1Gpio();
    EALLOW;
    		SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;

    		//counting method
    		EPwm1Regs.TBCTL.bit.CTRMODE = 2;//up&down
    		EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1;
    		EPwm1Regs.TBCTL.bit.CLKDIV = 0;//TBCLK=75M
    		EPwm1Regs.TBCTL.bit.PHSEN=TB_DISABLE;
//    		EPwm1Regs.TBCTL.bit.PHSDIR=TB_UP;
    		EPwm1Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_IN;

    		//Comp set
    		EPwm1Regs.CMPCTL.bit.SHDWAMODE = 1;
    		EPwm1Regs.CMPCTL.bit.SHDWBMODE = 1;
    		//Action qualifier
    		EPwm1Regs.AQCTLA.bit.CAU = 2;//CTR=CMPA up,epwmA set
    		EPwm1Regs.AQCTLA.bit.CAD = 1;//CTR=CMPA down,epwmA reset
    		EPwm1Regs.AQCTLB.bit.CAU = 2;
    		EPwm1Regs.AQCTLB.bit.CAD = 1;
    		EPwm1Regs.AQSFRC.all = 0;//software enforcement
    		EPwm1Regs.AQCSFRC.all = 0;
    		//DB set
    		EPwm1Regs.DBCTL.bit.OUT_MODE = 3;
    		EPwm1Regs.DBCTL.bit.IN_MODE = 2;
    		EPwm1Regs.DBCTL.bit.POLSEL = 0;//

    	    //Epwm1 config
    		EPwm1Regs.TBSTS.all = 0;
    		EPwm1Regs.TBPHS.half.TBPHS = 0;
    		EPwm1Regs.TBCTR = 0;

    		EPwm1Regs.TBPRD = 750;//PWM1 freq=50khz
    		EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD * 0.4;//D=0.6 D=1-(CMPA/TBPRD) D=1-Dset
    		EPwm1Regs.DBRED = 45;//up dead time=0.6u
    		EPwm1Regs.DBFED = 45;//dowm dead time=0.6u

    		SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    		EDIS;

    	InitEPwm2Gpio();
    	EALLOW;
    			SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
//    			SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;
    			//counting method
    			EPwm2Regs.TBCTL.bit.CTRMODE = 2;//up&down count
    			EPwm2Regs.TBCTL.bit.HSPCLKDIV = 2;
    			EPwm2Regs.TBCTL.bit.CLKDIV = 6;
//    			EPwm2Regs.TBCTL.bit.PRDLD =TB_SHADOW;
//    			EPwm2Regs.TBCTL.bit.PHSEN=TB_ENABLE;
//    			EPwm2Regs.TBCTL.bit.PHSDIR=TB_UP;
//    			EPwm2Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_IN;

    			//Comp set
    			EPwm2Regs.CMPCTL.bit.SHDWAMODE = 1;
    			EPwm2Regs.CMPCTL.bit.SHDWBMODE = 1;
//    			EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
//    			EPwm2Regs.CMPCTL.bit.LOADBMODE = 0;

    			//Action qualifier
    			EPwm2Regs.AQCTLA.bit.CAU = 2;//CTR= up,epwmA set
    			EPwm2Regs.AQCTLA.bit.CAD = 2;
    			EPwm2Regs.AQCTLB.bit.CAU = 1;//CTR= down,epwmB reset
    			EPwm2Regs.AQCTLB.bit.CAD = 1;
    			EPwm2Regs.AQSFRC.all = 0;//software enforcement
//    			EPwm2Regs.AQCSFRC.bit.CSFA = 2;
//    			EPwm2Regs.AQCSFRC.bit.CSFB = 2;
    			//DB set
    			EPwm2Regs.DBCTL.bit.OUT_MODE = 3;//enable DB
    			EPwm2Regs.DBCTL.bit.IN_MODE = 2;//pwmA_DB up;pwmB_DB down
    			EPwm2Regs.DBCTL.bit.POLSEL =0;//A低B高,cap斩波

    		    //Epwm1 config
    			EPwm2Regs.TBSTS.all = 0;
    			EPwm2Regs.TBPHS.half.TBPHS = 0;
    			EPwm2Regs.TBCTR = 0;

//
    			EPwm2Regs.TBPRD = 5000;//PWM2 freq=60hz
    			EPwm2Regs.CMPA.half.CMPA = EPwm2Regs.TBPRD * 0.5;//D=0.5
//    			EPwm2Regs.DBRED = 100;//up dead time=0.5m
//    			EPwm2Regs.DBFED = 100;//dowm dead time=0.5m

    			SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    			EDIS;
}

最后,主程序中断配置如下。根据外部输入60hz的方波信号配置Epwm1和Epwm2信号。此时Epwm1输出频率变为60Hz,其中半个周期为高频信号,半个周期置低,AB口输出互补。Epwm2输出通过重新配置AQ子模块各寄存器参数,对其进行斩波,输出一个频率与外部输入信号相同的PWM信号。

interrupt void ISRCap1(void)
{
//    m++;
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;//0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断
	ECap1Regs.ECCLR.all=0xFFFF;//写0XFFFF对CAP1中断清除寄存器进行清除操作
    EALLOW;
	EPwm1Regs.AQCTLA.bit.CAU = 2;//CTR=CMPA up,epwmA set
	EPwm1Regs.AQCTLA.bit.CAD = 1;//CTR=CMPA down,epwmA reset
	EPwm1Regs.AQCTLB.bit.CAU = 1;
	EPwm1Regs.AQCTLB.bit.CAD = 1;

	EPwm2Regs.AQCTLA.bit.CAU = 1;//CTR=CMPA up,epwmA set
    EPwm2Regs.AQCTLA.bit.CAD = 1;//CTR=CMPA down,epwmA set
    EPwm2Regs.AQCTLB.bit.CAU = 2;
    EPwm2Regs.AQCTLB.bit.CAD = 2;


    EDIS;


}
interrupt void ISRCap2(void)
{
//    n++;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;//0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断
    ECap2Regs.ECCLR.all=0xFFFF;//写0XFFFF对CAP2中断清除寄存器进行清除操作
    EALLOW;
    EPwm1Regs.AQCTLA.bit.CAU = 1;//CTR=CMPA up,epwmA reset
	EPwm1Regs.AQCTLA.bit.CAD = 1;//CTR=CMPA down,epwmA reset
	EPwm1Regs.AQCTLB.bit.CAU = 2;
	EPwm1Regs.AQCTLB.bit.CAD = 1;


		  EPwm2Regs.AQCTLA.bit.CAU = 2;//CTR=CMPA up,epwmA reset
		  EPwm2Regs.AQCTLA.bit.CAD = 2;//CTR=CMPA down,epwmA reset
		  EPwm2Regs.AQCTLB.bit.CAU = 1;
		  EPwm2Regs.AQCTLB.bit.CAD = 1;


	EDIS;
}

我的问题有两点,且不知怎么解决:

1. 由输出波形可见,其中Epwm1输出可以与外界信号可以同步。而Epwm2输出似乎与外界信号存在相移,始终无法与外部输入信号同步。(图1中黄色紫色波形为epwm1AB口输出,绿色为外部输入方波,蓝色为Epwm2 A口输出波形)

2. 可以看到epwm的输出波形存在短暂丢失,似乎我的捕获程序丢失了信号。(图2、3)

      

  • 您好我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!

  • 1. 由输出波形可见,其中Epwm1输出可以与外界信号可以同步。而Epwm2输出似乎与外界信号存在相移,始终无法与外部输入信号同步。(图1中黄色紫色波形为epwm1AB口输出,绿色为外部输入方波,蓝色为Epwm2 A口输出波形)

    您好,从您给出的动图中,黄色和紫色波形的行为与蓝色信号相似。 您希望看到的是什么内容(可能在图表中) ,这样我们可以清楚地了解问题是什么。

    2. 可以看到epwm的输出波形存在短暂丢失,似乎我的捕获程序丢失了信号。(图2、3)

    该问题是重复发生的吗还是只发生一次? 输出有问题的低电平持续了多久?

  • 感谢您的回复,目前我的第一个问题已经解决

    1. 从给出的动图1和动图2可以看到明显的区别。我要求黄、蓝(epwm2 AB口输出)绿色(epwm1口输出)能够与我的 紫色(外部输入方波)信号同步。可以看到图1的绿色信号和紫色同步,而黄、蓝信号无法与紫色信号同步。而图2实现了四个信号同步。

    解决方法:我此处epwm2是通过AQ置高置低输出后,再通过外部方波信号输入ecap,在产生的中断程序中配置epwm2的信号。但需要注意的是,此处epwm2的TB寄存器参数不可随意配置,应该与epwm1中TB寄存器参数保持一致,使得中断在同一基准时钟下完成,方不会产生epwm2中断信号不同步的结果。

       

    2. 从波形来看,此问题是重复出现的。通过多次截取dsp输出波形(图3、4、5)可以看到,捕获丢失的问题似乎是非周期性的。通常丢失一个或两个周期的信号。

    可能的解决方法:在ecap的配置过程中我使能了四个中断事件(CAP1-4),但实际上只需使用一个中断即可,尝试减少中断事件是否会有影响?

        

  • 补充一下,目前此处两图中绿色波形为外部方波信号(蓝紫为epwm1 AB口信号,橙色为epwm2信号),可以看到,第一张图是正常捕获的情况,第二张图是捕获丢失的情况

       

  • 嗯好的感谢您提供的信息,已经跟进给工程师啦。

  • 您好,建议您最好使用一个 ECAP,不要2个 (监控 2 个上升沿和 2 个下降沿)。

    可能的解决方法:在ecap的配置过程中我使能了四个中断事件(CAP1-4),但实际上只需使用一个中断即可,尝试减少中断事件是否会有影响?

    该方法是否经过测试? 工程师以为您这边只使用了 eCAP1 和 2,请问下为什么使能 ecap3 和 4 的中断?

  • 感谢回复,这边已经将问题解决。我这边说明不够明确误导了您,这边CAP1-4并不是ecap1-4,而是每个ecap模块都存在的四个捕获寄存器。此处我的意思是,只使能四个寄存器接收到的连续捕获事件中的一个(如CEVT1)。事实证明,这个方法依然行不通,因为并非我的中断程序有误影响了我的捕获过程。

    折衷的解决方法:将原本的ecap 连续(continuous)工作模式 改为 单次(oneshot)工作模式,之后再通过中断程序重新对ECCTL2.REARM进行置位。单次捕获模式配置更加简单,不容易出现配置失误导致连续捕获过程中出现的丢失捕获信号的问题。