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.

TMS320F28069: eCAP issues

Part Number: TMS320F28069
Other Parts Discussed in Thread: C2000WARE

Hi experts,

My customer uses the eCAP module to capture the Hall pulse width. The three hall signals are connected to three eCAP modules. He needs to enter the interrupt on the rising and falling edges of the hall signal, and obtain the time width before the hop edge approaches in the interrupt, as shown in the following figure.

1. During the test, he found that when capturing two edges for a  hall signal and opening its corresponding interrupt, only the first interrupt is triggered. The second interrupt is neither triggered nor captured, please help to confirm whether this is a configuration issue or the eCAP module characteristics?

            ECap1Regs.ECCTL1.bit.CAP1POL      = 0;        

            ECap1Regs.ECCTL1.bit.CAP2POL      = 1;        

            ECap1Regs.ECEINT.bit.CEVT1            = 1;        

            ECap1Regs.ECEINT.bit.CEVT2            = 1;       

2. He needs to capture the edge interval between XOR of any two of the three hall, as shown in t1~t6 in the figure below.

The current practice is to use SyncIn and SyncOut of eCap1~eCap3, and to set the interrupt entry to the same for the three eCap. Use ECap1Regs.ECCTL2.bit.SWSYNC=1, when entering the interrupt;

Force synchronization of the TSCTR registers for three eCaps, and due to issue 1, the compromise is to invert the ECap1Regs.ECCTL1.bit.CAP1POL value in the interrupt to cause the hardware to respond to the next edge trigger.

Because software action is required, this approach may have inaccurate capture times.

So the question is:

Is there a better way to realize: three hall connect to three eCAP, and any edge after the XOR of the eCAP1~eCAP3 signal can enter the interrupt, and capture the time of the last edge to this edge after the XOR to reach this edge?

I upload the codes below and looking forward for your reply. Thank you!



void eCap_Isr_Config(void)
{
    /*PIE 中断向量表重定向,注意寄存器受保护*/
    EALLOW;
    PieVectTable.ECAP1_INT	= &ECAP_ISR;  /* ECAP1INT */
    PieVectTable.ECAP2_INT	= &ECAP_ISR;  /* ECAP1INT */
    PieVectTable.ECAP3_INT	= &ECAP_ISR;  /* ECAP1INT */
    EDIS;

	// Enable CPU INT4 which is connected to ECAP1-4 INT:
	IER |= M_INT4;

	// Enable eCAP INTn in the PIE: Group 3 interrupt 1-6
    PieCtrlRegs.PIEIER4.bit.INTx1 	= 1;  //使能ECAP1_INT中断    ////////
    PieCtrlRegs.PIEIER4.bit.INTx2 	= 1;  //使能ECAP2_INT中断    ////////
    PieCtrlRegs.PIEIER4.bit.INTx3 	= 1;  //使能ECAP3_INT中断    ////////

	//PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;

}

