This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28035: 数字比较器事件滤波配置问题

Part Number: TMS320F28035

程序中配置事件滤波无法生效,请帮忙查看一下问题在哪儿?

//EPwm3配置,周期开始时A高电平,B与A互补,

//数字比较器DCComp2触发DCBEVT2事件,此时将A拉低B拉高

    EPwm3Regs.TBCTL.bit.FREE_SOFT = 0x3;        // 
    EPwm3Regs.TBCTL.bit.CLKDIV = 0;             /** 0:/1(default) */
    EPwm3Regs.TBCTL.bit.HSPCLKDIV = 0;          /** 0:/1;1:/2(default) */
    EPwm3Regs.TBPRD = EPWM3_TIMEBASE;           /** 20KHz */
    EPwm3Regs.TBCTR = 0;                        /** 清零TBCNT计数器*/
    EPwm3Regs.TBPHS.half.TBPHS = 0;             /** 清零相位寄存器*/
    EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;  /** 上计数模式 */
    EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;      /** 启用相位同步,Slave*/
    EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW;      /** 开启TBPRD 影子寄存器*/
    EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;  /** 选择EPWM1SYNCO 输出信号源,TBCTR=0*/

    EPwm3Regs.CMPA.half.CMPA = 0;               /** CMPA值 ,初始占空比0*/
    EPwm3Regs.CMPB = 0;                         /** CMPB值 */
    EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; /** 开启CMPA影子寄存器 */
    EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; /** 开启CMPB影子寄存器 */
    EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;   /** TBCTR=0时,CMPA自动从影子寄存器装载值 */
    EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;   /** TBCTR=0时,CMPB自动从影子寄存器装载值 */

    EPwm3Regs.AQCTLA.bit.ZRO = AQ_SET;
    EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR;

    EPwm3Regs.DBFED = 0;//EPWMx_DBFED_CLK;
    EPwm3Regs.DBRED = 0;//EPWMx_DBRED_CLK;
    // EPwm3Regs.DBCTL.bit.IN_MODE     = DBA_ALL;
    // EPwm3Regs.DBCTL.bit.POLSEL      = DB_ACTV_HIC;
    // EPwm3Regs.DBCTL.bit.OUT_MODE    = DB_FULL_ENABLE;
    EPwm3Regs.DBCTL.all     = 0x000B;

以上代码工作正常。

现在加入事件滤波功能,期望在周期开始后经过一段时间,DCBEVT2才能生效,这样就不会发生周期刚开始的时候DCBEVT2导致pwmB整个周期都是高电平。

    EPwm3Regs.DCBCTL.bit.EVT2SRCSEL = DC_EVT_FLT;
    EPwm3Regs.DCBCTL.bit.EVT2FRCSYNCSEL = DC_EVT_ASYNC;
    EPwm3Regs.DCBCTL.bit.EVT1SYNCE  = 1;
    EPwm3Regs.DCFCTL.bit.SRCSEL     = DC_SRC_DCBEVT2;

    EPwm3Regs.DCFCTL.bit.BLANKE     = DC_BLANK_ENABLE;
    EPwm3Regs.DCFCTL.bit.PULSESEL   = DC_PULSESEL_ZERO;
    EPwm3Regs.DCFOFFSET             = EPWM3_TIMEBASE - 5;
    EPwm3Regs.DCFWINDOW             = 155;  

尝试过调整DCFOFFSET为0或EPWM3_TIMEBASE-5;也调整过DCFWINDOW为5~255,都没有效果,pwmB还是会出现持续高电平。

 

 

  •     EPwm3Regs.AQCTLA.all    = 0x0012;
        EPwm3Regs.AQCTLB.all    = 0x0000;
        EPwm3Regs.DBCTL.all     = 0x000B;
    
        //测试模式,临时取消OST报警
        // EPwm3Regs.TZSEL.all     = 0x07C0;               // Enable:DCAEVT2 & DCBEVT2 as CBC,OSHT3(TZ3),OSHT2(TZ2),OSHT1(TZ1)
        EPwm3Regs.TZSEL.all     = 0x00C0;               // Enable:DCAEVT2 & DCBEVT2 as CBC
    
        EPwm3Regs.DCTRIPSEL.all = 0x0909;               // DCAH <- COMP2OUT,DCBH <- COMP2OUT
        EPwm3Regs.TZDCSEL.all   = 0x0410;               // DCAEVT2 <- DCAH = high,DCBEVT2 <- DCBH = high
    
        EPwm3Regs.TZCTL.all     = 0x0FF6;               // EPWMxA Low < TZA,EPWMxB High < TZB
        EPwm3Regs.TZCLR.all     = 0x003F;               // Clear all Flags

    程序进入运行时还执行上面的代码

  • 或者有没有办法在描述的工作模式下,限制pwmB的占空比?

  • 问题已经找到:

     EPwm3Regs.TZSEL.all     = 0x00C0;               // Enable:DCAEVT2 & DCBEVT2 as CBC

    程序中DCAEVT2和DCBEVT2的触发源和触发条件完全相同,导致此两个事件同时发生产生冲突,最终没有滤波效果。

    现在程序中仅保留DCBEVT2事件,并对DCBEVT2进行滤波,可以实现想要的效果。