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.

关于mc28377 pwm死区问题



小白,在学习28377 ,将之前的28335的例程改了改,pwm是可以发出,但是在调死区的时候,发现,只要把死区稍微调大一点,整个pwm的频率都出现问题了,比如我下面的程序,本来pwm是两路互补占空比为50%,频率为10k,把EPwm6Regs.DBRED,EPwm6Regs.DBFED都配置成50的时候,pwm输出正常,死区正常,然后EPwm6Regs.DBRED,EPwm6Regs.DBFED都配置成100的时候,此时发现,两路互补pwm占空比已经不是50%,频率也不是10k,比10k低不少,大约7.8k左右,但是死区时间是正确的。问一下这是怎么回事?也就是说,我把死区时间设置小的时候,没有问题,当调大死区时间,pwm频率与占空比都变了,而死区时间确实正确的,请大佬们帮解释一下。

程序如下:


//###########################################################################

#include "F2837xD_device.h" // DSP2833x Headerfile Include File
#include "F2837xD_Examples.h" // DSP2833x Examples Include File
#include "F2837xD_sysctrl.h" // DSP2833x Examples Include File

#define SP 5000

#define TBCTLVAL 0x200E // Up-down cnt, timebase = SYSCLKOUT

void InitPeripheralClocks(void);

void EPwmSetup()
{

InitEPwm6Gpio();


EPwm6Regs.TBSTS.all=0; //时基状态寄存器
EPwm6Regs.TBPHS.bit.TBPHS=0; //HRPWM相位扩展寄存器
EPwm6Regs.TBCTR=0; //时基计数寄存器

//计数比较模块控制器
EPwm6Regs.CMPCTL.all=0x50; // Immediate mode for CMPA and CMPB 计数比较控制寄存器
EPwm6Regs.CMPA.bit.CMPA =2500; //计数比较寄存器A
EPwm6Regs.CMPB.bit.CMPB=0; //计数比较寄存器B

EPwm6Regs.AQCTLA.all=0x60; // EPWMxA = 1 when CTR=CMPA and counter inc 动作控制寄存器A
// EPWMxA = 0 when CTR=CMPA and counter dec
EPwm6Regs.AQCTLB.all=0;
EPwm6Regs.AQSFRC.all=0; //动作软件控制寄存器
EPwm6Regs.AQCSFRC.all=0;

EPwm6Regs.DBCTL.all=0xb; // EPWMxB is inverted
EPwm6Regs.DBRED=0; 
EPwm6Regs.DBFED=0; 

EPwm6Regs.TZSEL.all=0;
EPwm6Regs.TZCTL.all=0;
EPwm6Regs.TZEINT.all=0;
EPwm6Regs.TZFLG.all=0;
EPwm6Regs.TZCLR.all=0;
EPwm6Regs.TZFRC.all=0;

EPwm6Regs.ETSEL.all=0; // Interrupt when TBCTR = 0x0000
EPwm6Regs.ETFLG.all=0;
EPwm6Regs.ETCLR.all=0;
EPwm6Regs.ETFRC.all=0;

EPwm6Regs.PCCTL.all=0;

EPwm6Regs.TBCTL.all=TBCTLVAL; // Enable Timer

// EPwm1Regs.TBCTL.all=0x0010+TBCTLVAL; // Enable Timer
EPwm6Regs.TBPRD=SP;
}