DSP EPWM學習筆記1 - EPWM定時中斷


DSP EPWM學習筆記1 - EPWM定時中斷

彭會鋒

1  EPWM模塊組成

        EPWM有7個子模塊組成:時間基准 TB、比較功能 CC、動作限定 AQ、死區產生 DB、斬波控制 PC、故障捕獲 TZ、事件觸發 ET,具體組成如下圖2、3所示:

   

      為了完成EPWM定時中斷功能,我們主要使用時間基准 TB、比較功能 CC和事件觸發(ET) 這三個模塊,通過設置這三個模塊的寄存器,最終得到想要的結果。

2 EPWM中斷 

      為了使用EPWM定時中斷,我們首先要了解EPWM可以觸發的中斷都有哪些,可以在PIE 多路復用的外設中斷矢量表中查詢得到,EPWM 模塊中可以觸發中斷標志的有TZ(故障捕獲) 和ET (事件觸發子模塊),定時中斷主要通過事件觸發模塊(ET)進行中斷設置。

  我們只需要EPWM1_INT中斷即可,中斷標志位於INT3.1中,這個需要在程序中注冊中斷程序,具體代碼如下:

   EALLOW;
   PieVectTable.EPWM1_INT = &Epwm1TimerISR;  //在這里注冊EPWM的中斷程序入口
   EDIS; 

   IER |= M_INT3;  //開啟cpu IER中斷標志位
PieCtrlRegs.PIEIER3.bit.INTx1
= PWM1_INT_ENABLE; //開啟cpu PIE中斷標志位
 3 EPWM時鍾配置問題解析(主要針對CLKDIV 和 HSPCLKDIV計算TBCLK的問題)

      ePWM的時鍾TBCLK=SYSCLKOUT/(2^HSPCLKDIV × 2^CLKDIV)

      CLKDIV默認為零  HSPCLKDIV默認為1 ,注意計算的時候是2^k計算的,所以默認分頻為TBCLK = SYSCLKOUT/2;

3 寄存器配置

    1 ET模塊寄存器

    

      這里我們主要設置一下標志位:

EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;     // 選擇EPWMx_INT產生的條件,這里選擇 001:TBCTR=0x0000時產生
EPwm1Regs.ETSEL.bit.INTEN = PWM1_INT_ENABLE;  // 使能產生EPWM中斷信號
EPwm1Regs.ETPS.bit.INTPRD = ET_2ND;           // 中斷周期設定,每發生兩次事件,產生中斷信號EPWMx_INT

 

4 EPWM模塊同步疑問記錄

 

 

 

5 代碼實現
#define PWM1_INT_ENABLE  1
#define PWM1_TIMER_TBPRD 0x1FFF // Prototype statements for functions found within this file.void EpwmGpioInit(void); //這里由於只用到了EPWM的定時器功能,所以可以不用初始化GPIO void EpwmRegInit(void); //初始化EPWM寄存器 __interrupt void Epwm1TimerISR(void); //epwm寄存器中斷函數 uint16_t EPwm1TimerIntCount = 0; void EpwmRegInit(void) { EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // Stop all the TB clocks EPWM模塊同步使用,在4中講到了 EDIS; EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // 00 EPWMXSYNC 這里暫時不清楚 EPwm1Regs.TBPRD = PWM1_TIMER_TBPRD; EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up EPwm1Regs.TBCTR = 0; EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // Select INT on Zero event EPwm1Regs.ETSEL.bit.INTEN = PWM1_INT_ENABLE; EPwm1Regs.ETPS.bit.INTPRD = ET_2ND; // Generate INT on 2nd event 每兩次定時中斷觸發一次進入中斷函數 EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Start all the timers synced EDIS; } void main(void) { #ifdef _FLASH memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize); #endif InitSysCtrl(); EALLOW; GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; GpioDataRegs.GPASET.bit.GPIO0 = 1; // uncomment if --> Set High initially EDIS; DINT;
InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable();// EpwmGpioInit(); 因為僅僅使用epwm的定時器功能,所以不需要初始化外設 EpwmRegInit();
//中斷部分初始化處理 EALLOW; PieVectTable.EPWM1_INT
= &Epwm1TimerISR; //中斷函數注冊部分 EDIS; IER |= M_INT3; PieCtrlRegs.PIEIER3.bit.INTx1 = PWM1_INT_ENABLE; EINT; ERTM; // Step 5. User specific code: while(1); } __interrupt void Epwm1TimerISR(void) { EPwm1Regs.ETCLR.bit.INT = 1; //注意此處的中斷標志清除   PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; //清除中斷向量表中的標志位
EPwm1TimerIntCount
++;
 if(EPwm1TimerIntCount > 5000) { EPwm1TimerIntCount = 0; GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1; } }

 


免責聲明!

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



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