void eCapRegConfig(void)
{


	/* 配置eCap1 */
	ECap1Regs.ECEINT.all 			= 0x0000;  	//禁止所有CAP的中断
	ECap1Regs.ECCLR.all 			= 0xFFFF;  	//清除所有CAP的中断标志
	ECap1Regs.ECCTL1.bit.CAPLDEN 	= 0;    	//0-停止捕获寄存器CAP1~4的更新;1-使能捕获寄存器CAP1~4的更新;
	ECap1Regs.ECCTL2.bit.TSCTRSTOP	= 0;  		//0-计数器停止计数;1-计数器开始计数;
	ECap1Regs.ECCTL2.bit.CAP_APWM	= 0;		//0-eCAP工作于捕获模式;1-eCAP工作于APWM模式;

	ECap1Regs.CTRPHS				= 0xFFFFFFFF - ECAP_INIT_PHASESHIFT;

	ECap1Regs.ECCTL1.bit.PRESCALE 	= 0;		

	
	ECap1Regs.ECCTL2.bit.CONT_ONESHT	= 1;    //0-连续模式;1-单次模式
	ECap1Regs.ECCTL2.bit.STOP_WRAP 		= 0;    //

	ECap1Regs.ECCTL1.bit.CAP1POL 	= 0;        // 0-上升沿捕获;1-下降沿捕获
	ECap1Regs.ECCTL1.bit.CTRRST1 	= 0;        // 0-捕获后不重置计数器;1-捕获后重置计数器

	ECap1Regs.ECCTL1.bit.CAP2POL 	= 1;        // 0-上升沿捕获;1-下降沿捕获
	ECap1Regs.ECCTL1.bit.CTRRST2 	= 0;        // 0-捕获后不重置计数器;1-捕获后重置计数器

	ECap1Regs.ECCTL1.bit.CAP3POL 	= 0;        // 0-上升沿捕获;1-下降沿捕获
	ECap1Regs.ECCTL1.bit.CTRRST3 	= 0;        // 0-捕获后不重置计数器;1-捕获后重置计数器

	ECap1Regs.ECCTL1.bit.CAP4POL 	= 1;        // 0-上升沿捕获;1-下降沿捕获
	ECap1Regs.ECCTL1.bit.CTRRST4 	= 0;        // 0-捕获后不重置计数器;1-捕获后重置计数器



	ECap1Regs.ECCTL2.bit.SYNCI_EN	= 1;        //0-屏蔽同步输入操作;1-允许计数器根据SYNCI信号或S/W事件从TSCTR寄存器中加载;
												

	ECap1Regs.ECCTL2.bit.SYNCO_SEL	= 0;        //0-选择同步输入事件为同步信号输出;1-当CTR=PRD事件发生时同步信号输出;2,3-屏蔽同步信号输出;

	ECap1Regs.ECCTL1.bit.CAPLDEN	= 1;        //0-停止捕获寄存器CAP1~4的更新;1-使能捕获寄存器CAP1~4的更新;

	ECap1Regs.ECCTL2.bit.TSCTRSTOP	= 1;        //0-计数器停止计数;1-计数器开始计数;

	ECap1Regs.ECCTL2.bit.REARM 		= 1;        //单次重加载控制.0-无影响;1-等待停止触发

	ECap1Regs.ECEINT.bit.CTROVF 	= 1;        // 使能溢出中断

	ECap1Regs.ECEINT.bit.CEVT1 		= 1;        // 使能捕获事件1中断
	/*实测ECEINT.bit.CEVT1~ECEINT.bit.CEVT4 仅一个有效,无法多次触发中断,但在数值大的中断里可以读取到前序列的标志位*/


	/* 配置eCap2 */
	ECap2Regs.ECEINT.all 			= 0x0000;  	//禁止所有CAP的中断
	ECap2Regs.ECCLR.all 			= 0xFFFF;  	//清除所有CAP的中断标志
	ECap2Regs.ECCTL1.bit.CAPLDEN 	= 0;    	//0-停止捕获寄存器CAP1~4的更新;1-使能捕获寄存器CAP1~4的更新;
	ECap2Regs.ECCTL2.bit.TSCTRSTOP	= 0;  		//0-计数器停止计数;1-计数器开始计数;
	ECap2Regs.ECCTL2.bit.CAP_APWM	= 0;		//0-eCAP工作于捕获模式;1-eCAP工作于APWM模式;


	ECap2Regs.CTRPHS				= 0xFFFFFFFF - ECAP_INIT_PHASESHIFT;

	ECap2Regs.ECCTL1.bit.PRESCALE 	= 0;		


	ECap2Regs.ECCTL2.bit.CONT_ONESHT	= 1;    //0-连续模式;1-单次模式
	ECap2Regs.ECCTL2.bit.STOP_WRAP 		= 0;    

	ECap2Regs.ECCTL1.bit.CAP1POL 	= 0;        // 0-上升沿捕获;1-下降沿捕获
	ECap2Regs.ECCTL1.bit.CTRRST1 	= 0;        // 0-捕获后不重置计数器;1-捕获后重置计数器

	ECap2Regs.ECCTL1.bit.CAP2POL 	= 1;        // 0-上升沿捕获;1-下降沿捕获
	ECap2Regs.ECCTL1.bit.CTRRST2 	= 0;        // 0-捕获后不重置计数器;1-捕获后重置计数器

	ECap2Regs.ECCTL1.bit.CAP3POL 	= 0;        // 0-上升沿捕获;1-下降沿捕获
	ECap2Regs.ECCTL1.bit.CTRRST3 	= 0;        // 0-捕获后不重置计数器;1-捕获后重置计数器

	ECap2Regs.ECCTL1.bit.CAP4POL 	= 1;        // 0-上升沿捕获;1-下降沿捕获
	ECap2Regs.ECCTL1.bit.CTRRST4 	= 0;        // 0-捕获后不重置计数器;1-捕获后重置计数器



	ECap2Regs.ECCTL2.bit.SYNCI_EN	= 1;        //0-屏蔽同步输入操作;1-允许计数器根据SYNCI信号或S/W事件从TSCTR寄存器中加载;
											

	ECap2Regs.ECCTL2.bit.SYNCO_SEL	= 0;        //0-选择同步输入事件为同步信号输出;1-当CTR=PRD事件发生时同步信号输出;2,3-屏蔽同步信号输出;

	ECap2Regs.ECCTL1.bit.CAPLDEN	= 1;        //0-停止捕获寄存器CAP1~4的更新;1-使能捕获寄存器CAP1~4的更新;

	ECap2Regs.ECCTL2.bit.TSCTRSTOP	= 1;        //0-计数器停止计数;1-计数器开始计数;

	ECap2Regs.ECCTL2.bit.REARM 		= 1;        //单次重加载控制.0-无影响;1-等待停止触发

	ECap2Regs.ECEINT.bit.CTROVF 	= 0;        // 使能溢出中断
	ECap2Regs.ECEINT.bit.CEVT1 		= 1;        // 使能捕获事件1中断
	

	/* 配置eCap3 */
	ECap3Regs.ECEINT.all 			= 0x0000;  	//禁止所有CAP的中断
	ECap3Regs.ECCLR.all 			= 0xFFFF;  	//清除所有CAP的中断标志
	ECap3Regs.ECCTL1.bit.CAPLDEN 	= 0;    	//0-停止捕获寄存器CAP1~4的更新;1-使能捕获寄存器CAP1~4的更新;
	ECap3Regs.ECCTL2.bit.TSCTRSTOP	= 0;  		//0-计数器停止计数;1-计数器开始计数;
	ECap3Regs.ECCTL2.bit.CAP_APWM	= 0;		//0-eCAP工作于捕获模式;1-eCAP工作于APWM模式;


	ECap3Regs.CTRPHS				= 0xFFFFFFFF - ECAP_INIT_PHASESHIFT;

	ECap3Regs.ECCTL1.bit.PRESCALE 	= 0;		//输入信号分频(0~62可选),指对需要捕猎的信号进行分频,而非对TSCTR分频


	ECap3Regs.ECCTL2.bit.CONT_ONESHT	= 1;    //0-连续模式;1-单次模式
	ECap3Regs.ECCTL2.bit.STOP_WRAP 		= 0;    

	ECap3Regs.ECCTL1.bit.CAP1POL 	= 0;        // 0-上升沿捕获;1-下降沿捕获
	ECap3Regs.ECCTL1.bit.CTRRST1 	= 0;        // 0-捕获后不重置计数器;1-捕获后重置计数器

	ECap3Regs.ECCTL1.bit.CAP2POL 	= 1;        // 0-上升沿捕获;1-下降沿捕获
	ECap3Regs.ECCTL1.bit.CTRRST2 	= 0;        // 0-捕获后不重置计数器;1-捕获后重置计数器

	ECap3Regs.ECCTL1.bit.CAP3POL 	= 0;        // 0-上升沿捕获;1-下降沿捕获
	ECap3Regs.ECCTL1.bit.CTRRST3 	= 0;        // 0-捕获后不重置计数器;1-捕获后重置计数器

	ECap3Regs.ECCTL1.bit.CAP4POL 	= 1;        // 0-上升沿捕获;1-下降沿捕获
	ECap3Regs.ECCTL1.bit.CTRRST4 	= 0;        // 0-捕获后不重置计数器;1-捕获后重置计数器



	ECap3Regs.ECCTL2.bit.SYNCI_EN	= 1;        //0-屏蔽同步输入操作;1-允许计数器根据SYNCI信号或S/W事件从TSCTR寄存器中加载;
												

	ECap3Regs.ECCTL2.bit.SYNCO_SEL	= 2;        //0-选择同步输入事件为同步信号输出;1-当CTR=PRD事件发生时同步信号输出;2,3-屏蔽同步信号输出;

	ECap3Regs.ECCTL1.bit.CAPLDEN	= 1;        //0-停止捕获寄存器CAP1~4的更新;1-使能捕获寄存器CAP1~4的更新;

	ECap3Regs.ECCTL2.bit.TSCTRSTOP	= 1;        //0-计数器停止计数;1-计数器开始计数;

	ECap3Regs.ECCTL2.bit.REARM 		= 1;        //单次重加载控制.0-无影响;1-等待停止触发(在下述情况下将强制为单次模式:复位Mod4计数器为0;允许Mod4计数器持续计数;使能捕捉寄存器加载)

	ECap3Regs.ECEINT.bit.CTROVF 	= 0;        // 使能溢出中断
	ECap3Regs.ECEINT.bit.CEVT1 		= 1;        // 使能捕获事件1中断


	/* 产生一次同步 */
	ECap1Regs.ECCTL2.bit.SWSYNC		= 1;

}


