6.1.4 错误联防模块TZ
每个 ePWM 模块都与 GPIO 多路复用引脚中的 6 个 TZn(TZ1-TZ6)信号脚连接。这些信号脚用来响应外部错误或外部触发条件,当错误发生时,PWM 模块可以通过编程来响应这些问题。错误联防模块的位置如下图所示:
错误联防模块的主要作用如下:
①错误联防引脚 TZ1-TZ6 可以灵活的映射到对应的 PWM 模块。
②针对错误信息,ePWMxA 和 ePWMxB 可以被强制或如下几种状态:
--高电平。
--低电平。
--高阻抗。
--无动作。
③在短路或者过流条件时,支持一次错误联防触发。
④针对限流操作时,支持周期错误联防触发。
⑤每个错误联防输入引脚都可以配置为一次或者周期错误联防触发。
⑥任何一个错误联防引脚都可以产生中断。
⑦支持软件强制错误联防。
⑧如果不需要此模块,可以选择禁止。
(1)错误联防模块的操作
TZ1-TZ6 的输入引脚为低有效。当这些引脚中的任意一个有效时,表明一个错误事件发生,每个 PWM 模块都可以单独配置为禁止或者使能此错误联防触发引脚。ePWM 模块选择哪一个错误引脚是通过 TZSEL 进行设置的,错误信号可以和系统时钟同步,也可以不同步,同样具有数字滤波功能,跟 GPIO 引脚一样。一个系统时钟的低脉冲输入即可以有效触发错误控制逻辑。异步触发确保在系统时钟发生错误的情况下,错误引脚仍能触发错误控制逻辑。其余的配置可以参照GPIO 的引脚配置。每个 TZn 输入引脚可以单独配置一次触发或者周期触发。
①周期触发:当周期错误联防事件发生时,TZCTL 寄存器中的动作立刻输出到 ePWMxA 和 ePWMxB 引脚上,另外,周期错误联防事件标志位(TZFLG[CBC])被置位,同时当 TZEINT 寄存器和 PIE 模块的中断使能时,ePWMx_TZINT 中断就会产生。
②单次触发:当单次错误联防事件发生时,同样 TZCTL 寄存器中的动作立刻输出到 ePWMxA 和 ePWMxB 引脚上,另外单次错误联防事件标志位(TZFLG[OST])被置位,同时当 TZEINT 寄存器和 PIE 模块的中断使能时,ePWMx_TZINT 中断就会产生的。
两种模式触发的区别在于周期错误联防事件标志可以自动清零,但是单次错误联防事件标志需要软件清零。
6.1.5 事件触发模块
事件触发模块的功能主要如下:
①接收来自时基模块和计数比较模块产生的相关事件的输入。
②利用时基模块中的方向信息识别是递增还是递减计数模式以便产生相应的事件。
③使用预定标判断逻辑发出中断请求或者 ADC 开始转换启动信号:
--每个事件。
--每两个事件。
--每三个事件。
④允许软件配置,强制产生中断事件或者 ADC 启动信号。
事件触发模块主要响应时基模块与计数比较模块的相关事件,当这些事件发生时,PWM 事件触发模块产生相应的中断事件或 ADC 启动事件。事件触发模块的内部结构图如下:
左边为事件触发子模块的输入信号。事件触发模块预定标逻辑发出中断请求或 ADC 转换启动有以下 3 种模式:
①每个事件。
②每两个事件。
③每三个事件。
每个 ePWM 子模块有一个中断请求线连接到 PIE,两个 ADC 启动转换信号与ADC 模块相连。所有的 ePWM 模块的 ADC 启动转换信号是一起做或运算之后连接到 ADC 单元的,因此一个有效的 ADC 转换信号可能对应着多个模块,当两个以上 ADC 转换请求同时发生时,实际为一个请求被识别。
事件触发子模块监控各种事件的状态,并且可以在发出中断请求或者 ADC 转换启动之前可以预先进行定标配置。如下所示:
①不产生中断。
②每个事件产生一次中断。
③每两个事件产生一次中断。
④每三个事件产生一次中断。
中断选择(ETSEL[INTSEL])位设置产生中断的事件,可选事件如下:
①时间基准计数器等于 0(TBCTR=0x0000)。
②时间基准计数器等于周期值(TBCTR=TBPRD)。
③时间基准计数器在递增计数时等于比较寄存器 A。
④时间基准计数器在递减计数时等于比较寄存器 A。
⑤时间基准计数器在递增计数时等于比较寄存器 B。
⑥时间基准计数器在递减计数时等于比较寄存器 B。
通过中断事件计数器(ETPS[INTCNT])寄存器位可以得到事件的数量。当ETPS[INTCNT]递增计数直到数值等于 ERPS[INTPRD]确定的值时,停止计数且输出 置 位 , 只 有 当 中 断 发 送 到 PIE 时 , 计 数 器 才 会 清 零 。 当ETPS[INTCNT]=ETPS[INTPRD]将发生以下动作:
①如果中断被使能,ETSEL[INTEN]=1 并且中断标志清零,ETFLG[INT]=0,则产生中断脉冲且中断标志位置位,ETFLG[INT]=1,事件计数器清零,ETPS[INTCNT]=0,再重新对事件计数。
②如果中断被禁止,ETSEL[INTEN]=0 或者中断标志置位,ETFLG[INT]=1,则当计数器的值等于周期值即 ETPS[INTCNT]=ETPS[INTPRD],计数器停止计数。
如果中断被使能,但是中断标志已经复位,则计数器将输出高电平直到ETFLG[INT]=0,这就允许当接收一个中断时,另一个中断进行等待。
INTPRD 位写操作时,计数自动清零即 INTCNT=0,并且计数器输出复位。写 1到 ETFRC[INT]位,计数器 INTCNT 将增加。当 INTCNT=INTPRD 时,计数器将按照上述描述进行工作。当 INTPRD=0 时,计数器将被禁止,所以不会检测到任何时间并且 ETFRC[INT]位被忽略。
事件触发器产生启动 SOCA 脉冲的电路如下所示:
除了产生连续脉冲外,ETPS[SOCACNT]计数器和 ETPS[SOCAPRD]周期值同上述中断产生逻辑中的计数器和周期寄存器功能相同,所不同的是此模块产生连续脉冲。当一个脉冲产生时,脉冲标志 ETFLG[SOCA]被锁存,但是不会停止脉冲的产生。使能/禁止位 ETSEL[SOCAEN]用于停止脉冲的产生,但是输入时间仍就被继续计数直到其值等于周期寄存器的值。可以通过 ETSEL[SOCASEL] 和ETSEL[SOCBSEL]位独立设置 SOCA 和 SOCB 脉冲触发事件。事件触发模块 SOCB 的产生电路,SOCB 产生过程和 SOCA 相同
6.2 PWM配置步骤
(1)使能ePWM外设时钟及失能时基模块时钟
要使用ePWM外设则需开启相应时钟,在对ePWM相关寄存器配置时得先关闭时基模块时钟,待配置好后在开启,可以保证同步。具体代码如下:
InitSysCtrl();
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
//Disable TBCLK within the ePWM
CpuSysRegs.PCLKCR2.bit.EPWM10 = 1;
//Enable ePWM
EDIS;
(2)开启ePWM对应GPIO时钟及初始化配置
由于PWM输出通道是对应着F28337芯片的IO口,所以需要使能对应的端口时钟,并将对应IO口配置为ePWM输出功能。初始化ePWMGPIO的函数TI已经提供给我们了,直接调用即可。本次使用的是 ePWM10,调用的函数如下:
InitEPwm10Gpio();
其内部具体实现代码如下:
void InitEPwm10Gpio(void)
{
EALLOW;
GpioCtrlRegs.GPFPUD.bit.GPIO163 = 1;
// Disable pull-up on GPIO163 (EPWM10A)
GpioCtrlRegs.GPFPUD.bit.GPIO164 = 1;
// Disable pull-up on GPIO164 (EPWM10B)
GpioCtrlRegs.GPFMUX1.bit.GPIO163 = 1;
// Configure GPIO163 as EPWM10A
GpioCtrlRegs.GPFMUX1.bit.GPIO164 = 1;
// Configure GPIO164 as EPWM10B
EDIS;
}
我们是使用GPIO163、GPIO164的ePWM10A和ePWM10B功能,即对这两个IO口始化,使能上拉和GPIO外设复用功能。
(3)初始化时基模块,即配置 TB 相关寄存器值
要产生 PWM 波,时基模块是必不可少的,通过配置它可以确定计数器的计数方式、周期频率、是否同步等。比如我们要设置 ePWM10 计数方式为向上计数,不使用相位同步功能,计数器计数频率为系统时钟频率,计数器初值为 0 等,具体配置代码如下:
EPwm10Regs.TBCTL.bit.PHSEN = TB_DISABLE;
// 计数寄存器装载相位寄存器使能位,禁止装载
EPwm10Regs.TBPHS.bit.TBPHS = 0;
// 时基相位为0
EPwm10Regs.TBCTR = 0X0000;
// Clear counter
EPwm10Regs.TBPRD = tbprd;
// 时基计数器周期
EPwm10Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
//向上计数
EPwm10Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
//高速时基时钟分频值(此处跟随系统值)
EPwm10Regs.TBCTL.bit.CLKDIV = TB_DIV1;
//时基时钟分频值(此处跟随系统值)
(4)初始化比较模块,即配置 CC 相关寄存器值
要产生可调的PWM波,除了需要时基模块外,CC模块也是必不可少的,通过配置它可以确定比较寄存器值的加载模式,比较器值、占空比等。比如我们要设置ePWM10加载方式为计数器为0加载、比较器值为0等,具体配置代码如下:
EPwm10Regs.CMPCTL.bit.SHDWAMODE=CC_SHADOW;
//影子装载模式,CPU向影子寄存器写入值
EPwm10Regs.CMPCTL.bit.SHDWBMODE=CC_SHADOW;
//影子装载模式,CPU向影子寄存器写入值
EPwm10Regs.CMPCTL.bit.LOADAMODE=CC_CTR_ZERO;
//装载条件选择ZERO。
EPwm10Regs.CMPCTL.bit.LOADBMODE=CC_CTR_ZERO;
//装载条件选择ZERO。
EPwm10Regs.CMPA.bit.CMPA=0;
//计数比较寄存器。CMPA的值与时基计数器的值进行比较,相同时产生事件,进行相应动作。
EPwm10Regs.CMPB.bit.CMPB=0;
//Set Compare B value
(5)初始化动作限定模块,即配置AQ相关寄存器值
要产生可调PWM波,除了需要TB、CC模块外,AQ模块也是必不可少的,通过配置它可以确定PWM输出波形方式等。比如我们要设置ePWM10输出,当ePWMA计数器计数到0时输出低电平,当ePWMA计数器向上计数到CMPA时输出高电平,当ePWMB计数器计数到0时输出低电平,当ePWMB计数器向上计数到CMPB时输出高电平,具体配置代码如下:
EPwm10Regs.AQCTLA.bit.ZRO=AQ_CLEAR;
//当时基计数器等于0时,输出低
EPwm10Regs.AQCTLA.bit.CAU=AQ_SET;
//当向上计数时,时基计数器的值与CMPA的值相等触发输出高。
EPwm10Regs.AQCTLB.bit.ZRO=AQ_CLEAR;
//当时基计数器等于0时,输出低
EPwm10Regs.AQCTLB.bit.CBU=AQ_SET;
//当向上计数时,时基计数器的值与CMPB的值相等触发输出高。
(6)初始化事件触发模块,即配置 ET 相关寄存器值
当需要事件触发输出控制,就需要对ET相关寄存器配置。比如计数器计数到0时,同时使能事件触发中断,每发生一次触发事件就输出PWM。代码中没有用到,屏蔽了。相关配置代码如下:
//EPwm10Regs.ETSEL.bit.INTSEL=ET_CTR_ZERO;
//事件触发选择寄存器,中断选择条件为TBCTR为0时,
//EPwm10Regs.ETSEL.bit.INTEN=1;
//使能中断 INT
//EPwm10Regs.ETPS.bit.INTPRD=ET_1ST;
//在一个事件发生时触发中断
(7)初始化死区模块、斩波模块,即配置 DB、PC 相关寄存器值
如果不是特殊应用的话,一般不对死区模块和斩波模块配置,它们的应用方法在前面各小节也介绍过,这里不作任何操作。
(8)使能时基计数器时钟
将各模块寄存器配置好后,最后开启时基计数器时钟,完成这步操作,对应的 IO 口即可输出 PWM 波。开启时基计数器时钟代码如下:
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
//Start all the timers synced
EDIS;
其他PWM与此配置步骤一样,仅需更改寄存器数字。