• DSP EPWM学习笔记1


    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;
        }
    }

     

  • 相关阅读:
    总有段迷惑的人生
    codepage的重要性【转】
    开通博客
    js 正则常用方法
    关于小程序scrollview组件添加enableflex后布局失效的解决方案
    关于小程序使用async/await报错regeneratorRuntime is not defined的解决方案
    IE6中,一个Button同时打开两个下载窗口,并且可以自动关闭
    Create User
    Oracle: import tables use .dmp file in PL/SQL Developer
    VS在进行调试时,不能调试的原因列举如下
  • 原文地址:https://www.cnblogs.com/qiufenghui/p/4633044.html
Copyright © 2020-2023  润新知