最近被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;
}