PWM(Pulse Width Modulation)脉冲宽度调制方法广泛应用于电力电子控制场合,因此数字处理器一般都有PWM模块,便于PWM控制。F28335的ePWM模块是基于其原始模块的增强F2812的PWM模块中,PWM该模块由事件管理器控制eCAP和eQEP和F28335中每个ePWM模块都是独立的小模块,使用起来更方便,可以进行更复杂多变的控制算法。
F28335有6对ePWM每个模块分为模块ePWMxA和ePWMxB因此,共有12条路ePWM信号输出;还有6个APWM通过模块CAP模块扩展配置。加起来就是12路普通PWM输出和6路高精度PWM输出。
每个ePWM该模块包含7个子模块:
TB模块的主要功能是定时配置不同计数模式与周期寄存器的值,确定产生的PWM波的周期。
TB模块的主要寄存器有:周期寄存器TBPRD、相位寄存器TBPHS、计数器TBCTR、状态寄存器TBSTS并控制寄存器TBCLT。
CC主要有两个模块比较寄存器CMPA/CMPB由比较逻辑单元组成。TB与寄存器相比,模块的计数器计数CMPA/CMPB相等时,动作限定子模块AQ就会动作,产生电平变化,即可以在我们需要的时刻对电平进行置高或者置低,主要用于设置不同的占空比。
CC模块的主要寄存器有:比较寄存器CMPA/CMPB、控制寄存器CMPCTL。
③
AQ模块的功能是响应匹配事件改变引脚电平,在接收TB模块和CC模块的匹配事件后(匹配事件:TB模块周期匹配,TB下溢匹配、CC模块加减匹配)可以设置四种不同的动作:位置、清除、翻转和无动作。
AQ模块的主要寄存器有:动作限制寄存器AQCTLA、软件强制动作限定控制寄存器AQCSFRC、控制寄存器的软件强制连续动作AQCSFRC。
在电力电子应用中,由于开关器件结电容器的存在,开关之间存在过度过程。为了避免直接故障,有必要PWM波加入死区CC模块和AQ模块也可以设置死区,但是比较麻烦,所以DB模块可以更直接、更简单设置死区。PWM寄存器可以延迟上升和下降DBRED(上升沿延迟)和DBFED(沿延迟下降)设置决定。
DB模块主要寄存器:数据寄存器DBRED/DSFED、控制寄存器DBCTL。
PC模块允许高频载波信号调制由动作限定器和DB模块生成的PWM波,主要用于脉冲变压器栅极驱动器控制的功率开关元件系统。PC模块只有一个寄存器:PCCTL。
在PWM有些故障可能发生在控制中,ePWM模块可以通知配置响应GPIO的故障信号(TZ1~TZ6)改变输出状态,实现保护的功能。一般来说,当故障发生时,可以配置EPWM输出为强制高电平、强制低电平、高阻态或无动作。
TZ模块的主要寄存器:选择寄存器TZSEL、控制寄存器TZCTL、中断使能寄存器TZEINT、中断标志寄存器TZFLG、清除寄存器中断标志TZCLR强制寄存器中断TZFRC。
ET可以根据模块TB模块和CC模块生成的事件,中断和触发申请ADC采样与转换。
ET模块的主要寄存器:选择寄存器ETSEL、预订标准寄存器ETPS、标志寄存器ETFLG、清除寄存器ETCLR强制寄存器ETFRC。
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_Examples.h" // DSP2833x Examples Include File #if (CPU_FRQ_150MHZ) #define CPU_CLK 150e6 #define TBCLK_DIV 0x0 #define TBHSPCLK_DIV 0x0 #endif #if (CPU_FRQ_100MHZ) #define CPU_CLK 25e6 #define TBCLK_DIV 0x1 #define TBHSPCLK_DIV 0x1 #endif #define PWM_CLK 85e3 // If diff freq. desired, change freq here. #define Period_Value CPU_CLK/PWM_CLK #define RED_Value 60 #define FED_Value 60 void ePWM_Config(void); //Uint16 p; /*------------------------------- Main Function------------------------------------*/ void main(void) { InitSysCtrl(); DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); InitGpio(); InitEPwm1Gpio(); InitEPwm2Gpio(); ePWM_Config(); } void ePWM_Config(void) { //**************ePWM1 config ***************// EALLOW; SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1; // ePWM1 SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1; // ePWM1 SysCtrRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Enable TBCLK within the ePWM
EDIS;
EPwm1Regs.TBCTL.bit.CLKDIV = TBCLK_DIV;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TBHSPCLK_DIV; // ePWM Clock = 150 MHz
EPwm1Regs.TBPRD = Period_Value;
EPwm1Regs.CMPA.half.CMPA = Period_Value/2; // Set 50% fixed duty for EPWM1A
EPwm1Regs.TBPHS.half.TBPHS = 0; // Set Phase register to zero
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Asymmetrical mode
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Master module
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // Sync down-stream module
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR=Zero
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR=Zero
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // set actions for EPWM1A
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.DBCTL.bit.IN_MODE = DB_DISABLE;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // Active Hi complementary
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // enable Dead-band module
EPwm1Regs.DBFED = FED_Value; // FED = 50 TBCLKs initially
EPwm1Regs.DBRED = RED_Value; // RED = 70 TBCLKs initially
//**************ePWM2 config ***************//
EPwm2Regs.TBCTL.bit.CLKDIV = TBCLK_DIV;
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TBHSPCLK_DIV; // ePWM Clock = 150 MHz
EPwm2Regs.TBPRD = Period_Value;
EPwm2Regs.CMPA.half.CMPA = Period_Value/2; // Set 50% fixed duty for EPWM1A
EPwm2Regs.TBPHS.half.TBPHS = 0; // Set Phase register to zero
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Asymmetrical mode
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Master module
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // Sync down-stream module
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR=Zero
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR=Zero
EPwm2Regs.AQCTLA.bit.ZRO = AQ_CLEAR; // set actions for EPWM1A
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;
// EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET; // set actions for EPWM1A
//EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm2Regs.DBCTL.bit.IN_MODE = DB_DISABLE;
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // Active Hi complementary
EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // enable Dead-band module
EPwm2Regs.DBFED = FED_Value; // FED = 50 TBCLKs initially
EPwm2Regs.DBRED = RED_Value; // RED = 70 TBCLKs initially
}
参考书籍:《TMS320F28335原理及其在电气工程中的应用》——巫付专