__interrupt void ECAP_ISR(void)    
{
	Uint32	eCap_Delta_Time;

	volatile struct ECAP_REGS *pECapxRegs[3]	= {&ECap1Regs,&ECap2Regs,&ECap3Regs};

	ECap1Regs.ECCTL2.bit.SWSYNC		= 1;	//复位TSCTR的值为CTRPHS

	/* 确认中断源 */
	if(ECap1Regs.ECFLG.bit.INT)			
	{
		CapSourceIndex = 1;
	}
	else if(ECap2Regs.ECFLG.bit.INT)	
	{
		CapSourceIndex = 2;
	}
	else if(ECap3Regs.ECFLG.bit.INT)	
	{
		CapSourceIndex = 3;
	}
	else
	{
		CapSourceIndex = 0;
	}

	if(CapSourceIndex > 0)
	{
		if(pECapxRegs[CapSourceIndex-1]->ECFLG.bit.CEVT1)	//边沿中断
		{
			eCap_Delta_Time = pECapxRegs[CapSourceIndex-1]->CAP1 - pECapxRegs[CapSourceIndex-1]->CTRPHS;

			pECapxRegs[CapSourceIndex-1]->ECCTL1.bit.CAP1POL = ~pECapxRegs[CapSourceIndex-1]->ECCTL1.bit.CAP1POL;

			/* user code start */
			
			
			
			
			/* user code end */
			
			pECapxRegs[CapSourceIndex-1]->ECCLR.bit.CEVT1 = 1;
		}

		if(pECapxRegs[CapSourceIndex-1]->ECFLG.bit.CTROVF)	//溢出中断
		{
			/* user code start */
			
			
			
			
			/* user code end */
			pECapxRegs[0]->ECCLR.bit.CTROVF = 1;
			pECapxRegs[1]->ECCLR.bit.CTROVF = 1;
			pECapxRegs[2]->ECCLR.bit.CTROVF = 1;
		}

		pECapxRegs[CapSourceIndex-1]->ECCLR.bit.INT = 1;
		pECapxRegs[CapSourceIndex-1]->ECCTL2.bit.REARM = 1;		//0-不响应下一次信号边沿中断;1-响应下一次信号边沿中断

	}

}