TMS320F28335入门(六)ePWM学习

C28335的EPWM模块是加强(Enhanced)模块:
主要表现在它各个epwm的独立性,每个epwm小模块都有两路pwm输出,分别为EPWMxA、EPWMxB;
一个epwm模块,可以配置成三种输出:
两路独立的单边沿PWM输出;
两路独立的但互相对称的双边沿PWM输出;
一对双边沿非对称的PWM输出;
C28335一共有6个EPWM模块,除此之外还有6路高分辨率的PWM模块,是由CAP模块配置而来;
一个EPWM模块主要由:时基模块(TB)、比较计数模块(CC)、动作模块(AQ)、
死区模块(DB)、PWM斩波模块(PC)、触发模块(ET)、联防模块(TZ)组成;
TB:为输出的PWM产生一个时间基准TBCLK,配置PWM的时钟基准计数器TBCTR,
设置计数器的计数模式,配置硬件或者软件同步时钟基准计数器,确定EPWM同步信号输出源;
CC:确定PWM占空比,以及EPWM输出高低电平的切换时间;
AQ:EPWM的高低电平的切换;
DB:配置输出PWM上升沿或下降沿的延时时间
PC:产生高频PWM载波信号;
TZ:当外部有错误信号时,对PWM输出进行相应处理:例如全置高、全置低或者高阻态,也可以软件处理;
EZ:使能EPWM中断,确定事件产生的触发的速度和清除相关事件标志位;
如果只需要输出普通PWM信号只需要依次配置:TB->CC->AQ->(DB);

影子寄存器:
在DSP中有两种寄存器,活动寄存器(active register)、影子寄存器(shadow register);
active:是直接控制硬件电路的,
shadow:不可以直接控制电路,它是提供给活动寄存器一个存放状态和值的地址;
在软件配置寄存器和硬件不同步时,它可以将存放的数据传递给活动寄出器,可以有效防止因为软硬件不同步导致的硬件崩溃;

时基模块(TB)作用:
确定PWM的频率、管理PWM相位、设置时基计数器的计数模式 up/down/up_and_down、对系统时钟进行分频,输出较低频率的PWM信号
TB的计数模式由时基控制寄存器决定(TBCTL)
PWM输出频率由时基周期寄存器(TBPRD)和计数模式(TBCTRL)共同决定
up_and_down count mode: Tpwm = 2 * TBPRD * Ttbclk(TB的时钟周期)
up count mode: Tpwm = (TBPRD + 1) * Ttbclk;
down count mode: Tpwm = (TBPRD + 1) * Ttbclk;
计数比较模块(CC)作用:
以时基计数器的值作为输入,与比较寄存器CMPA、CMPB的值不断进行比较的,当时基计数器的值等于其中之一时,就会产生相应事件;
再与动作模块(AQ)配合来调节PWM的占空比和频率;可以采用影子装载模式,防止出现故障以及毛刺;
//装载模式:立即 or 影子
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; //CMPA影子装载模式 = 0
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; //CMPB影子装载模式 = 0
//装载条件
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; //CTR=0 影子寄存器A装载
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; //CTR=0 影子寄存器B装载

动作模块(AQ)的作用:
根据计数比较器的模块提供的信号,决定PWM输出极性;
由于在同一时刻,AQ可能会收到2个或者2个以上的事件信号,故AQ模块具有优先级(1最高 -> 6最低);

//CPU频率
#define CPU_CLK   150e6
//输出PWM的频率
#define PWM_CLK   10e3
//时基周期寄存器(up_and_down count mode)
#define SP        CPU_CLK/(2*PWM_CLK)

void EPwmSetup()
{
 //初始化EPWM1的IO口
 InitEPwm1Gpio();
 //初始化时基状态寄存器
 EPwm1Regs.TBSTS.all=0;                      
 //初始化时基相位寄存器
 EPwm1Regs.TBPHS.half.TBPHS=0;               
 //初始化时基计数器
 EPwm1Regs.TBCTR=0; 

 //设置计数模式
 EPwm1Regs.TBCTL.bit.CTRMODE=TB_COUNT_UPDOWN;
 //禁止相位寄存器
 EPwm1Regs.TBCTL.bit.PHSEN=TB_DISABLE;        
 //禁止影子寄存器,即刻装载模式
 EPwm1Regs.TBCTL.bit.PRDLD=TB_IMMEDIATE;     
 //禁止同步信号输出
 EPwm1Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_DISABLE;
 //禁止强制脉冲
 EPwm1Regs.TBCTL.bit.SWFSYNC=0;              
 //高速时钟1倍分频
 EPwm1Regs.TBCTL.bit.HSPCLKDIV=TB_DIV1;       
 //时基时钟1倍分频
 EPwm1Regs.TBCTL.bit.CLKDIV=TB_DIV1;          
 //同步信号到来,向下计数
 EPwm1Regs.TBCTL.bit.PHSDIR=0;                
 //仿真模式位
 EPwm1Regs.TBCTL.bit.FREE_SOFT=0;            
 
 //设置时基周期寄存器
 EPwm1Regs.TBPRD=SP;
 EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_LD_DISABLE;   //禁止影子寄存器A装载
 EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_LD_DISABLE;   //禁止影子寄存器B装载
 EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_IMMEDIATE;    //CMPA立即装载
 EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_IMMEDIATE;    //CMPB立即装载

 //设置比较寄存器的值
 EPwm1Regs.CMPA.half.CMPA =SP/2; 
 EPwm1Regs.CMPB=0;

 //设置PWM输出极性
 EPwm1Regs.AQCTLA.bit.CAU= AQ_SET;                 // CTR上升至CMPA值 置1 ePWMA输出高
 EPwm1Regs.AQCTLA.bit.CAD= AQ_CLEAR;               // CTR下降至CMPA值 置0 ePWMA输出低
 EPwm1Regs.AQCTLB.bit.CBU= AQ_SET;                 // CTR上升至CMPB值 置1 ePWMB输出高
 EPwm1Regs.AQCTLB.bit.CBD= AQ_CLEAR;               // CTR下降至CMPB值 置0 ePWMB输出低
 
 EPwm1Regs.AQSFRC.all=0;                            //动作强制寄存器清0
 EPwm1Regs.AQCSFRC.all=0;

 //配置死区时间
 EPwm1Regs.DBCTL.bit.OUT_MODE=0X03;                 //死区使能双边沿延时
 EPwm1Regs.DBRED=0;                                 //死区上升沿延时计数器
 EPwm1Regs.DBFED=0;                                 //死区下降沿延时计数器
/*****************************************************************
 EPwm1Regs.TZSEL.all=0;                             //联防关闭
 EPwm1Regs.TZCTL.all=0;
 EPwm1Regs.TZEINT.all=0;
 EPwm1Regs.TZFLG.all=0;
 EPwm1Regs.TZCLR.all=0;
 EPwm1Regs.TZFRC.all=0;

 EPwm1Regs.ETSEL.all=0;                             //事件触发关闭
 EPwm1Regs.ETFLG.all=0;
 EPwm1Regs.ETCLR.all=0;
 EPwm1Regs.ETFRC.all=0;

 EPwm1Regs.PCCTL.all=0;                             //斩波关闭
******************************************************************/
}

你可能感兴趣的:(F28335学习)