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.
为什么ECAP模块第一次值不一样,以后的每次输出的值都一样,需要改什么吗?
//�������趨�������жϣ���ʱ���ж���CAP1/83,CAP3/99���������ж�// //���ж�ʱ���ж���44�Ų�������ʱ���źţ�����99��CAP3����ͨ�� //CAP1/2/3/4 �ĸ��������Է������ڣ��������������ʱ����ԣ���� //������2K�����źŲ�Ƶ������жϣ����Լ��ȷ����������Ƶ�ʲ��� //�����ij��� //########################################################################### // // FILE: cap.c,revised by lijunke on 2011-08-20 wuxi // // // Decription: 32λʱ����������4��ʱ���stamp,4�������� // // //########################################################################### #include "DSP280x_Device.h" // DSP280x Headerfile Include File #include "DSP280x_Examples.h" // DSP280x Examples Include File #include "cap.h" unsigned int sk=0; //����SPWM�ź����Ҳ��źż�������// //unsigned int chop_flag=0; //������H�ſ��ƣ�ǿ��ePWM H&L // //Uint32 ECap1IntCount=0; Uint32 ECap1PassCount=0; unsigned int dividN=512; //512�����������Ҳ����SPWM// int sine,cosine; unsigned int TSt1,TSt2,TSt3,TSt4; //�����أ��½��أ������أ��½��أ� unsigned int DutyOnTime1,DutyOffTime1; unsigned int Period1; void InitCAPInt(void) { EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.ECAP1_INT = &Ecap1Isr; //83�� PieVectTable.ECAP3_INT = &Ecap3Isr; //99�� PieVectTable.ECAP2_INT = &Ecap2Isr; //91�� EDIS; // This is needed to disable write to EALLOW protected registers } //--------------------------------------------------------------------------- // void InitECapture(void) //--------------------------------------------------------------------------- // ��������ģʽ���ĸ��¼��ֱ�Ϊ�������½����������½������ģʽ void InitECapture(void) { #if CAP3USE ECap3Regs.ECCTL1.bit.CAP1POL = EC_RISING; //������ ECap3Regs.ECCTL1.bit.CAP2POL = EC_FALLING; //�½��� ECap3Regs.ECCTL1.bit.CAP3POL = EC_RISING; //������ ECap3Regs.ECCTL1.bit.CAP4POL = EC_FALLING; //�½��� //==================================================================== ECap3Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE; ECap3Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE; ECap3Regs.ECCTL1.bit.CTRRST3 = EC_ABS_MODE; ECap3Regs.ECCTL1.bit.CTRRST4 = EC_ABS_MODE; //����ʱ����������ģʽ //==================================================================== ECap3Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE; ECap3Regs.ECCTL1.bit.PRESCALE = EC_DIV10; ECap3Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE; //��������������ʽ,TSTCR���ϼ���,FFFFFFFF֮��ת,������һ���������������־ //CTROVF ECap3Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS; ECap3Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS; ECap3Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE; //ECap3Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN; // ���TSTCR����,ʮ���� ECap3Regs.ECCTL2.bit.TSCTRSTOP = EC_FREEZE ; // ���TSTCR����,ʮ���� ECap3Regs.ECEINT.bit.CEVT4 = 1; // ���ĸ��ش����¼�// #endif #if CAP1USE ECap1Regs.ECEINT.all = 0x0000; // Disable all capture interrupts ECap1Regs.ECCLR.all = 0xFFFF; // Clear all CAP interrupt flags ECap1Regs.ECCTL1.bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; // Make sure the counter is stopped // Configure peripheral registers ECap1Regs.ECCTL1.bit.CAP1POL = 0; // �����ź������ز��� ECap1Regs.ECCTL1.bit.CAP2POL = 1; // Rising edge ECap1Regs.ECCTL1.bit.CAP3POL = 0; // Falling edge ECap1Regs.ECCTL1.bit.CAP4POL = 1; // Rising edge ECap1Regs.ECCTL1.bit.CTRRST1 = 1; // Difference operation ECap1Regs.ECCTL1.bit.CTRRST2 = 1; // Difference operation ECap1Regs.ECCTL1.bit.CTRRST3 = 1; // Difference operation ECap1Regs.ECCTL1.bit.CTRRST4 = 1; // Difference operation ECap1Regs.ECCTL2.bit.SYNCI_EN = 1; // Enable sync in ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0; // Pass through ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1; // One-shot ECap1Regs.ECCTL2.bit.STOP_WRAP = 3; // Stop at 1 events ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter ECap1Regs.ECCTL2.bit.REARM = 1; // arm one-shot ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads ECap1Regs.ECEINT.bit.CEVT1 = 1; // ��һ���������ж� #endif #if CAP2USE ECap2Regs.ECEINT.all = 0x0000; // Disable all capture interrupts ECap2Regs.ECCLR.all = 0xFFFF; // Clear all CAP interrupt flags ECap2Regs.ECCTL1.bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads ECap2Regs.ECCTL2.bit.TSCTRSTOP = 0; // Make sure the counter is stopped // Configure peripheral registers ECap2Regs.ECCTL1.bit.CAP1POL = 0; // ������ ECap2Regs.ECCTL1.bit.CAP2POL = 1; // �½��� ECap2Regs.ECCTL1.bit.CAP3POL = 0; // ������ ECap2Regs.ECCTL1.bit.CAP4POL = 1; // �½��� ECap2Regs.ECCTL1.bit.CTRRST1 = 1; // Difference operation ECap2Regs.ECCTL1.bit.CTRRST2 = 1; // Difference operation ECap2Regs.ECCTL1.bit.CTRRST3 = 1; // Difference operation ECap2Regs.ECCTL1.bit.CTRRST4 = 1; // Difference operation ECap2Regs.ECCTL2.bit.SYNCI_EN = 1; // Enable sync in ECap2Regs.ECCTL2.bit.SYNCO_SEL = 0; // Pass through ECap2Regs.ECCTL2.bit.CONT_ONESHT=1; // One-shot ECap2Regs.ECCTL2.bit.STOP_WRAP = 3; // Stop at 1 events ECap2Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter ECap2Regs.ECCTL2.bit.REARM = 1; // arm one-shot ECap2Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads ECap2Regs.ECEINT.bit.CEVT2 = 1; // �����ź�ͬʱ����CAP1/2 #endif } //--------------------------------------------------------------------------- // unsigned int ECapRiseToFall(void) //--------------------------------------------------------------------------- // This function captures the phase time // ����ֵ��Ϊ��128*10ns�Ļ� // /* unsigned int ECapRiseToFall(void) // { unsigned long temp; //cap1���������¼��Ĵ���Ϊ0 //cap2���½����¼��Ĵ���Ϊ�������ص��½��ص�ʱ��,���������λ��Ϣ temp = ECap3Regs.CAP2; return (unsigned int)(temp>>7); //����7λ������ֵ��Ϊ��128*10ns�Ļ� } //--------------------------------------------------------------------------- // unsigned int ECapRiseToRise(void) //--------------------------------------------------------------------------- // This function captures the frequency time // ����ֵ��Ϊ��128*10ns�Ļ� // unsigned int ECapRiseToRise(void) { unsigned long temp; //cap2�Ĵ����������ص��½��ص�ʱ�� //cap3�Ĵ����ǵ�һ���½��ص��ڶ��������ص�ʱ�� //�����ʹ���Ƶ����Ϣ temp = ((ECap3Regs.CAP2)+(ECap3Regs.CAP3)); return (unsigned int)(temp>>7); //����7λ������ֵ��Ϊ��128*10ns�Ļ� } */ //========================================================================== interrupt void Ecap1Isr(void) { ECap3Regs.ECCTL2.bit.TSCTRSTOP = 1; //�����ź������ص�������eCap3������ GpioDataRegs.GPADAT.bit.GPIO1=~GpioDataRegs.GPADAT.bit.GPIO1; ECap1PassCount++; //cap�жϼ��// ECap1Regs.ECCLR.bit.CEVT1 = 1; //CET1 flag conditon Clear;// ECap1Regs.ECCLR.bit.INT = 1; ECap1Regs.ECCTL2.bit.REARM = 1; //int flag ��0����������ж� // Acknowledge this interrupt to receive more interrupts from group 4/// PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; // } interrupt void Ecap2Isr(void) { ECap3Regs.ECCTL2.bit.TSCTRSTOP = 0; //����ʱ�䵽���ر�Ecap3Regs������ //cap�жϼ��// ECap2Regs.ECCLR.bit.CEVT2 = 1; //CET1 flag conditon Clear;// ECap2Regs.ECCLR.bit.INT = 1; ECap2Regs.ECCTL2.bit.REARM = 1; //int flag ��0����������ж� // Acknowledge this interrupt to receive more interrupts from group 4/// PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; // } //============================================================================ interrupt void Ecap3Isr(void) { //ECap3Regs.ECCTL2.bit.TSCTRSTOP = 0; TSt1 = ECap3Regs.CAP1; // Fetch Time-Stamp captured at t1 TSt2 = ECap3Regs.CAP2; // Fetch Time-Stamp captured at t2 TSt3 = ECap3Regs.CAP3; // Fetch Time-Stamp captured at t3 TSt4 = ECap3Regs.CAP4; // Fetch Time-Stamp captured at t4 Period1 = TSt3-TSt1; // 10004--->10^8/10004=10^4=10khz DutyOnTime1 = TSt2-TSt1; // Calculate On time DutyOffTime1= TSt3-TSt2; // Calculate Off time ECap3Regs.ECCLR.bit.CEVT4 = 1; ECap3Regs.ECCLR.bit.INT = 1; ECap3Regs.ECCTL2.bit.REARM = 1; //GpioDataRegs.GPADAT.bit.GPIO1=~GpioDataRegs.GPADAT.bit.GPIO1; // Acknowledge this interrupt to receive more interrupts from group 4 PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; }