項目要求對工頻電壓進行過零檢測,而爲了防止出現誤差,應該檢測兩次過零點的時間間隔是不是大於一定值,因此需要測量兩次捕捉的相對時間。
進行兩次檢測,第一次檢測到信號就復位計數器,第二次檢測到的結果就是需要的相對時間,可直接使用。
IER |= M_INT4;
// Initialize eCAP1/2/3
InitECap1Gpio();
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 = 1; // continue
ECap1Regs.ECCTL2.bit.STOP_WRAP = 1; // Stop at 2 events
ECap1Regs.ECCTL1.bit.CAP1POL = 0; // Rising edge
ECap1Regs.ECCTL1.bit.CAP2POL = 0; // Rising edge
ECap1Regs.ECCTL1.bit.CTRRST1 = 1; // Difference operation
ECap1Regs.ECCTL1.bit.CTRRST1 = 0; //第一次捕獲,復位計數器,
//第二次得到的值就是需要的時間
ECap1Regs.ECCTL2.bit.SYNCI_EN = 0; // Enable sync in
ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0x10; // Pass through
ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // Enable capture units
ECap1Regs.ECCTL2.bit.REARM = 1;
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter
ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
ECap1Regs.ECEINT.bit.CEVT2 = 1; // 1 events = interrupt
// Enable eCAP INTn in the PIE: Group 3 interrupt 1
PieCtrlRegs.PIEIER4.bit.INTx1 = 1;
每個CAP模塊都有一個PIE中斷,而CAP模塊中又有7個觸發源能夠觸發此中斷,因而在相應的中斷函數中,要進行識別,或者限制的處理
每次CAP模塊捕獲wrap的次數後,對應的引腳則被凍結,停止捕獲,而ECap1Regs.ECCTL2.bit.REARM = 1;則能解除凍結,同時返回到cap1
因此在中斷函數中應該加入
ECap1Regs.ECCLR.bit.CEVT2 = 1;
ECap1Regs.ECCLR.bit.INT = 1;
ECap1Regs.ECCTL2.bit.REARM = 1;// 用於重新啓動CAP