F28335共有6組eCAP模塊,每個eCAP不但具有捕獲功能,而且還可用作PWM輸出功能。F28335捕獲模塊的主要特征如下:
1. 150MHz系統時鍾的情況下,32位時基的時間分辨率為6.67ns;
2. 4組32位的時間標志寄存器;
3. 4級捕獲事件序列,可以靈活配置捕獲事件邊沿極性;
4. 四級觸發事件均可以產生中斷;
5. 軟件配置一次捕獲可以最多得到4個捕獲時間;
6. 可連續循環4級捕獲;
7. 絕對時間捕獲;
8. 不同模式的時間捕獲;
9. 所有捕獲都發生在一個輸入引腳上;
10. 如果eCAP模塊不作捕獲使用,可以配置成一個單通道輸出的PWM模式。
eCAP模塊中一個捕獲通道完成一次捕獲任務,需要以下關鍵資源:
1、專用捕獲輸入引腳;
2、32位時基(計數器);
3、4*32位時間標簽捕獲寄存器;
4、4級序列器,與外部eCAP引腳的上升/下降沿同步;
5、4個事件可獨立配置邊沿極性;
6、輸入捕獲信號預定標(2-62);
7、一個2位的比較寄存器,一次觸發后可以捕獲4個時間標簽事件;
8、采用4級深度的循環緩沖器以進行連續捕獲;
9、4個捕獲事件中任意一個都可以產生中斷。
DSP2833x_SysCtrl.h
// Peripheral clock control register 1 bit definitions: struct PCLKCR1_BITS { // bits description Uint16 EPWM1ENCLK:1; // 0 Enable SYSCLKOUT to EPWM1 Uint16 EPWM2ENCLK:1; // 1 Enable SYSCLKOUT to EPWM2 Uint16 EPWM3ENCLK:1; // 2 Enable SYSCLKOUT to EPWM3 Uint16 EPWM4ENCLK:1; // 3 Enable SYSCLKOUT to EPWM4 Uint16 EPWM5ENCLK:1; // 4 Enable SYSCLKOUT to EPWM5 Uint16 EPWM6ENCLK:1; // 5 Enable SYSCLKOUT to EPWM6 Uint16 rsvd1:2; // 7:6 reserved Uint16 ECAP1ENCLK:1; // 8 Enable SYSCLKOUT to ECAP1 系統時鍾150MHz Uint16 ECAP2ENCLK:1; // 9 Enable SYSCLKOUT to ECAP2 Uint16 ECAP3ENCLK:1; // 10 Enable SYSCLKOUT to ECAP3 Uint16 ECAP4ENCLK:1; // 11 Enable SYSCLKOUT to ECAP4 Uint16 ECAP5ENCLK:1; // 12 Enable SYSCLKOUT to ECAP5 Uint16 ECAP6ENCLK:1; // 13 Enable SYSCLKOUT to ECAP6 Uint16 EQEP1ENCLK:1; // 14 Enable SYSCLKOUT to EQEP1 Uint16 EQEP2ENCLK:1; // 15 Enable SYSCLKOUT to EQEP2 };
由上面代碼可知eCAP模塊的時鍾為系統時鍾,時基是6.67ns
#define EC_RISING 0 //上升沿電平值 #define EC_FALLING 1 //下降沿電平值 #define EC_ABS_MODE 0 //在CAPx事件中不重置計數器 #define EC_ENABLE 1 //使能在捕獲事件中加載CAP1-4寄存器的時間 #define EC_DIV1 00000 //輸入信號分頻選擇 不分頻 #define EC_CAP_MODE 0 //ECAP工作於捕獲工作模式 #define EC_CONTINUOUS 0 //0為連續模式 1為單次模式 #define EC_SYNCO_DIS 2 //同步輸出選擇: 10、11屏蔽同步信號輸出 #define EC_DISABLE 0 //屏蔽同步輸入操作 #define EC_RUN 1 //1計數器啟動 0計數器停止
以上代碼為宏定義
void InitECAP() { SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1;//使能eCAP1 SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 1;//使能eCAP2 // SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 1;//使能eCAP3 // SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 1;//使能eCAP4 // SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 1;//使能eCAP5 // SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 1;//使能eCAP6 IER |= M_INT4;// 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 SetCap1(); SetCap2(); } void SetCap1() { ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING; //一級事件捕捉上升沿 ECap1Regs.ECCTL1.bit.CAP2POL = EC_RISING; //二級事件捕捉上升沿 ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING; //三級事件捕捉上升沿 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.CAPLDEN = EC_ENABLE; //使能事件捕捉時捕捉寄存器裝載計數器值 ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1; //對外部信號不分頻 ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE; //捕捉模式ECAP ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS; //連續模式 ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS; //屏蔽同步信號輸出 ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE; //屏蔽同步輸入操作 ECap1Regs.ECEINT.all=0x0000; //關閉所有 CAP 中斷 ECap1Regs.ECCLR.all=0xFFFF; //清除所有中斷標志位 ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN; //啟動 CAP 計數器 ECap1Regs.ECEINT.bit.CEVT4=1; //使能四級事件中斷,即當發生第四次捕捉時進入中斷 }
在四級事件后進中斷
interrupt void ECAP1_INT_ISR(void) // ECAP-1 { // Insert ISR Code here Uint32 t1,t2,t3,t4,T1,T2; t1 = ECap1Regs.CAP1; t2 = ECap1Regs.CAP2; t3 = ECap1Regs.CAP3; t4 = ECap1Regs.CAP4; T1 = t2-t1; T2 = t4-t3; // To receive more interrupts from this PIE group, acknowledge this interrupt PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; ECap1Regs.ECCLR.all=0xFFFF; //clare all flag }