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.

关于DSP2812的死区设置问题



使用DSP2812的时候,发现将ACTRA中的位CMP1设置成低电平有效,CMP2设置成高电平有效,而后采用死区模块后,原本应该是死区的部分反而交叠;若将ACTRA中的位CMP1设置成高电平有效,CMP2设置成低电平有效,则可以正常产生死区。为什么啊?

波形.vsd
  • 把你的初始化程序贴出来看一下, 可能是死区设置有问题

  • 根据EV user guide的Figure 2−4和Figure 2−5在UP mode设置死区,是需要将CMP1设置成高电平有效,CMP2设置成低电平有效,如果在UP-DOWN mode设置死区,需要将CMP1设置成低电平有效,CMP2设置成高电平有效。

  • //EVA模块
    EvaRegs.T1CON.bit.TMODE=1; //连续增/减模式
    EvaRegs.T1CON.bit.TPS=0; //T1CLK=HSPCLK/1=75MHz
    EvaRegs.T1CON.bit.TENABLE=0; //暂时禁止T1计数,主函数中会打开
    EvaRegs.T1CON.bit.TCLKS10=0; //使用内部时钟T1CLK
    EvaRegs.T1CON.bit.TECMPR=0; //禁止定时器比较操作

    EvaRegs.T2CON.bit.TMODE=1; //连续增/减模式
    EvaRegs.T2CON.bit.TPS=0; //T2CLK=HSPCLK/1=75MHz
    EvaRegs.T2CON.bit.TENABLE=0; //暂时禁止T2计数,主函数中会打开
    EvaRegs.T2CON.bit.TCLKS10=0; //使用内部时钟T2CLK
    EvaRegs.T2CON.bit.TECMPR=0; //禁止定时器比较操作

    EvaRegs.GPTCONA.bit.TCMPOE=0; //禁止定时器比较输出使能
    EvaRegs.GPTCONA.bit.T1PIN=1; //低电平有效
    EvaRegs.GPTCONA.bit.T2PIN=1; //低电平有效

    EvaRegs.T1PR=uiFreq; //60kHz的PWM
    EvaRegs.T1CMPR=uiCMPR11; //占空比为
    EvaRegs.T1CNT=0;

    EvaRegs.T2PR=uiFreq; //60kHz的PWM
    EvaRegs.T2CMPR=uiCMPR11; //占空比为
    EvaRegs.T2CNT=0;

    EvaRegs.COMCONA.bit.CENABLE=1; //使能比较单元的比较操作
    EvaRegs.COMCONA.bit.FCOMPOE=1; //全比较器输出使能
    EvaRegs.COMCONA.bit.CLD=1; //下溢中断或周期匹配装载

    //死区时间为:267ns
    EvaRegs.DBTCONA.bit.DBT=5;
    EvaRegs.DBTCONA.bit.EDBT1=1; //死区定时器1使能
    EvaRegs.DBTCONA.bit.EDBT2=1; //死区定时器2使能
    EvaRegs.DBTCONA.bit.EDBT3=1; //死区定时器3使能
    EvaRegs.DBTCONA.bit.DBTPS=2; //死区定时器预定标因子Tdb=75MHz/4=18.75MHz

    EvaRegs.ACTRA.all=0x0666; //PWM1,PWM3,PWM5输出高电平有效

    EvaRegs.CMPR1=uiCMPR11; //PWM1,2占空比由中断函数决定
    EvaRegs.CMPR2=uiCMPR22; //PWM3,4占空比由中断函数决定
    EvaRegs.CMPR3=uiCMPR31; //PWM5,6占空比由中断函数决定

    EvaRegs.EVAIMRA.bit.T1PINT=1; // 使能定时器T1周期中断
    EvaRegs.EVAIMRA.bit.T1UFINT=1; // 使能定时器T1下溢中断

    EvaRegs.EVAIFRA.all=0xFFFF; // 清除标志位

    上面是EVA的初始化

    下面是中断函数

    interrupt void T1PINT_ISR(void) // EV-A,周期中断装载的是前半个周期的值,50%
    {
    EvaRegs.CMPR1 = uiCMPR11;
    EvaRegs.CMPR2 = uiCMPR22;
    EvaRegs.CMPR3 = uiCMPR31;

    EvaRegs.EVAIFRA.all=BIT7;
    // To receive more interrupts from this PIE group, acknowledge this interrupt
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
    EINT;

    }

    interrupt void T1UFINT_ISR(void) // EV-A,下溢中断装载的是后半个周期的值,50%
    {
    EvaRegs.CMPR1 = uiCMPR12;
    EvaRegs.CMPR2 = uiCMPR21;
    EvaRegs.CMPR3 = uiCMPR32;

    EvaRegs.EVAIFRA.all=BIT9;
    // To receive more interrupts from this PIE group, acknowledge this interrupt
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
    EINT;
    }

    我这个程序的目的是想产生三相PWM波,每相互补导通180°,A、B、C三相间相差120°

    驱动时序图.vsd
  • 您好,这个问题解决了么?首先,死区重叠是不是指的两路PWM的高电平重叠;其次看了半天,感觉不管是连续增模式还是连续增减模式,EvaRegs.ACTRA.all都应该设置成0x0999; //PWM1,PWM3,PWM5输出高电平有效,PWM2,PWM4,PWM6输出低电平有效。而不是UP mode设置死区,是需要将CMP1设置成高电平有效,CMP2设置成低电平有效,如果在UP-DOWN mode设置死区,需要将CMP1设置成低电平有效,CMP2设置成高电平有效。