文档库 最新最全的文档下载
当前位置:文档库 › DSP28335的普通EPWM的代码--原创

DSP28335的普通EPWM的代码--原创

DSP28335的普通EPWM的代码--原创
DSP28335的普通EPWM的代码--原创

最近被28335的EPWM配置折腾了不久,刚刚调通,为此非常想把要可以使用的例程写出来,如果能帮助到大家,实在是一件快事。现在总结起来,还是要仔细读懂28335各个模块的datasheet,并且出了问题多注意一下datasheet中的例程,这个帮助很大。

先附上例程如下,注释尽量详细。如有问题,可加QQ:1004558902详细讨论,加QQ 时,请说明来源。

//macros

#define EPWM1A_MUX GpioCtrlRegs.GPAMUX1.bit.GPIO0

#define EPWM1B_MUX GpioCtrlRegs.GPAMUX1.bit.GPIO1

#define EPWM2A_MUX GpioCtrlRegs.GPAMUX1.bit.GPIO2

#define EPWM2B_MUX GpioCtrlRegs.GPAMUX1.bit.GPIO3

#define EPWM3A_MUX GpioCtrlRegs.GPAMUX1.bit.GPIO4

#define EPWM3B_MUX GpioCtrlRegs.GPAMUX1.bit.GPIO5

#define EPWM4A_MUX GpioCtrlRegs.GPAMUX1.bit.GPIO6

#define EPWM4B_MUX GpioCtrlRegs.GPAMUX1.bit.GPIO7

#define EPWM5A_MUX GpioCtrlRegs.GPAMUX1.bit.GPIO8

#define EPWM5B_MUX GpioCtrlRegs.GPAMUX1.bit.GPIO9

#define EPWM6A_MUX GpioCtrlRegs.GPAMUX1.bit.GPIO10

#define EPWM6B_MUX GpioCtrlRegs.GPAMUX1.bit.GPIO11

#define EPWM_MUX 0x01

#define EPWM1_ENABLE 1

#define EPWM2_ENABLE 0

#define EPWM3_ENABLE 0

#define EPWM4_ENABLE 0

#define EPWM5_ENABLE 0

#define EPWM6_ENABLE 0

#define EPWM1_FULL_DUTY 3125

#define EPWM1A_DUTY 1500

#define EPWM1B_DUTY 312

#define EPWM2_FULL_DUTY 0

#define EPWM2A_DUTY 0

#define EPWM2B_DUTY 0

#define EPWM3_FULL_DUTY 0

#define EPWM3A_DUTY 0

#define EPWM3B_DUTY 0

#define EPWM4_FULL_DUTY 0

#define EPWM4A_DUTY 0

#define EPWM4B_DUTY 0

#define EPWM5_FULL_DUTY 0

#define EPWM5A_DUTY 0

#define EPWM5B_DUTY 0

#define EPWM6_FULL_DUTY 0

#define EPWM6A_DUTY 0

#define EPWM6B_DUTY 0

#define SET_EPWM1A_DUTY(x) {EPwm1Regs.CMPA.half.CMPA = x;}

//宏的形参不是变量,不必定义类型,也不必分配内存单元,当调用宏时直接用实参替换形参。

voidpwm_init(void)

{

EALLOW;

//enable the epwm module clock.

#if(1==EPWM1_ENABLE)

SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;

#endif

#if(1==EPWM2_ENABLE)

SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;

#endif

#if(1==EPWM3_ENABLE)

SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1;

#endif

#if(1==EPWM4_ENABLE)

SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1;

#endif

#if(1==EPWM5_ENABLE)

SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1;

#endif

#if(1==EPWM6_ENABLE)

SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1;

#endif

//disable the synchronization.

SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;

//PWM1A related.

EPWM1A_MUX = EPWM_MUX; //select the corresponding pin pwm function.

EPwm1Regs.TBCTL.bit.CLKDIV = 5; //dividor is 32.

EPwm1Regs.TBCTL.bit.HSPCLKDIV = 5; //dividor is 10.

EPwm1Regs.TBCTL.bit.CTRMODE = 0; //up count mode.

EPwm1Regs.TBCTL.bit.PHSEN = 0; //don't load TBCTR from TBPHS.

EPwm1Regs.TBCTL.bit.SYNCOSEL = 0; //disable the synchronization.

EPwm1Regs.TBPRD = EPWM1_FULL_DUTY; //configure the pwm frequency 100Hz.

EPwm1Regs.TBCTR = 0; //clear the counter register.

EPwm1Regs.TBPHS.all = 0; //set the TBPHS register value as 0.

EPwm1Regs.CMPA.half.CMPA = EPWM1A_DUTY; //compare event trigger value.

EPwm1Regs.CMPCTL.bit.LOADAMODE = 0; //load CMP when TBCTR=ZERO;

EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; //set high when TBCTR=ZERO occurs.

EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; //set low when TBCTR=CPA occurs.

//PWM1B related.

EPWM1B_MUX = EPWM_MUX;

EPwm1Regs.CMPB = EPWM1B_DUTY; //compare event trigger value.

EPwm1Regs.CMPCTL.bit.LOADBMODE = 0; //load CMP when TBCTR=ZERO;

EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;//set high when TBCTR=ZERO occurs.

EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; //set low when TBCTR=CPA occurs.

//PWM2A related.

//PWM2B related.

//PWM3A related.

//PWM3B related.

//PWM4A related.

//PWM4B related.

//PWM5A related.

//PWM5B related.

//PWM6A related.

//PWM6B related.

//enable the synchronization.

SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;

EDIS;

}

相关文档