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.

28335的PWM设置

我想请问一下,在上下计数模式中,占空比应该怎么改变呢,一般都是看比较寄存器是周期寄存器的多少倍来确定的,但是我想实时控制它的占空比,比如想让他占空比是50%,只需要比较寄存器是周期寄存器的一半就行,如果想让他为20%或30%呢?应该改哪个值呢。之前有看过例程,如下:

#if (CPU_FRQ_150MHZ)
#define CPU_CLK 150e6
#endif
#if (CPU_FRQ_100MHZ)
#define CPU_CLK 100e6
#endif
#define PWM_CLK 30e3 // If diff freq. desired, change freq here.
#define SP CPU_CLK/(2*PWM_CLK)
#define TBCTLVAL 0x200E // Up-down cnt, timebase = SYSCLKOUT


void EPwmSetup()
{

InitEPwm1Gpio();//init EPWM1-3 GPIO
InitEPwm2Gpio();
InitEPwm3Gpio();
EPwm1Regs.TBSTS.all=0;
EPwm2Regs.TBSTS.all=0;
EPwm3Regs.TBSTS.all=0;
EPwm1Regs.TBPHS.half.TBPHS=0;
EPwm2Regs.TBPHS.half.TBPHS=0;
EPwm3Regs.TBPHS.half.TBPHS=0;
EPwm1Regs.TBCTR=0;
EPwm2Regs.TBCTR=0;
EPwm3Regs.TBCTR=0;
EPwm1Regs.CMPA.half.CMPA =SP/3;
EPwm2Regs.CMPA.half.CMPA =SP/3;
EPwm3Regs.CMPA.half.CMPA =SP/3;
EPwm1Regs.CMPB=SP/3;
EPwm2Regs.CMPB=SP/3;
EPwm3Regs.CMPB=SP/3;
EPwm1Regs.CMPCTL.all=0x50; // Immediate mode for CMPA and CMPB
EPwm2Regs.CMPCTL.all=0x50;
EPwm3Regs.CMPCTL.all=0x50;

EPwm1Regs.AQCTLA.all=0; // EPWMxA = 1 when CTR=CMPA and counter inc
// EPWMxA = 0 when CTR=CMPA and counter dec
EPwm1Regs.AQCTLB.all=0;
EPwm1Regs.AQSFRC.all=0;
EPwm1Regs.AQCSFRC.all=0;

EPwm1Regs.DBCTL.all=0x0; // EPWMxB is EPWMxA's
EPwm2Regs.DBCTL.all=0x0;
EPwm3Regs.DBCTL.all=0x0;
EPwm1Regs.DBRED=0;
EPwm2Regs.DBRED=0;
EPwm3Regs.DBRED=0;
EPwm1Regs.DBFED=0;
EPwm2Regs.DBFED=0;
EPwm3Regs.DBFED=0;

EPwm1Regs.TZSEL.all=0;
EPwm2Regs.TZSEL.all=0;
EPwm3Regs.TZSEL.all=0;
EPwm1Regs.TZCTL.all=0;
EPwm2Regs.TZCTL.all=0;
EPwm3Regs.TZCTL.all=0;
EPwm1Regs.TZEINT.all=0;
EPwm2Regs.TZEINT.all=0;
EPwm3Regs.TZEINT.all=0;
EPwm1Regs.TZFLG.all=0;
EPwm2Regs.TZFLG.all=0;
EPwm3Regs.TZFLG.all=0;
EPwm1Regs.TZCLR.all=0;
EPwm2Regs.TZCLR.all=0;
EPwm3Regs.TZCLR.all=0;
EPwm1Regs.TZFRC.all=0;
EPwm2Regs.TZFRC.all=0;
EPwm3Regs.TZFRC.all=0;

EPwm1Regs.ETSEL.all=0; // Interrupt when TBCTR = 0x0000
EPwm2Regs.ETSEL.all=0;
EPwm3Regs.ETSEL.all=0;
EPwm1Regs.ETFLG.all=0;
EPwm2Regs.ETFLG.all=0;
EPwm3Regs.ETFLG.all=0;
EPwm1Regs.ETCLR.all=0;
EPwm2Regs.ETCLR.all=0;
EPwm3Regs.ETCLR.all=0;
EPwm1Regs.ETFRC.all=0;
EPwm2Regs.ETFRC.all=0;
EPwm3Regs.ETFRC.all=0;

EPwm1Regs.PCCTL.all=0;
EPwm2Regs.PCCTL.all=0;
EPwm3Regs.PCCTL.all=0;

EPwm1Regs.TBCTL.all=0x0012; // Enable Timer
EPwm2Regs.TBCTL.all=0x0006;
EPwm3Regs.TBCTL.all=0x0006;
EPwm1Regs.TBPRD=SP;
EPwm2Regs.TBPRD=SP;
EPwm3Regs.TBPRD=SP;

}

这段程序中,很明显SP是周期寄存器的值,但是不知道为什么,添加到观察窗口后,SP是个固定的值,并且和周期寄存器的值不相等。