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.

请问F28035的动作限定器为什么不能把4路PWM波拉低?



专家您好,下面是我控制移相全桥电路的开环程序,F28035板子是我自己画的,在板子上放了一个开关进行对软启动程序控制,现在的问题是:当运行程序还未按下开关时,我加了强制拉低语句,但是4路PWM波不能被拉到低电平(epwm3A为低  3B为高,EPWM6A为低,6B为高),当开关按下之后,四路PWM波开始正常出波形,并且实现软启动功能。请专家帮我看一下,为什么在开关为按下去之前,4路pwm波为什么不能拉低?非常感谢您

  • 原因是你的以下代码配置有问题,你是用PWMA输出给DB,DB又反向了,所以不能出低

    void Init_EPwm3(void)
    {
    // Initialization Timer
    EPwm3Regs.TBPRD = 300; // Period = 2*300 TBCLK counts
    EPwm3Regs.TBPHS. half.TBPHS= 0; // Set Phase register to zero
    EPwm3Regs.TBCTR = 0; // clear TB counter
    EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Symmetric
    EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Phase loading disabled
    EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW;
    EPwm3Regs.TBCTL.bit.SYNCOSEL = 00;
    EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // TBCLK = SYSCLKOUT
    EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR = Zero
    EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR = Zero
    EPwm3Regs.AQCTLA.bit.ZRO = AQ_SET; // set actions for EPWM1A
    EPwm3Regs.AQCTLA.bit.PRD = AQ_CLEAR; //S1
    EPwm3Regs.AQCTLB.bit.ZRO = AQ_CLEAR;
    EPwm3Regs.AQCTLB.bit.PRD = AQ_SET; //S2
    //
    //Run Time
    // = = = = = = = = = = = = = = = = = = = = = = = =

    EPwm3Regs.DBCTL.bit.OUT_MODE=DB_FULL_ENABLE; //11
    EPwm3Regs.DBCTL.bit.POLSEL=DB_ACTV_HIC; //10
    EPwm3Regs.DBCTL.bit.IN_MODE=00; //选Epwm1A为下降沿和上升沿延迟输入源
    EPwm3Regs.DBRED=30; //上升沿延迟时间
    EPwm3Regs.DBFED=30; //下降沿延迟时间


    /*
    // 过流、过压保护

    Comp2Regs.DACVAL.bit.DACVAL =200; //过电压参考值
    Comp3Regs.DACVAL.bit.DACVAL =270; //过电流参考值
    //comp的输出控制,是否反相,是否同步?
    Comp2Regs.COMPCTL.bit.CMPINV =0; //不反相,传送比较器的输出
    Comp3Regs.COMPCTL.bit.CMPINV =0; //不反相,传送比较器的输出
    Comp2Regs.COMPCTL.bit.SYNCSEL =0; //比较器输出被异步传送
    Comp3Regs.COMPCTL.bit.SYNCSEL =0; //比较器输出被异步传送
    //设置DC模块,comp1out(当短路时,comp1out的输出是1,否则输出是0)产生DCAEVT1的force信号
    EALLOW;
    EPwm3Regs.DCTRIPSEL.bit.DCAHCOMPSEL=DC_COMP2OUT; //COMP2OUT是数字比较A(DCAH)的输入选择位
    EPwm3Regs.DCTRIPSEL.bit.DCBHCOMPSEL=DC_COMP3OUT;
    EPwm3Regs.TZDCSEL.bit.DCAEVT1 = TZ_DCAH_HI; //COMP3OUT输出为高电平,DCAL为任意值时,会产生DCAEVT1事件 DCAH = high, DCAL = don't care
    EPwm3Regs.TZDCSEL.bit.DCBEVT1 = TZ_DCBH_HI;
    EPwm3Regs.DCACTL.bit.EVT1SRCSEL =0; //DCAEVT1 Source Signal Select Source Is DCAEVT1 Signal
    EPwm3Regs.DCBCTL.bit.EVT1SRCSEL =0;
    EPwm3Regs.DCACTL.bit.EVT1FRCSYNCSEL =1; //DCAEVT1是异步信号,不进行同步,这时是不需要设置TZFRC[DCAEVT1]的,因为是两种使得DCAEVT1force产生的方式,要产生DCAEVT1force这个信号是可以直接用软件实现的。
    EPwm3Regs.DCBCTL.bit.EVT1FRCSYNCSEL =1;
    EDIS;
    //封锁超前管PWM波
    EALLOW;
    EPwm3Regs.TZSEL.bit.DCAEVT1 = 1; //DCAEVT1是单次触发的故障源
    EPwm3Regs.TZSEL.bit.DCBEVT1 = 1;
    EPwm3Regs.TZCTL.bit.TZA =TZ_FORCE_LO; //DCAEVT1触发事件发生时,将EPWM1A设置成出错时变低
    EPwm3Regs.TZCTL.bit.TZB =TZ_FORCE_LO; //DCBEVT1触发事件发生时,将EPWM1B设置成出错时变低
    EPwm3Regs.TZEINT.bit.OST = 1; //使能综合的中断 Enable Interrupt generation; a one-shot trip event will cause a EPWMx_TZINT PIE interrupt
    EDIS;
    */

    //产生EPWM3INT3中断
    EPwm3Regs.ETSEL.bit.INTSEL=ET_CTR_ZERO; //当时基计数器等于0时产生EPWM3INT1中断
    EPwm3Regs.ETPS.bit.INTPRD =ET_3RD; //在第3个事件时产生中断
    EPwm3Regs.ETSEL.bit.INTEN=1; //EPWM1 INT中断使能

  • 专家您好,我现在要产生带死区的互补PWM波来控制移相全桥电路,必须这样加死区吗 ?您标出的这一部分怎样改动呢  

  • 你要生成带死区互补的波形,那用AQ模块就没办法让两个输出都出低,因为DB模块会把一路输出反向。只有用TZ模块来拉低才能全部出低

  • 但是我的主电路板子已经开出来了,还怎么能通过TZ模块来使PWM波都拉低呢?希望专家能认真回答或者给你建议,初学着很多东西都不懂

  • 通过软件的方式,只要置位一下TZFRC寄存器就可以

  • 麻烦您给我写一下这些语句,还有个问题,使用TZ作为强制拉低语句,当我的开关按下去之后,怎样使这些PWM波正常发波呢

  • 麻烦您给我写一下这段程序。还有个问题,当控制软启动的开关按下去之后,还怎样配置才能屏蔽TZ的强制拉低的作用呢

  • 麻烦您再看一下我修改后的程序,我按照您说的使用TZFRC寄存了,但是现在运行程序的结果是:在未按下控制软启动程程的开关之前,EPWM3A 3B没有被拉低,直接发波。epwm6A为高, 6B为低。麻烦您看看哪里有错误

    interrupt void epwm3_isr(void);//interrupt关键字的作用是申明一个函数为中断函数,该中断函数的中断号为intr
    void Init_EPwm3(void);
    void Init_EPwm6(void);
    void Init_Gpio(void);
    Uint32 ss_count;
    Uint16 ss_flag;
    long temp1=0;

    }

  • 因为你没有加eallow去保护,TZFRC是受保护寄存器