TI中文支持网
TI专业的中文技术问题搜集分享网站

C6748 ECAP0脉冲捕获问题

现用C6748 ECAP0脉冲捕获50Hz脉冲,示波器看波形很正常,但捕获的CAP1计数器值很奇怪是90左右,下面是代码,请FAE帮我看一下,谢谢。

/*
 * main.c
 */
int main(void) {

	unsigned int i,j=0;
	// 外设使能配置
	PSCInit();

	// McBSP 管脚复用配置
	GPIOBankPinMuxSet();

	printf("\r\n===============Test Start=============\r\n");
	printf("Welcome to StartWare ECAP application.\r\n");

	//脉冲捕获初始化
	ECAPInit();

	//DSP中断初始化
	//InterruptInit();

	// 主循环
	for(i=0;i<100;i++)
	{
		for(j=0x00FFFFFF;j>0;j--);// 延时
		ECAPRead();
	}

	for(;;)
	{

	}
}

/****************************************************************************/
/**/
/*PSC 初始化*/
/**/
/****************************************************************************/
void PSCInit(void)
{
	// 使能 ECAP 模块
	// 对相应外设模块的使能也可以在 BootLoader 中完成PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
}
/****************************************************************************/
/**/
/*ECAP 初始化*/
/**/
/****************************************************************************/
void ECAPInit(void)
{
	/*-----设置 ECCTL1-----*/
	// 使能CAP寄存器装载
	ECAPCaptureLoadingEnable(SOC_ECAP_0_REGS);
	// 设置预分频值.
	ECAPPrescaleConfig(SOC_ECAP_0_REGS, 0);
	// 上升沿触发捕获事件
	ECAPCapeEvtPolarityConfig(SOC_ECAP_0_REGS, 0,0,0,0);
	// 输入捕获后重新装载计数器值.
	ECAPCaptureEvtCntrRstConfig(SOC_ECAP_0_REGS, 0,0,0,0);

	/*-----设置 ECCTL2-----*/
	// 连续模式
	ECAPContinousModeConfig(SOC_ECAP_0_REGS);
	// ECAP计数器TSCTR持续计数
		ECAPCounterControl(SOC_ECAP_0_REGS,ECAP_COUNTER_FREE_RUNNING);
	// 禁用同步输出和同步输入
	ECAPSyncInOutSelect(SOC_ECAP_0_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
	// 配置 ECAP 2 为 CAPTURE 模式
	ECAPOperatingModeSelect(SOC_ECAP_0_REGS, ECAP_CAPTURE_MODE);
}
/****************************************************************************/
/**/
/*GPIO 管脚复用配置*/
/**/
/****************************************************************************/
void GPIOBankPinMuxSet(void)
{
	// C6748 有三个增强捕获模块
	//作为捕获功能时管脚方向为输入
	//作为辅助脉宽调制时管脚方向为输出
	*(unsigned int *)0x01C14128=0x20000000;	//ecap0

	*(unsigned int *)0x01C14124=0x40000000;	//ecap1
	//ECAP0 方向设置为输入
	GPIODirModeSet(SOC_GPIO_0_REGS,137,GPIO_DIR_INPUT);	//GPIO8[7]

	//ECAP1方向设置为输入
	GPIODirModeSet(SOC_GPIO_0_REGS,1,GPIO_DIR_INPUT);	//GPIO0[0]
}

/****************************************************************************/
/**/
/*DSP 中断初始化*/
/**/
/****************************************************************************/
void InterruptInit(void)
{
	// 初始化 DSP 中断控制器
	IntDSPINTCInit();

	// 使能DSP 全局中断
	IntGlobalEnable();
}

/****************************************************************************/
/**/
/*取得捕获结果*/
/**/
/****************************************************************************/
unsigned int ECAPRead(void)
{
	unsigned int capvalue1,capvalue2,capvalue3,capvalue4;
	float frequency;

	// Event1 中断标志
	if(ECAPIntStatus(SOC_ECAP_0_REGS, ECAP_CEVT1_INT))
	{
		// 取得捕获计数
		EcapContextSave(SOC_ECAP_0_REGS,0,&ECAPResult);
		capvalue1 = ECAPResult.cap1;
		//capvalue2 = ECAPResult.cap2;
		//capvalue3 = ECAPResult.cap3;
		//capvalue4 = ECAPResult.cap4;

		printf("ECAPRead:capvalue1 = %d\r\n",capvalue1);
		//printf("ECAPRead:capvalue2 = %d\r\n",capvalue2);
		//printf("ECAPRead:capvalue3 = %d\r\n",capvalue3);
		//printf("ECAPRead:capvalue4 = %d\r\n",capvalue4);

		// CAPTRUE 模块 150M 时钟主频
		//frequency  =  150000000/(float)capvalue1;
		//printf("ECAPRead:frequency = %f\r\n",frequency);
		ECAPIntStatusClear(SOC_ECAP_0_REGS, ECAP_ECEINT_CEVT1);
		ECAPOneShotREARM(SOC_ECAP_0_REGS);
		//IntEventClear(SYS_INT_ECAP0);
	}
	return 1;
}
Shine:

跟一下代码,看这些寄存器是否都配置进去了,特别是ECCTL2.CAP/APWM是否为0?

user4948430:

回复 Shine:

单步调试发现,ECAPIntStatusClear(SOC_ECAP_0_REGS, ECAP_ECEINT_CEVT1);这个函数没有将ECAP_ECCLR寄存器中,相应的标志位置1,不知道什么原因

Shine:

回复 user4948430:

ECAPIntStatusClear这个函数有bug.https://e2e.ti.com/support/embedded/starterware/f/790/p/248298/868944

user4948430:

回复 Shine:

我把API改了,

void ECAPIntStatusClear(unsigned int baseAdd, unsigned int flag){ HWREGH(baseAdd + ECAP_ECCLR) = HWREGH(baseAdd + ECAP_ECFLG) & flag;}

但调试发现,ECCLR寄存器相应位仍没有置为1,这是为什么

user4948430:

回复 user4948430:

我看datasheet上 ECCLR寄存器是可读可写的,难道不能读吗

Shine:

回复 user4948430:

ECCLR Always reads back a 0。

所以看一下ECFLG寄存器看一下有没有清除成功。

user4948430:

回复 Shine:

没有清除成功,还是原来的1,难道是我的配置写的有问题?

赞(0)
未经允许不得转载:TI中文支持网 » C6748 ECAP0脉冲捕获问题
分享到: 更多 (0)