我现在使用28335的ECAP捕获1MHZ的R232电平信号,在第四次捕获进入中断,计算高电平时间判断数据是0还是1。然后将结果放入32位变量中,再根据标识位获得有效数据。我在实际捕获中捕获的数据经常不准确,请问是什么原因造成的,该如何解决?
void SetCap1Mode(void)
{
// 这里加入了光耦隔离,取反
ECap1Regs.ECCTL1.bit.CAP1POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CAP2POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP3POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CAP4POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST3 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CTRRST4 = EC_ABS_MODE;
// ECap1Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
// ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_ONESHOT; // One-shot
// ECap1Regs.ECCTL2.bit.STOP_WRAP = EC_EVENT2; // Stop at 2 events
ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap1Regs.ECEINT.all=0x0000;//stop all interrupt
ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
ECap1Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}
interrupt void ISRCap1(void)
{
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
t1= ECap1Regs.CAP1;
t2= ECap1Regs.CAP2;
t3= ECap1Regs.CAP3;
t4= ECap1Regs.CAP4;
if(t2-t1 > 75)
{
cratmp1 = (cratmp1 << 1) | 1;
}
// 0
else
{
cratmp1 <<= 1;
}
// 判断标识位
if(cratmp1 << 7 >> 19 == 0x1FFE)
{
// 获得有效数据
craArr1[SensorGetNum] = cratmp1 & 0xFFF;
}
if(t4-t3 > 75)
{
cratmp1 = (cratmp1 << 1) | 1;
}
// 0
else
{
cratmp1 <<= 1;
}
if(cratmp1 << 7 >> 19 == 0x1FFE)
{
craArr1[SensorGetNum] = cratmp1 & 0xFFF;
}
// PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
}
而且我发现,t3的值有时会小于t1的值,这样应该会造成数据顺序不对以及数据丢失的问题,这个是什么原因(计数器未溢出)???