DSP28335 eCAP 測頻


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
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM