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.

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;
}