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.

PWM的产生?



在PCMC模式下的移相全桥的user guide里面有这样一句话:只要比较器输出在一个PWM 半周期内变为高电平,瞬时为高电平的ePWM2 模块输出(ePWM2A 或ePWM2B)被立即下拉为低电平,而其它PWM2 模块输出在一个适当的死区时间窗口后被拉至高电平(dbAtoP)。ePWM4A 和ePWM4B 输出驱动方式类似。

请教一下,怎么设置才能实现?

  • 你的功能用F2837X, F2707X的PWM模块的AQ模块的TI T2事件可以实现

  • 我用的28035

     (*ePWM[n+1]).DCTRIPSEL.bit.DCAHCOMPSEL = DC_COMP1OUT;  // DCAH = Comparator 1 output
     (*ePWM[n+1]).TZDCSEL.bit.DCAEVT1 = TZ_DCAH_HI;    // DCAEVT1 = DCAH high(will become active
                   // as Comparator output goes high)
     (*ePWM[n+1]).DCACTL.bit.EVT1SRCSEL = DC_EVT_FLT;   // DCAEVT1 = DC_EVT_FLT (filtered)
     (*ePWM[n+1]).DCACTL.bit.EVT1FRCSYNCSEL = DC_EVT_ASYNC; // Take async path

    // Enable DCAEVT1 as a one-shot source
     (*ePWM[n+1]).TZSEL.bit.DCAEVT1 = 1;      // Enable One-Shot Trip

    // Following code for the sync mechanism based on the same trigger event - COMPxOUT
     (*ePWM[n+1]).DCACTL.bit.EVT1SYNCE = 1;     // Sync enabled

    // What do we want the DCAEVT1 event to do? - Initial Configuration

     (*ePWM[n+1]).TZCTL.bit.TZB = TZ_NO_CHANGE;
     (*ePWM[n+1]).TZCTL.bit.TZA = TZ_FORCE_LO;

  • F28035没办法通过寄存器配置做出死区,因为TZ模块会直接改变输出PWM的电平。所以PCMC的例程是在ISR中插入nop指令来实现的软件死区,比较复杂,F2807X就可以直接通过寄存器配置完成这个功能

  • 谢谢你的回答。NOP还真一直有个疑问:

    在ISR中,是有很多NOP,我原先理解是up_cnt的设置是为了配置下一个周期的PWM。

    MOVW  DP,#_EPwm3Regs.AQCTLA
      MOV  @_EPwm3Regs.AQCTLA, #0x0021
      MOV  @_EPwm3Regs.AQCTLB, #0x0002


      NOP   
      NOP
      NOP   
      NOP
      NOP
      NOP
      NOP
      NOP
      NOP
      NOP
      NOP   
      NOP
      NOP   
      NOP

      NOP
      NOP
      NOP
      NOP

      MOV  @_EPwm3Regs.AQCTLA, #0x0020

    按照我的理解就是EPwm3Regs.AQCTLA=0x0020,而上面的语句没有用。

    按照你的意思,我理解错了,应该怎么理解呢?

  • 我在ISR添加了语句,同步整流的驱动就不对了。   你的说法应该是对的,请指导一下吧

  • 附件的文档你可以参考理解一下,其实就是通过NOP实现延时后,再改AQ,这样就能做出A路B路的死区

  • 这个有完整的文档吗?里面显示的不是很明显

  • 这是哪个例程,我去看看

  • 不是例程,只是一个简单的Buck的峰值电流控制法的解释

  • 可以把算法发出来吗?

    我一直以为死区是通过事件滤波来实现的。

    在你给的图里面CMPA =1120,大于1000了,怎么回事

  • (*ePWM[n+1]).CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // Load on CTR = Zero:TBCTR = Ox0000
    (*ePWM[n+1]).CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Shadow mode
    (*ePWM[n+1]).CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
    (*ePWM[n+1]).CMPCTL.bit.SHDWBMODE = CC_SHADOW;

    epwm2的比较器寄存器是shadow register,上个pwm周期配置的CMPA CMPB,怎么在下个pwm周期利用NOP产生死区?想不通啊。

    这个程序越看疑问越多:

    EPwm1Regs.ETSEL.bit.INTSEL = ET_CTRU_CMPA; // INT on CMPA event

    在 ET_CTRU_CMPA产生中断,只有100K,如何在isr中产生200k的计算?在isr中up_cnt和dwn_cnt都是直接跳出中断的,不应该是100k吗

  • 囧 兄弟:不要让我一知半解的啊,这个感觉很难受啊