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.

28069 EPWM输出时能否设置输出的个数



各位技术仁兄:

      本人在使用28069做项目时,需要输出一路对称的PWM信号控制半桥,PWM频率为50KHZ,配置输出2ms PWM信号后,使用软件延时2ms,Delay2ms后控制把PWM信号强制关闭,如 

EPwm1Regs.TZFRC.bit.OST = 1; //强制TZ模式清除PWM---stop
EPwm2Regs.TZFRC.bit.OST = 1; //强制TZ模式清除PWM---stop

但是这种做法导致最后的一个PWM信号输出到一半或其他时刻就被强制关闭输出了,最后一个信号不一定是一个完整的信号。

使用中断的方法也试过,每发一个PWM信号进入一次中断,当计数到100个脉冲后,也是强制关闭PWM输出

EPwm1Regs.TZFRC.bit.OST = 1; //强制TZ模式清除PWM---stop
EPwm2Regs.TZFRC.bit.OST = 1; //强制TZ模式清除PWM---stop

这个中断的方法结果和软件延时也差不多,就是当进入中断计数到最后一个脉冲时去软件强制关闭,PWM单元已经发出来一会了,所以最后一个波形也不是完整的,所以我想问下28069芯片的EPWM的控制寄存器里面是否可以配置输出PWM的个数,个数到了硬件自己关闭,或者是否还有其他处理的方法,输出若干个完整的PWM信号?

  • 我觉得通过TZ模块来达到封波效果的话,很难做到周期结束波形立即停止。我会咨询一下其他工程师,看看有什么其他方法可以做到立即停止发波的
  • 有美国工程师给出了这样的处理方式,你看一下:
    Do an interrupt every Y periods. Have a variable to count how many interrupts occurred. On the YxCount=100-1 cycle, assuming you are using shadow mode, set all the action qualifiers to "FORCE Output LOW" on all events.
  • Green Deng  根据你的建议,这几天一直在试验,结构如下:

    初始化程序如下

    EPwm6Regs.TBPRD = 1800; // Set timer period 周期 50K * X = 90M
    EPwm6Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0 时基相位寄存器
    EPwm6Regs.TBCTR = 0x0000; // Clear counter 计数器

    // Setup TBCLK
    EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up UP/DOWN 模式
    EPwm6Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading
    EPwm6Regs.TBCTL.bit.PRDLD = TB_SHADOW; // loaded from its shadow register
    EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT 分频
    EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV1; // PWM的时钟:TBCLK = SYSCLKOUT/ (HSPCLKDIV×CLKDIV)
    EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // syn //

    EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO
    EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    //dead time
    EPwm6Regs.DBCTL.bit.IN_MODE= DBB_ALL;
    EPwm6Regs.DBCTL.bit.OUT_MODE= DB_FULL_ENABLE;
    EPwm6Regs.DBRED = 44; 
    EPwm6Regs.DBFED = 44;
    EPwm6Regs.DBCTL.bit.POLSEL=DB_ACTV_HIC;

    // Setup compare
    EPwm6Regs.CMPA.half.CMPA = 900; //
    // Set actions
    EPwm6Regs.AQCTLA.bit.CAU = AQ_SET; //
    EPwm6Regs.AQCTLA.bit.PRD = AQ_CLEAR;
    EPwm6Regs.AQCTLB.bit.CAU = AQ_CLEAR; // 
    EPwm6Regs.AQCTLB.bit.PRD = AQ_SET;


    EPwm6Regs.AQSFRC.bit.RLDCSF=1;

    开启PWM 程序

    EPwm6Regs.AQSFRC.bit.OTSFA =0;
    EPwm6Regs.AQSFRC.bit.OTSFB =0;

    EPwm6Regs.AQSFRC.bit.ACTSFA = 0;
    EPwm6Regs.AQSFRC.bit.ACTSFB = 0;

    EPwm6Regs.AQCSFRC.bit.CSFA=0;
    EPwm6Regs.AQCSFRC.bit.CSFB=0;

    强制关闭PWM程序

    EPwm6Regs.AQSFRC.bit.OTSFA =1;
    EPwm6Regs.AQSFRC.bit.OTSFB =1;

    EPwm6Regs.AQSFRC.bit.ACTSFA = 0;
    EPwm6Regs.AQSFRC.bit.ACTSFB = 0;

    EPwm6Regs.AQCSFRC.bit.CSFA=1;
    EPwm6Regs.AQCSFRC.bit.CSFB=1;

    使用这种方法PWM是可以正常开启和关闭,但是关闭后PWM6A一直为高,PWM6B后一直为低,对于去要驱动半桥,希望关闭PWM后两路输出都为低电平,波形如下:

    波形开启两个是同步的,波形如下:

    波形强制关闭的时候,最后一个置高电平的PWM会有一个从低电平到高电平变化的过程,关闭是中断计数进行的,有有一个逻辑判断,最后置高电平

    最终的结果不是我想要的,关闭后输出都要为低电平,不知道是否还有其他方法???