分享

DSPF28335-PWM模块

 李乃安 2017-04-14

PWM模块总结

PWM外设能够占用很小的CPU资源的情况下产生复杂的脉冲输出,也就是其灵活的特点使其必须根据需要进行编程。ePWM单元需要根据时序和控制需求对每一通道独立设置,以避免两个通道之间的干扰,这种互相独立的结构为应用提供了更大的灵活性。PWM模块是很多功率控制系统必须的控制单元,在商业和工业产品中都有应用,例如电机控制、数字开关电源、UPS电源等。ePWM还可以直接实现DAC功能,在作为DAC输出时,占空比与输出电压成正比。

一、F28335ePWM模块概述

ePWM模块的每个PWM通道有两个互补的PWM输出:EPWMxAEPWMxB,共6ePWM通道,依次与GPIO0-GPIO11引脚复用。为了能够输出更高精度的PWM信号,该模块还提供了HRPWM子模块。ePWM模块所以通道通过时间同步模式彼此联系,在必要的情况下多个通道可以同时操作,类似一个通道,也可以利用捕获单元eCAP实现通道间的同步控制。概括起来,ePWM模块主要特点包括:

(1)专用的16位时间基准计数器(定时器),控制PWM输出周期和频率。

(2)两个PWM输出(EPWMxAEPWMxB)有以下三种工作模式:

v  两个独立单边操作的PWM输出;

v  两个独立双边对称操作的PWM输出;

v  一个独立双边不对称边操作的PWM输出。

(3)软件实现PWM信号异步控制,即可编程相位控制,支持超前和滞后操作。

(4)每个周期硬件锁定相位(同步)关系。

(5)带有上升、下降沿独立控制的死区设置。

(6)可编程错误区域控制。

(7)产生错误时强制PWM输出高电平、低电平或高阻态。

(8)所以事件都能够触发CPU中断或/ADC启动(SOC.

(9)可编程事件预定标中断,减小CPU负载。

(10)高频载波信号产生PWM斩波,常用于脉冲变换门驱动电路。

1.ePWM主要子模块和相应配置参数。

ePWM子模块

配置参数

时间基准(TB

(1)和系统时钟相关的时间基准TBCLK):(计数速度)

(2)配置PWM时钟基准计数器(TBCTR)的频率或周期

(3)设置时钟计数模式:

v  增计数模式: 用于不对称PWM

v  减计数模式:用于不对称PWM

v  增减计数模式:用于对称PWM

(4)配置相对其他(同步)ePWM模块的时钟基准的相位。

(5)通过软件同步时间基准计数器。

(6)配置同步时间后时间基准计数的方向(递增或递减:CTR_DIR)。

(7)配置当仿真器停止器件运行时间基准计数方式。

(8)确定ePWM模块同步信号输出源:

v  同步输入信号;

v  时间基准计数器等于零;

v  时间基准计数器等于计数比较器BCMPB);

v  不产生同步输出信号。

