我采用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;