使用DSP2812的时候,发现将ACTRA中的位CMP1设置成低电平有效,CMP2设置成高电平有效,而后采用死区模块后,原本应该是死区的部分反而交叠;若将ACTRA中的位CMP1设置成高电平有效,CMP2设置成低电平有效,则可以正常产生死区。为什么啊?
囧:
把你的初始化程序贴出来看一下, 可能是死区设置有问题
使用DSP2812的时候,发现将ACTRA中的位CMP1设置成低电平有效,CMP2设置成高电平有效,而后采用死区模块后,原本应该是死区的部分反而交叠;若将ACTRA中的位CMP1设置成高电平有效,CMP2设置成低电平有效,则可以正常产生死区。为什么啊?
Hank Zhao:
根据EV user guide的Figure 2−4和Figure 2−5在UP mode设置死区,是需要将CMP1设置成高电平有效,CMP2设置成低电平有效,如果在UP-DOWN mode设置死区,需要将CMP1设置成低电平有效,CMP2设置成高电平有效。
使用DSP2812的时候,发现将ACTRA中的位CMP1设置成低电平有效,CMP2设置成高电平有效,而后采用死区模块后,原本应该是死区的部分反而交叠;若将ACTRA中的位CMP1设置成高电平有效,CMP2设置成低电平有效,则可以正常产生死区。为什么啊?
Xin Chen8:
回复 囧:
//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°
使用DSP2812的时候,发现将ACTRA中的位CMP1设置成低电平有效,CMP2设置成高电平有效,而后采用死区模块后,原本应该是死区的部分反而交叠;若将ACTRA中的位CMP1设置成高电平有效,CMP2设置成低电平有效,则可以正常产生死区。为什么啊?
user4837745:
回复 Xin Chen8:
您好,这个问题解决了么?首先,死区重叠是不是指的两路PWM的高电平重叠;其次看了半天,感觉不管是连续增模式还是连续增减模式,EvaRegs.ACTRA.all都应该设置成0x0999; //PWM1,PWM3,PWM5输出高电平有效,PWM2,PWM4,PWM6输出低电平有效。而不是UP mode设置死区,是需要将CMP1设置成高电平有效,CMP2设置成低电平有效,如果在UP-DOWN mode设置死区,需要将CMP1设置成低电平有效,CMP2设置成高电平有效。