计数比较(CC

(1)EPWMxAEPWMxB输出确定PWM占空比。

(2)确定EPWMxAEPWMxB上切换发生的时间。

动作限定(AQ

(1)确定当发生时间基准或计数比较子模块事件时的动作限定类型:

v  无操作;

v  EPWMxA/EPWMxB输出高电平;

v  EPWMxA/EPWMxB输出低电平;

v  EPWMxA/EPWMxB输出取反;

(2)通过软件强制PWM输出指定状态。

(3)通过软件配置和控制PWM死区。

死区(DB

(1)控制开关上下臂之间死区关系。

(2)确定输出上升/下降沿的延时值。

(3)死区设置禁止,PWM直接输出。

载波/斩波(PC)

(1)建立一个载波频率。

(2)第一个载波脉宽宽度。

(3)第二个和后续脉冲的占空比。

(4)不使用PWM载波模块,PWM直接输出。

错误控制(TZ

 

 

 

 

 

(1)配置ePWM模块响应错误引脚输入的错误状态(可以响应其中一个或几个,也可以全部响应)。

(2)确定错误时的具体操作:

v  强制EPWMxAEPWMxB输出高电平;

v  强制EPWMxAEPWMxB输出低电平;

v  强制EPWMxAEPWMxB输出高阻态;

v  配置EPWMxAEPWMxB忽略错误输入。

(3)配置ePWM响应错误引脚的频率:

v  一个流水周期(slot);

v  每个周期。

(4)使能错误控制初始化中断。

(5)不使用错误控制模块。

事件触发器(ET

 

(1)使能ePWM能够触发中断。

(2)使能ePWM能够触发ADC转换。

(3)可编程事件预定标中断,减小CPU(每个事件发生时或两个、三个四事件发生时产生一次触发)。

(4)挂起、设置或清除事件标志。

事件触发器说明:管理定时器模块和计数比较子模块产生事件,产生CPU中断和ADC开始转换的脉冲,所以也叫中断管理器。

 

注意:正常的发出PWM波一般需要配置:TB(定时器模块/时间基准模块)、CC(计数器比较模块)、AQ(比较方式预设模块/动作限定模块)、DB(死区模块)、ET(事件触发模块)等五个模块。下面分别介绍每一个模块

2.常用变量定义(DSP2833x_EPwm_defines.h


// TBCTL (Time-Base Control)

//==========================

// CTRMODE bits

#define    TB_COUNT_UP           0x0

#define    TB_COUNT_DOWN     0x1

#define    TB_COUNT_UPDOWN0x2

#define    TB_FREEZE         0x3

// PHSEN bit

#define    TB_DISABLE        0x0

#define    TB_ENABLE               0x1

// PRDLD bit

#define    TB_SHADOW              0x0

#define    TB_IMMEDIATE          0x1

// SYNCOSEL bits

#define    TB_SYNC_IN        0x0

#define    TB_CTR_ZERO            0x1

#define    TB_CTR_CMPB           0x2

#define    TB_SYNC_DISABLE   0x3

// HSPCLKDIV and CLKDIV bits

#define    TB_DIV1                     0x0

#define    TB_DIV2                     0x1

#define    TB_DIV4                     0x2

// PHSDIR bit

#define    TB_DOWN                  0x0

#define    TB_UP                         0x1

 

// CMPCTL (Compare Control)

//==========================

// LOADAMODE and LOADBMODE bits

#define    CC_CTR_ZERO            0x0

#define    CC_CTR_PRD              0x1

#define    CC_CTR_ZERO_PRD   0x2

#define    CC_LD_DISABLE 0x3

// SHDWAMODE and SHDWBMODE bits

#define    CC_SHADOW              0x0

#define    CC_IMMEDIATE  0x1

 

// AQCTLA and AQCTLB (Action Qualifier Control)

//===================================

// ZRO, PRD, CAU, CAD, CBU, CBD bits

#define    AQ_NO_ACTION  0x0

#define    AQ_CLEAR          0x1

#define    AQ_SET               0x2

#define    AQ_TOGGLE        0x3

 

// DBCTL (Dead-Band Control)

//==========================

// OUT MODE bits

#define    DB_DISABLE              0x0

#define    DBA_ENABLE            0x1

#define    DBB_ENABLE             0x2

#define    DB_FULL_ENABLE     0x3

// POLSEL bits

#define    DB_ACTV_HI              0x0

#define    DB_ACTV_LOC           0x1

#define    DB_ACTV_HIC            0x2

#define    DB_ACTV_LO             0x3

// IN MODE

#define DBA_ALL         0x0

#define DBB_RED_DBA_FED 0x1

#define DBA_RED_DBB_FED 0x2

#define DBB_ALL         0x3

 

// CHPCTL (chopper control)

//==========================

// CHPEN bit

#define    CHP_DISABLE     0x0

#define    CHP_ENABLE      0x1

// CHPFREQ bits

#define    CHP_DIV1            0x0

#define    CHP_DIV2            0x1

#define    CHP_DIV3            0x2

#define    CHP_DIV4            0x3

#define    CHP_DIV5            0x4

#define    CHP_DIV6            0x5

#define    CHP_DIV7            0x6

#define    CHP_DIV8            0x7

// CHPDUTY bits

#define    CHP1_8TH            0x0

#define    CHP2_8TH            0x1

#define    CHP3_8TH            0x2

#define    CHP4_8TH            0x3

#define    CHP5_8TH            0x4

#define    CHP6_8TH            0x5

#define    CHP7_8TH            0x6

 

// TZSEL (Trip Zone Select)

//==========================

// CBCn and OSHTn bits

#define    TZ_DISABLE        0x0

#define    TZ_ENABLE         0x1

 

// TZCTL (Trip Zone Control)

//==========================

// TZA and TZB bits

#define    TZ_HIZ                 0x0

#define    TZ_FORCE_HI      0x1

#define    TZ_FORCE_LO     0x2

#define    TZ_NO_CHANGE 0x3

 

// ETSEL (Event Trigger Select)

//=============================

#define    ET_CTR_ZERO     0x1

#define    ET_CTR_PRD       0x2

#define    ET_CTRU_CMPA  0x4

#define    ET_CTRD_CMPA  0x5

#define    ET_CTRU_CMPB  0x6

#define    ET_CTRD_CMPB  0x7

 

// ETPS (Event Trigger Pre-scale)

//=========================

// INTPRD, SOCAPRD, SOCBPRD bits

#define    ET_DISABLE        0x0

#define    ET_1ST                0x1

#define    ET_2ND               0x2

#define    ET_3RD                0x3

 

 

//--------------------------------

// HRPWM (High Resolution PWM)

//==========================

// HRCNFG

#define    HR_Disable           0x0

#define    HR_REP               0x1

#define    HR_FEP               0x2

#define    HR_BEP               0x3

 

#define    HR_CMP        0x0

#define    HR_PHS               0x1

 

#define    HR_CTR_ZERO    0x0

#define    HR_CTR_PRD       0x1


二.定时器(TB)模块

Register

Address offset

Shadowed

Description

TBCTL

0x0000

No

Time-Base Control Register

TBSTS

0x0001

No

Time-Base Status Register

TBPHSHR

0x0002

No

HRPWM Extension Phase Register

TBPHS

0x0003

No

Time-Base Phase Register

TBCTR

0x0004

No

Time-Base Counter Registe

TBPRD

0x0005

Yes

Time-Base Period Register

 

1.时间基准控制寄存器(TBCTL)

名称

功能描述

15-14

FREE,SOFT

仿真模式选择位:

作用:这些位在仿真过程中用于选择ePWM时间基准计数器的停止方式。

00:在下次时间基准计数器递增或递减后停止。

01:当计数器完成整个循环时停止。

   1)递增计数模式:当时间基准计数器=周期(TBCTR=TBPRD)时停止;

   2)递减计数模式:当时间基准计数模式=0x0000TBCTR=0x0000)时停止;

   3)递增递减计数模式:当时间计数器=0x0000TBCTR=0x0000)时停止。

1X:自由运行。

13

PHSDIR

同步相位计数器方向位:

作用:配置同步时间后时间基准计数的方向(递增或递减),即继续TBPHS的值向0计数还是向PRD方向计数。(0<TBPHS<PRD

条件:仅当时间基准计数器工作在递增递减计数模式起作用。

0:同步后递减计数;

1:同步后递增计数。

12-10

CLKDIV

PWM模块核心预分频位:

作用:确定和系统时钟相关的时间基准(TBCLK

说明:设K分别对应该位的十进制数,则预分频系数为

9-7

HSPCLKDIV

PWM模块高速时钟预分频位:

作用:确定和系统时钟相关的时间基准(TBCLK

说明:K2分别对应该位的十进制数,则预分频系数为

6

SWFSYNC

软件强制同步输入脉冲使能位:

条件:只有当SYNCOSEL=00,即同步输入等于同步输出时有效。

0:写入0没有影响,并且读取总返回0

1:写入1导致一次性同步脉冲的产生,此事件与ePWM模块的EPWMxSYNCI输入相或

说明:输入脉冲用来决定时间基准计数器和ePWM模块同步,ePWM外设可以配置为使用或者忽略该信号,对于第一个ePWM模块(EPWM1),该信号来自外部引脚,而其他模块信号则源于上一级ePWM模块。例如EPWM2SYNCIePWM1外设EPWM1SYNCO产生,EPWM3SYNCIEPWM2SYNCOO产生,以此类推。

5-4

SYNCLSEL

同步信号输出源选择位:

作用:确定ePWM模块同步信号输出源:

00EPWMxSYNC软件同步

01TBCTR=0x0000

10TBCTR=CMPB

11:禁止EPWMxSYNCO信号。

3

PRDLD

周期寄存器加载模式位:

作用:周期寄存器(TBPRD)工作模式。

0:间接加载模式,即使能周期影子寄存器(默认)

1:直接加载模式,即禁止周期影子寄存器。

2

PHSEN

相位寄存器使能位:

作用:配置相对其他ePWM模块的时钟基准的相位使能位。

0:禁止相位寄存器;

1:使能相位寄存器。.

1-0

CTRMODE

计数器模式:

00:递增计数模式;

01:递减计数模式;

递增、递减计数模式:.

10:递增/递减计数模式;

增减计数模式:.

11:停止计数模式;(复位时默认)

2.时基状态寄存器(TBSTS):用来检测TB模块状态

该寄存器不需要进行配置,一般用于编程时使用,写入1到此为将清除此位锁存事件(清零)。

名称

说明

15-3

保留

 

2

CTR_MAX

时间基准计数器等于最大值(TBCLK=0xFFFF):

0:表示时间基准计数器从来没有达到它的最大值。

1:表明时间基准计数器达到其最大值0xFFFF,该位只能作为状态位使用。

1

SYNCI

输入同步锁定状态标志位:

0:读取0表示没有外部同步事件发生。写0无效

1:读取1表示一个外部同步事件发生(EPWMxSYNCI,1将清除锁存事件。

0

CTR_DIR

时间基准计数器方向:(只读)

0:间时基准计数器递减计数;

1:时间基准计数器递增计数。

3.时间基准相位寄存器(TBPHS):配置相对其他ePWM模块的时钟基准的相位。

名称

说明

15-0

TBPHS

时间基准相位寄存器:

作用:配置相对其他ePWM模块的时钟基准的相位。如果TBCTL[PHSEN]=0,则同步事件被忽略;当TBCTL[PHSEN]=1时,则当同步事件发生时,时间基准计数器(TBCTR)将加载相位寄存器(TBPHS)的值。其中,同步事件则会以同步输入信号(EPWMxSYNCI)或软件强制同步触发。

4.时间基准计数器(TBCTR

名称

说明

15-0

TBCTR

作用:读取这些位得到目前时间基准计数器的值;当向这些位写入值时设定当前时间基准计数器的值。

 

5.时间基准周期寄存器(TBPRD):配置ePWM模块工作的频率或周期。

 

名称

说明

15-0

TBPRD

时间基准周期寄存器:

作用:配置PWM时钟基准计数器(TBCTR)的频率或周期。

 

注意:正确使用ePWM时钟

    PCLKCR0-外设时钟控制寄存器0TBCLKSYNC位,可以用于全局同步所有ePWM模块的时基时钟。当SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0时,所有的ePWM模块的时基时钟停止;当SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1时,所有的ePWM模块的时基时钟开始。为了精确同步TBCLKTBCTL的比例因子位必须设置相同。具体步骤如下:

(1)禁止各个ePWM模块外设时钟;

(2)配置ePWM模块;

(3)使能各个ePWM模块外设时钟.

   EALLOW;

   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;

   EDIS;

 

   InitEPwm1Example();

   ...........................

 

   EALLOW;

   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;

   EDIS;

三.计数器比较模块

作用:设置PWM占空比,计数器比较模块包括以下寄存器比较控制寄存器,比较值寄存器A和比较值寄存器B

 

Register

Address offset

Shadowed

Description

CMCTL

0x0007

No

Counter-Compare Control Register

CMPAHR

0x0008

Yes

HRPWM Counter-Compare A Extension Registerr

CMPA

0x0009

Yes

Counter-Compare A Register

CMPB

0x000A

Yes

Counter-Compare B Register

 

1.比较控制寄存器CMPCTL

作用:设置CMPA,CMPB寄存器的加载影子寄存器的条件,影子寄存器状态标识位和比较寄存器的影子寄存器使能位。

 

名称

说明

15-10

保留

 

9

SHDWBFULL

计数比较器B(CMPB)影子寄存器满状态标志

0:影子寄存器没有值;

1:影子寄存器被写入,这是满足一定条件时传递给CMPB一般用于软件编程

8

SHDWAFULL

计数比较器A(CMPA)影子寄存器满状态标志:

7

保留

 

6

SHDWBMODE

计数比较B(CMPB)阴影寄存器使能位

0:间接模式,也就是双缓冲模式,所以的写操作都通过CPU访问影子寄存器(推荐)

1:直接模式。

5

保留

 

4

SHDWAMODE

计数比较A(CMPA)阴影寄存器使能位:

3-2

LORDBMODE

比较值主寄存器B从影子寄存器加载条件选择位

作用:决定什么条件下比较值主寄存器从影子寄存器加载数值。

条件:该位在间接模式才有效,即SHDWBMODE=0阴影寄存器使能。

00:当TBCTR=0X0000时加载;

01:当TBCTR=TBPRD加载

10:当TBCTR=0X0000TBCTR=TBPRD加载;

11:禁止

1-0

LORDAMODE

比较值寄存器A从影子寄存器加载条件选择位:

 

2.比较值寄存器ACMPA):设置EPWMxA的比较值,有影子寄存器

名称

说明

15-0

CMPA

比较值寄存器A

作用:在CMPA寄存器中的值不断与时间基准计数器(TBCTR)相比较,当值相等时,计数比较模块生成一个“时间基准计数器等于比较器A的事件”。这一事件被发送到动作限定模块寄存器,在动作限定模块里事件将被限定并被转化为一个或多个动作。

 

3.比较值寄存器BCMPB):设置EPWMxB的比较值,有影子寄存器。

四.动作限定子模块:比较方式预设模块

    动作限定子模块在波形构造过程中和PWM产生中具有重要的作用。他决定那个事件转换成各种动作类型,从而得到EPWMAEPWMB输出要的波形。即动作限定子模块AQ用于设置PWM的动作方式(00:无动作、01:置零、10:置位、11:取反)。

1.PWM xA动作限定输出控制寄存器(AQCTLA

名称

位域描述

15-12

保留

 

11-10

CBD

作用:当时间基准计数器等于主CMPB寄存器,并且计数器递减时工作。

9-8

CBU

作用:当时间基准计数器等于主CMPB寄存器,并且计数器递增时工作。

7-6

CAD

作用:当时间基准计数器等于主CMPA寄存器,并且计数器递减时工作。

5-4

CAU

作用:当时间基准计数器等于主CMPA寄存器,并且计数器递增时工作。

3-2

PRD

作用:当时间基准计数器等于周期寄存器时动作;

1-0

ZRO

作用:当计数器等于0时动作:

2.PWMxB 动作限定输出控制寄存器(AQCTLB

五.死区模块(DB

作用:根据信号ePWMxA输入产生带死区的信号对,推荐模式:EPWMxA为上升沿延时,EPWMxB为下降沿延时(EPwm1Regs.DBCTL.all=0x0023)。

1:死区模块原理图

 

1.死区控制寄存器(DBCTL):设置S5S4S3S3S2S1S0开关选择的     

 

名称

说明

15-6

保留

 

5-4

IN_MODE

死区模块输入源控制位

作用:通过位5控制S5开关,位4控制S4开关,选择死区输入信号。

00:将EPWMxA In作为EPWMxA死区和EPWMxB死区的输入源;

01:将EPWMxB InEPWMxAEPWMxA InEPWMxB

10:将EPWMxA InEPWMxAEPWMxB InEPWMxB(推荐)

11:将EPWMxB In(来自行动限定模块)作为EPWMxA死区和EPWMxB死区的输入源。

3-2

POLSEL

极性(高低电平)控制位:

作用:通过位3控制S3,位2控制S2。在把延迟信号发送到死区模块之前,可以有选择地取反一个延迟信号以改变输出波形的极性。

00EPWMxAEPWMxB均不反(默认)

01EPWMxA取反;

10EPWMxB取反;

11EPWMxAEPWMxB均取反。

1-0

OUT_MODE

死区输出选择模式控制位:

作用:通过位1控制S1,位0控制S0,实现有选择地开启或关闭死区模块。

00:死区禁止;

01:上升沿死区延迟使能;

10:下降沿死区延迟使能;

11:上升沿和下降沿死区延迟全部使能(推荐)

2.死区上升沿延迟时间值寄存器( DBRED

作用:在死区模块中可以通过配置DBREDDBFED寄存器,设置一个周期内信号上升沿延迟值(RED)和下降沿延迟的值(FED),边沿延迟时间与定时器时钟(TBCLK)成正比。

 

名称

说明

15-10

保留

 

9-0

RED

上升边沿计数,最大死去延时时间为0x3FF

3. 死区下降沿延迟时间值寄存器(DBFED

名称

说明

15-10

保留

 

9-0

FED

下降边沿计数,最大死去延时时间为0x3FF

六.载波子模块PC——一般情况下禁止

1.载波模块控制寄存器(PCCTL

名称

说明

15-11

保留

 

10-8

CHPDUTY

载波时钟占空比:

作用:控制第二次和后续脉冲的占空比.
000
Duty = 1/8 (12.5%)
001
Duty = 2/8 (25.0%)
010
Duty = 3/8 (37.5%)
011
Duty = 4/8 (50.0%)
100
Duty = 5/8 (62.5%)
101
Duty = 6/8 (75.0%)
110
Duty = 7/8 (87.5%)
111
Reserved

7-5

CHPFREQ

载波时钟频率预分频位(chop frequence):

作用:建立一个载波模块的工作频率。

000:不分频;(推荐)

4-1

OSHTWTH

单次脉冲宽度(one-shot pluse width):

说明:K分别对应该位十进制值,则单次脉冲宽度:

0

CHPEN

PWM载波模块使能位:

0:禁止;

1:启用载波模块。

七.事件触发器(ET):中断管理器

2:事件触发模块原理图

1.中断选择寄存器(ETSEL

作用:中断使能、及中断源选择(EPWMxSOCA触发ADC转换、EPWMxSOCB触发ADC转换、CPU中断)

 

名称

说明

15

SOCBEN

使能ADC开始转换BEPWMxSOCB)脉冲产生:

0:禁止EPWMxSOCB发出中断请求;

1:使能EPWMxSOCB发出中断请求。

14-12

SOCBSEL

EPWMxSOCB选项:

作用:这些位决定EPWMxSOCB脉冲产生条件。

条件:ETSEL[SOCBEN]=1

000:保留;

001:使能事件,当时间基准计数器等于0;(推荐

010:使能事件,当时间基准计数器等于周期TBCTR=TBPRD

011:保留;

100:使能事件,当时间基准工作于递增模式且计数器等于CMPA

101:使能事件,当时间基准工作于递减模式且计数器等于CMPA

110:使能事件,当时间基准工作于递增模式且计数器等于CMPB

111:使能事件,当时间基准工作于递减模式且计数器等于CMPB

11

SOCAEN

使能ADC开始转换AEPWMxSOCA)脉冲产生:

0:禁止EPWMxSOCA

1:使能EPWMxSOCA

10-8

SOCASEL

EPWMxSOCA选项:

作用:这些位决定EPWMxSOCB脉冲产生条件。

7-4

保留

 

3

INTEN

使能CPU中断(ePWMx_INT):

0:禁止ePWMx_INT生成;

1:使能ePWMx_INT生成。

2-0

INTSEL

CPU中断源选择:

作用:这些位决定EPWMxINT脉冲产生条件。

 

2.中断预分频寄存器(ETPS

作用:确定事件产生触发的速度(每个事件发生时或两个、三个四事件发生时产生一次触发)。

xxxCNT记录事件发生次数,当与xxxPRD(预设发生次数)相等时,发出中断信号,xxxCNT停止计数,这时标志位清除时xxxCNT清零重新计数。

 

名称

说明

15-14

SOCBCNT

ePWM ADC开始变换B事件(ePWMxSOCB)计数器寄存器:

作用:这些位标志着有多少个ETSEL[SOCBSEL]事件已经发生。

00:没有事件发生;01:1已经个事件发生;

10:2个事件已经发生;11:3个事件已经发生。

13-12

SOCBPRD

ePWM ADC开始变换B事件(ePWMxSOCB)周期选择:

作用:可编程事件预定标中断,减小CPU负载。这些位决定ePWMxSOCB脉冲产生需要多少选定的事件。

00:禁止SOCB事件计数器,没有ePWMxSOCB脉冲产生;

01:产生一个事件时生成ePWMxSOCB脉冲(ETPS[SOCBCNT=01]);

10:产生两个事件时生成ePWMxSOCB脉冲(ETPS[SOCBCNT=10]);

11:产生三个事件时生成ePWMxSOCB脉冲(ETPS[SOCBCNT=11])。

11-10

SOCACNT

ePWM ADC开始变换A事件(ePWMxSOCA)计数器寄存器标志位:

作用:这些位标志着有多少个ETSEL[SOCASEL]事件已经发生。((具体参看15-14)

9-8

SOCAPRD

ePWMxSOCA周期选择:

作用:这些位决定ePWMxSOCA脉冲产生需要多少选定的事件。

7-4

保留

 

3-2

INTCNT

ePWM中断计数器标志位:(不需要预先配置)

作用:标志着有多少个ETSEL[INTSEL]事件已经发生。

说明:当一个中断脉冲信号发生时这些位会自动清零;如果中断禁用或中断标志位被设定,则当达到周期值ETPS[INTCNT]=ETPS[INTPRD]时,计数器就会停止。

1-0

INTPRD

ePWM中断周期选择:

作用:决定有多少选定的ETSEL[INTSEL]事件需要发生多少次才能产生中断(ePWMx_INT)脉冲信号。

说明:如果相应的状态标识位被置位(ETFLG[INTCNT]=1),其他中断就会被暂挂。如果一个中断暂挂,其他中断不会再生成,除非通过ETCLR[INT]位清零。

3.事件触发标志寄存器(ETFLG

作用:0:没有发生;状态标志位,中断时为1.

 

名称

说明

15-4

保留

 

3

SOCB

ePWM模块EPWMxSOCB启动ADC转换状态标志位:

说明:即使该标志位被置位,该EPWMxSOCB输出也将继续产生。

2

SOCA

ePWM模块EPWMxSOCA启动ADC转换状态标志位:

说明:即使该标志位被置位,该EPWMxSOCA输出也将继续产生。

1

保留

 

0

INT

ePWM模块CPU中断状态标志位:

说明:如果相应的状态标识位被置位,即(ETFLG[INTCNT]=1),其他中断就会被暂挂。如果一个中断暂挂,他不会再生成,除非通过ETCLR[INT]位清零。

 

4.事件触发清除寄存器(ETCLR

说明:写0无效;写1清除相应的标志位。

 

名称

说明

15-4

保留

 

3

SOCB

ePWM ADC开始变换B事件状态标识清除位

2

SOCA

ePWM ADC开始变换A事件状态标识清除位

1

保留

 

0

INT

ePWM中断状态标识清除位

一般配置如下:

EPwm1Regs.ETSEL.bit.INTEN = 1;                  // 使能INT

EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;     //  中断源选择

EPwm1Regs.ETPS.bit.INTPRD = ET_3RD;            // 在第三个事件产生中断

 

【例】:将PWM1配置为,递增递减计数模式并产生死区控制,其中PWM1为低电平有效,相应信号对电平极性取反。PWM配置为第三个事件中断,此时死区调整区间为:0<=DB<=DB_MAX

//=====================================================================

#include "DSP28x_Device.h"

#include "DSP28x_Examples.h"

 

// 本程序所涉及的原函数声明

void InitEPwm1Example(void);     

interrupt void epwm1_isr(void);

 

 // 本例中的全局变量

Uint32  EPwm1TimerIntCount;    

Uint16  EPwm1_DB_Direction;

 

// 最大、最小死区值

#define EPWM1_MAX_DB   0x03FF  

#define EPWM1_MIN_DB    0

 

//死区计数方向

#define DB_UP    1

#define DB_DOWN   0

//---------------------------------------------------------------------------------------------------------------------------------------------------------

void main(void)

{

// Step 1. 初始化系统控制

   InitSysCtrl();

 

// Step 2.初始化GPIO

/// 本例涉及 ePWM1GPIO口引脚

   InitEPwm1Gpio();

 

// Step 3. 关闭所有中断并初始化PIE矢量表:

// 1禁止全局中断

   DINT;

// 2初始PIE控制寄存器为初始状态:禁止所有的PIE中断;并且清除所以中断标志位。

   InitPieCtrl();

// 3禁止CPU中断,并且清除所有CPU中断标志位:

   IER = 0x0000;

   IFR = 0x0000;

// 4初始化服务子程序(ISR):对所以PIE向量表中的所有中断向量配置对应的入口地址,并对.

   InitPieVectTable();

// 5&epwm1_isr入口地址赋值给EPWM1_INT中断向量:当CPU响应EPWM1_INT中断向量请求时,程序将跳转到epwm1_isr()函数的入口地址,执行这个中断服务程序。

   EALLOW;

   PieVectTable.EPWM1_INT = &epwm1_isr;

   EDIS;   

 

// Step 4.初始化器件外设:时钟、参数配置等

// InitPeripherals();  // 使能外设时钟

//正确ePWM时钟使能

//(1) 禁止各个ePWM模块外设时钟;

   EALLOW;

   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;

   EDIS;

//(2) 配置ePWM模块;

   InitEPwm1Example();

//(3) 使能各个ePWM模块外设时钟.

   EALLOW;

   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;

   EDIS;

 

// Step 5. 用户代码,使能中断

// (1) 初始化计数器

   EPwm1TimerIntCount = 0;  //中断计数变量清零

// (2)使能CPU3组中断:CPU INT3     

   IER |= M_INT3;       

// (3)使能PIE EPWM INTn3组第1个中断的    

   PieCtrlRegs.PIEIER3.bit.INTx1 = 1;  

// (4) 使能全局中断和最高优先级的实时调试事件:

   EINT;   // 使能全局中断;

   ERTM;   // 使能全局实时中断DBGM

// Step 6. 循环等待中断:

   for(;;)

   {

       asm(" NOP");

   }

}

////-------------------------------------------------------------------------------------------------------------------------------------------------------

interrupt void epwm1_isr(void)  //PWM中断函数

{

   If  (EPwm1_DB_Direction == DB_UP)

   {

       if(EPwm1Regs.DBFED < EPWM1_MAX_DB)

       {

          EPwm1Regs.DBFED++;

          EPwm1Regs.DBRED++;

       }

       else

       {

          EPwm1_DB_Direction = DB_DOWN;

          EPwm1Regs.DBFED--;

          EPwm1Regs.DBRED--;

       }

   }

   else

   {

       if(EPwm1Regs.DBFED == EPWM1_MIN_DB)

       {

          EPwm1_DB_Direction = DB_UP;

          EPwm1Regs.DBFED++;

          EPwm1Regs.DBRED++;

       }

       else

       {

          EPwm1Regs.DBFED--;

          EPwm1Regs.DBRED--;

       }

   }

   EPwm1TimerIntCount++;     //中断计数变量加1

   EPwm1Regs.ETCLR.bit.INT = 1;   // 清除EPWM1_INT中断标志位

   PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; // 清除PIE应答寄存器

}

void InitEPwm1Example()   //初始化PWM配置函数

{

   EPwm1Regs.TBPRD = 6000;                        // 设置时间计数周期

   EPwm1Regs.TBPHS.half.TBPHS = 0x0000;           // 时间基准相位寄存器清零

   EPwm1Regs.TBCTR = 0x0000;                      // 清零计数寄存器 

  

  // 启动 TBCLK

   EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 计数模式:对称输出

   EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;  // 禁止相位寄存器加载(禁止同步)

   EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4;       // 高速时钟预分频

   EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV4;          //时间基准预分频

   // 比较寄存器加载模式

   EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

   EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

  //  阴影寄存器加载条件

   EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

   EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

 

   // 启动比较器

   EPwm1Regs.CMPA.half.CMPA = 3000;

 

   // 配置动作限定模块

   EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;             // PWM1A =Zero1

   EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;

   EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;          //  PWM1A = Zero1

   EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;

 

   // 死区模块配置

   EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;

   EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_LO;

   EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;

   EPwm1Regs.DBRED = EPWM1_MIN_DB;

   EPwm1Regs.DBFED = EPWM1_MIN_DB;

   EPwm1_DB_Direction = DB_UP;

 

   // 中断,用户选择死区

   EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;     //  在第零个事件选择INT

   EPwm1Regs.ETSEL.bit.INTEN = 1;                // 使能INT

   EPwm1Regs.ETPS.bit.INTPRD = ET_3RD;           // 在第三个事件产生中断

 

}

//=====================================================================

// No more.

//=====================================================================

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多