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.

使用CAP模块捕获高电平时间出现问题?



使用CAP对超声波回响信号检测,并同时使用示波器进行观察,发现示波器波形良好,然而CAP采集的数值Period1会有明显的跳动而且伴有负数值出现

void InitECapture()
{
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.ECCTL2.bit.CONT_ONESHT = 0; // 连续模式
ECap1Regs.ECCTL2.bit.STOP_WRAP = 3; // Stop at 4 events
ECap1Regs.ECCTL1.bit.CAP1POL = 0; // Rising edge
ECap1Regs.ECCTL1.bit.CAP2POL = 1; // edge Falling

ECap1Regs.ECCTL1.bit.CTRRST1 = 0; // Difference operation
ECap1Regs.ECCTL1.bit.CTRRST2 = 0; // Difference operation
ECap1Regs.ECCTL2.bit.SYNCI_EN = 0; // disable sync in
ECap1Regs.ECCTL2.bit.SYNCO_SEL = 2; // Pass through

ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // Enable capture units
ECap1Regs.ECCTL2.bit.CAP_APWM=0;

ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter
ECap1Regs.ECEINT.bit.CEVT4 = 1; // 4 events = interrupt

}

__interrupt void ecap1_isr(void)
{

Tst1=ECap1Regs.CAP1;
Tst2=ECap1Regs.CAP2;
Period1=Tst2-Tst1;

ECap1Regs.ECCLR.bit.CEVT4 = 1;
ECap1Regs.ECCLR.bit.INT = 1;

// Acknowledge this interrupt to receive more interrupts from group 4
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
}

  • 没有细看程序,采集结果有明显的跳动,可能是因为没有处理好ECAP计数器溢出的问题

  • 你好   首先你要根据你要的精度    选好通用定时器   配置好定时器的时钟

    你最好先在debug下   看看中断能不能进去   如果能  看看捕获到的值是否对

    这两步没问题了    就根据你的输入信号   进行周期捕获和做差值

    关于差值   你肯定先要判断第二个值是大于第一个还是小于第一个  如果小于说明溢出了  

    在计算时加上0xffff