28335的PWM模块是加强模块,这个加强表现在它各个ePWM的独立性,每个ePWM小模块都由两路ePWM输出组成,分别为ePWMxA和ePWMxB,
这一对PWM输出,可以配置成三种输出
两路独立的单边沿PWM输出
两路独立的但互相对称的双边沿PWM输出
一对双边沿非对称的PWM输出
F28335共有6对这样ePWM模块,因为每对PWM模块中的两个PWM输出均可以单独使用,所以也可以认为有12路单路ePWM。
另外还有6路加强版PWM,是通过CAP模块配置而来,所以F28335可以认为由18路PWM输出,这是非常强大的。
结构图如下图所示:
总体而言,PWM模块是由七个模块组成,
时基模块 TB
比较计数模块 CC
动作模块 AQ
死区模块 DB
PWM斩波模块 PC
事件触发模块 ET
联防模块 TZ
每个模块各自作用如下:
TB :为输出PWM产生始终基准TBCLK,配置PWM的时钟基准计数器TBCTR,设置计数器的计数模式,配置硬件或软件同步时钟基准计数器,确定ePWM同步信号输出源;
CC:确定PWM占空比,以及ePWM输出高低电平切换时间;
AQ:确定计数器和比较寄存器匹配时产生动作,即ePWM 高低电平的切换;
DB:配置输出PWM上升沿或下降沿延时时间,也可以将A、B两通道配置成互补模式,我做的逆变器就是将ePWM配置成互补模式。死区时间可以编程确定;
PC:产生高频PWM载波信号;
TZ:当外部有错误信号产生时,对PWM输出进行相应处理,比如全置高,或拉低,或置为高阻态,从而起到保护作用。当然该功能也可以通过软件强制产生;
EZ:使能ePWM中断,使能ePWM触发ADC采样,确定事件产生触发的速度和清除相关事件标志位。
ePWM模块的7个模块就像一条生产线,一级一级的经过,但DSP更高级,可以实现通过配置,使得ePWM只经过我选择的生产线,没有被选择上的就不要经过。例如,死区控制模块可以需要也可以不需要,这就看实际系统需不需要了。在实际使用ePWM时,正常的发出PWM波往往只要要配置TB、CC、AQ、DB、ET五个模块。
小结:
因为我们是做控制的,PWM模块是重中之重。PWM的原理我们了解即可,在F28335的应用中最主要的还是这七个模块的配置。PWM最基本的属性周期频率,幅值,占空比,死区时间,故障保护还有与其他ePWM模块的配合,都是通过配置以上模块中的寄存器来实现的,在我们能够了解这些原理之后,做实验自己配置下载到芯片中,并在示波器里观察波形,这样才能做到熟悉和了解,后面的文章将具体的记载ePWM各个模块的寄存器配置。
这个代码的功能
是在ePWMA 即GPIO0口输出一个周期为100us,占空比为50%的PWM波。
#include “DSP2833x_Device.h”
#include “DSP2833x_Examples.h”
#if (CPU_FRQ_150MHZ)
#define CPU_CLK 150e6
#endif
#if (CPU_FRQ_100MHZ)
#define CPU_CLK 100e6
#endif
#define PWM_CLK 10e3
#define SP CPU_CLK/(2*PWM_CLK)
#define TBCTLVAL 0x200A
void EPwmSetup()
{
InitEPwm1Gpio();
EPwm1Regs.TBSTS.all=0; //时基状态寄存器初始化
EPwm1Regs.TBPHS.half.TBPHS=0; //时基相位寄存器清0
EPwm1Regs.TBCTR=0; //时基计数器清0
EPwm1Regs.TBCTL.bit.CTRMODE=TB_UP_DOWN; //计数模式
EPwm1Regs.TBCTL.bit.PHSEN=TB_DISABLE; //禁止相位寄存器
EPwm1Regs.TBCTL.bit.PRDLD=TB_IMMEDIATE; //禁止影子寄存器,即刻装载模式
EPwm1Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_DISABLE;//禁止同步信号输出
EPwm1Regs.TBCTL.bit.SWFSYNC=0; //禁止强制脉冲
EPwm1Regs.TBCTL.bit.HSPCLKDIV=TB_DIV1; //高速时钟分频 1倍分频
EPwm1Regs.TBCTL.bit.CLKDIV=TB_DIV1; //时基时钟分频 1倍分频
EPwm1Regs.TBCTL.bit.PHSDIR=0; //同步信号来时 向下计数
EPwm1Regs.TBCTL.bit.FREE_SOFT=0; //仿真模式位,为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;
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; //斩波关闭
}
关于影子寄存器:
采用影子寄存器来更新比较值CMPA和CMPB 能够有效的防止在PWM周期内出现故障以及毛刺。
一般对计数控制寄存器的配置主要是配置好影子寄存器。
配置方式:
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; //CMPA影子装载模式
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; //CMPB影子装载模式
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; //CTR=0 影子寄存器A装载
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; //CTR=0 影子寄存器B装载
死区模块:
2.2 死区模块DB的工作特点
如上图所示:
死区模块具有2组独立的选择机制
ePWMA作为上升沿下降沿输入源,系统默认选择
ePWMA作为上升沿输入源,ePWMB作为下降沿输入源
ePWMB作为上升沿输入源,ePWMA作为下降沿输入源
ePWMB作为上升沿下降沿输入源
输出模式可选择
禁止边沿延时,禁止死区功能
禁止上升沿延时,使能下降沿延时
禁止下降沿延时,使能上升沿延时
双边沿延时
输出极性可选择
ePWMA和ePWMB都不翻转
ePWMA翻转,ePWMB不翻转
ePWMB翻转,ePWMA不翻转
ePWMA和ePWMB都翻转
作者:沉沙丶
来源:CSDN
原文:https://blog.csdn.net/sy243772901/article/details/83181656
版权声明:本文为博主原创文章,转载请附上博文链接!