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.

28027怎样捕获精确的外部信号的周期



我采用28027捕获EPWM4的30Khz方波信号,使得EPWM1输出的方波与EPWM的方波同相位,可是我在CAP1中断里面接收到的方波的周期却是2010与实际脉冲个数2000相差10个脉冲个数这是为什么?另外我想问一下在EPWM1中断里面能否读取ECAP中TSCTR的数值作为相位数值 ,但是好像每次读回来的数值也是不一样(在fpwm1=fpwm4时候),怎样实现锁相算法

Uint16 DeltaPhase = 0;
Uint16 FreqValue = 0;

#pragma CODE_SECTION(ECAP1_Isr, "ramfuncs");

interrupt void ECAP1_Isr(void)
{
 if(ECap1Regs.ECFLG.bit.CEVT1 )
 {
     ECap1Regs.ECCLR.bit.CEVT1= 1;
     FreqValue   =  ECap1Regs.CAP1 ;
     ECap1Regs.ECCTL2.bit.REARM = 1;
 }

    PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
 ECap1Regs.ECCLR.bit.INT = 1;//清除中断
}

void InitECap(void)
{
 InitECapGpio();

 ECap1Regs.ECEINT.all  = 0x0000;//清除全局中断
 ECap1Regs.ECCLR.all   = 0xffff ;  //清除中断FLAG
 ECap1Regs.ECCTL1.bit.CAPLDEN  = 0 ;//禁止捕获
    ECap1Regs.ECCTL2.bit.TSCTRSTOP = 2 ;//自由运行
//////////////////////////////////////////////////////////////
    ECap1Regs.ECCTL1.bit.PRESCALE = 0 ;//1:1
    ECap1Regs.ECCTL2.bit.CAP_APWM = 0 ;//CAP Mode
    ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1 ;//one shot

    ECap1Regs.ECCTL1.bit.CAP1POL  = 0 ;//下升沿
    ECap1Regs.ECCTL1.bit.CTRRST1  = 1 ;//复位
    ECap1Regs.ECCTL1.bit.CAP3POL  = 1 ;
    ECap1Regs.ECCTL1.bit.CTRRST3  = 0 ;

    ECap1Regs.CTRPHS = 0x0000;//转载数值0
    ECap1Regs.ECCTL2.bit.SYNCI_EN = 0;
    ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0;        // Pass through

    ECap1Regs.ECCTL1.bit.CAPLDEN = 1;          // Enable capture units
    ECap1Regs.ECCTL2.bit.STOP_WRAP = 0;
    ECap1Regs.ECCTL2.bit.REARM = 1;            //MOD4 = 0 restart

    ECap1Regs.ECEINT.bit.CEVT1 = 1;            // 1 events = interrupt
    ECap1Regs.ECEINT.bit.CEVT3 = 1;            // 1 events = interrupt
    ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;        // Start Counter
    //DINT ;
    EALLOW ;
    PieVectTable.ECAP1_INT = & ECAP1_Isr;//指向地址
    IER |=M_INT4 ;//group 4 int
    PieCtrlRegs.PIEIER4.bit.INTx1 = 1;
    EINT ;
    EDIS ;
    ERTM ;//Debug

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

extern Uint16 DeltaPhase ;
#pragma CODE_SECTION(EPWM1_Time_Isr, "ramfuncs");
extern volatile  FLAG flag ;

interrupt void EPWM1_Time_Isr(void)
{
 DeltaPhase = ECap1Regs.TSCTR;
 flag.Cap_Ok = 1;
 EPwm1Regs.ETCLR.bit.INT = 1;
 PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;


}

 

////////////////////////////////////////////////////////////////////////////////////////////

 EPwm1Regs.ETSEL.bit.INTSEL = 1; //TBCTR = 0;
 EPwm1Regs.ETSEL.bit.INTEN = 1;//enable interrupt
 EPwm1Regs.ETPS.bit.INTPRD = 1 ;//
    EALLOW ;
    PieVectTable.EPWM1_INT= & EPWM1_Time_Isr;//指向地址
    IER |=M_INT3 ;//group 3 int
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;