全文主要就是阅读官方文档关于EPWM各个子模块的介绍,官方文档的下载链接如下= =。
链接:云盘链接
提取码:lf7n
本文只阅读了该文档的第二章而且PC模块和TZ模块有点搞不懂在干嘛为什么要这么做,因此这两节的内容我只是草草机翻就过了,第三章我还在看= =。慢慢来吧= =。
1、时基模块(TB模块)
1.1、时基子模块可以配置的事项
您可以为以下各项配置时基子模块:
- 指定ePWM时基计数器(TBCTR)频率或周期,以控制事件发生的频率。
- 管理与其他ePWM模块的时基同步。
- 与其他ePWM模块保持相位关系。
- 将时基计数器设置为向上计数、向下计数或向上和向下计数模式。
- 生成以下事件:
—CTR=PRD:等于指定周期的时基计数器(TBCTR=TBPRD)。
—CTR=0:时基计数器等于零(TBCTR=0x0000)。 - 配置时基时钟的速率;CPU系统时钟的预定标度版本
(SYSCLKOUT)。这允许时基计数器以较慢的速率递增/递减。
1.2、控制和监控时基子模块
寄存器 | 影子寄存器 | 详细描述 |
---|---|---|
TBCTL | 无 | 时基控制寄存器 |
TBSTS | 无 | 时基状态寄存器 |
TBPHSHR | 无 | HRPWM拓展相位寄存器(1) |
TBPHS | 无 | 时基控制相位寄存器 |
TBCTR | 无 | 时基计数寄存器 |
TBPRD | 无 | 时基控制周期寄存器 |
(1)该寄存器仅在包含高分辨率扩展(HRPWM)的ePWM实例上可用。在不包括HRPWM的ePWM模块上,保留此位置。该寄存器在特定于设备的高分辨率脉冲宽度调制器(HRPWM)参考指南中介绍。请参阅特定于设备的数据手册,以确定哪些ePWM实例包含此功能。
上图大概整理了时基模块的关键信号和寄存器,下表是对上图的详细描述
信号 | 详细描述 |
---|---|
EPWMxSYNIC | 时基时钟同步输入,用于同步时基计数器和同步链中ePWM模块计数器的输入脉冲。ePWM外设可以配置为使用或忽略此信号。对于第一个ePWM模块(EPWM1),该信号来自系统时钟分频后的信号。对于后续的ePWM模块,该信号从另一个ePWM外围设备传递。例如,EPWM2SYNCI是由ePWM1外围设备生成的,EPWM3SYNCI是由ePWM2等外围设备生成的。 |
EPWMxSYNCO | 时基同步信号输出,此输出脉冲用于同步同步链后期ePWM模块的计数器。ePWM模块从三个事件源之一生成此信号:1.EPWMxSYNCI(同步输入脉冲)2。CTR=Zero:时间基计数器等于0(TBCTR=0x0000)。 3.CTR=CMPB:时间基计数器等于计数器比较B(TBCTR=CMPB)寄存器 |
CTR = PRD | 时间基计数器等于预设值。当计数器值等于活动周期寄存器值时,就会产生该信号。这就是TBCTR=TBPRD。 |
CTR = Zero | 时基计数器等于零,当计数器值为零时,就会产生此信号。那就是当TBCTR等于0x0000时 |
CTR = CMPB | 时间基计数器等于活动的计数器比较B寄存器(TBCTR=CMPB)。此事件由反比较子模块生成,并由同步输出逻辑使用 |
CTR_dir | 时间基础计数器方向。 指示ePWM的时基计数器的当前方向。计数器增加时信号高,计数器减少时信号低。 |
CTR_max | 时基计数器等于最大值。(TBCTR=0xFFFF) 当TBCTR值达到其最大值时生成的事件。此信号仅用作状态位 |
TBCLK | 模块时钟信号,这是系统时钟(同步输出)的一个预设版本,可被ePWM中的所有子模块使用。这个时钟决定了时间基计数器增加或减少的速率,简单来说就是系统时钟的分频后特别给该模块使用的信号。 |
1.3、计算PWM的周期和频率
PWM事件的频率由时基周期(TBPRD)寄存器和时基计数器的模式控制。下图显示了当周期设置为4(TBPRD=4,即预设值为4)时,上下和上下计数模式的周期(Tpwm)和频率(TBPRDwm)关系。每个步骤的时间增量由时间基时钟(TBCLK)定义,该时钟是系统时钟的预调整版本。
时基计数器有由时基控制寄存器(TBCTL)选择的三种计数模式:
- 上下计数模式(Up-Down-Count):
在上下计数模式下,时间基础计数器从零开始并递增,直到达到周期(TBPRD)值。当达到周期值时,时间基计数器就会递减,直到它达到零。此时,计数器重复该模式并开始增加增量。 - 向上计数模式(Up-Count):
在此模式下,时间基计数器从零开始并递增,直到达到周期寄存器(TBPRD)中的值。当达到周期值时,时间基计数器将重置为零,并再次开始增加。 - 向下计数模式(Down-Count):
在向下计数模式下,时间基计数器从周期(TBPRD)值开始并递减,直到达到零。当它达到零时,时间基计数器被重置为周期值,并再次开始递减。
1.3.1、时基周期影子寄存器
时基周期寄存器(TBPRD)具有影子寄存器。显示允许寄存器更新与硬件同步。以下定义用于描述ePWM模块中的所有阴影寄存器: - 活动寄存器
活动寄存器控制硬件,并对硬件引起或调用的操作负责。 - 影子寄存器
影子寄存器缓冲区或为活动寄存器提供一个临时保持位置。它对任何控制硬件都没有直接影响。在一个战略时间点(时基计数器为0时),影子寄存器的内容被转移到活动寄存器。这可以防止由于软件异步修改寄存器而导致的损坏或虚假操作。 - 时基周期影子模式:
当TBCTL[PRDLD]=0时,将启用TBPRD影子寄存器。从读取和写入TBPRD内存地址,转到影子寄存器。当时间基计数器等于零(TBCTR=0x0000)时,阴影寄存器内容被传输到活动寄存器(TBPRD(活动寄存器)←TBPRD(影子寄存器))。默认情况下,将启用TBPRD影子寄存器。 - 时基周期即时加载模式
如果选择了即时加载模式(TBCTL[PRDLD]=1),则从TBPRD内存地址的读取或写入将直接进入活动寄存器。
//在库函数里的函数
//base1:EPWMx_BASE(x为1~8)
//EPWM_PERIOD_SHADOW_LOAD影子寄存器加载模式
//EPWM_PERIOD_DIRECT_LOAD即时加载模式
EPWM_setPeriodLoadMode(base1, EPWM_PERIOD_SHADOW_LOAD);
1.3.2、时基计数器同步
时基同步方案连接设备上的所有ePWM模块。每个ePWM模块都有一个同步输入(EPWMxSYNCI)和一个同步输出(EPWMxSYNCO)。第一个实例的输入同步(ePWM1)来自一个外部引脚。
下图所示的方案1适用于280x、2801x、2802x和2803x的设备。当ePWM针形配置为280x兼容模式(gpamcfg[==0)时,方案1也适用于2804x设备
下图中,当ePWM针形配置为仅a通道模式(gpamcfg[epwm模式]=3)时,2804x设备使用方案2。如果2804xePWM针形被配置为280x兼容模式(gpamcfg[epwm模式]=0),则使用方案1。
方案3,如下图所示,已被所有其他设备所使用。
注:同步方案中显示的所有模块可能不能在所有设备上可用。请参阅设备特定数据手册以确定特定设备上的模块。
每个ePWM模块都可以配置为使用或忽略同步输入。如果设置了TBCTL[PHSEN]位,则当出现以下条件之一时,ePWM模块的时间基计数器(TBCTR)将自动加载相位寄存器(TBPHS)内容:
- EPWMxSYNCI:同步输入脉冲:
当检测到输入同步脉冲时,将相位寄存器的值加载到计数器寄存器中(TBPHS→TBCTR)。此操作发生在下一个有效的时基时钟(TBCLK)边缘。
从内部主模块到从属模块的延迟的方式如下:
1、如果 ( TBCLK = SYSCLKOUT): 2 x SYSCLKOUT
2、如果 ( TBCLK != SYSCLKOUT):1 TBCLK - 软件强制同步脉冲:
将1写入TBCTL[SWFSYNC]控制位将调用软件强制同步。该脉冲与同步输入信号保持一致,因此对脉冲的EPWMxSYNCI具有相同的效果。
此功能使ePWM模块能够自动与另一个ePWM模块的时基同步。超前或滞后相位控制可以添加到不同ePWM模块生成的波形中,以使其同步。在上下计数模式下,TBCTL[PSHDIR]位在同步事件发生后立即配置时基计数器的方向。新方向独立于同步事件之前的方向。在向上计数或向下计数模式下忽略PHSDIR位。
清除TBCTL[PHSEN]位将将ePWM配置为忽略同步输入脉冲。同步脉冲仍然可以被允许流经到EPWMxSYNCO,并用于同步其他ePWM模块。通过这种方式,您可以设置主时间库(例如,ePWM1),而下游模块(ePWM2-ePWMx)可以选择与主模块同步运行。
1.4、多个ePWM模块的时基时钟的锁相
TBCLKSYNC位可用于全局同步设备上所有已启用的ePWM模块的时基时钟。该位是设备的时钟启用寄存器的一部分,并在第1节中列出的系统控制和中断参考指南的特定设备版本中进行了描述。当TBCLKSYNC=0时,所有ePWM模块的时基时钟都将停止(默认)。当TBCLKSYNC=1时,所有ePWM时基时钟都以TBCLK的上升边缘对齐。对于完全同步的TBCLK,每个ePWM模块的TBCTL寄存器中的预调用位必须设置相同。启用ePWM时钟的适当程序如下:
1.启用各个ePWM模块时钟。
2.设置TBCLKSYNC = 0。这将停止任何已启用的ePWM模块中的时基时钟。
3.配置预调节器值和所需的ePWM模式。
4.设置TBCLKSYNC = 1。
//简单来说就是配置时先关闭ePWM的时钟
SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);//关闭epwm时钟
//在这里添加需要对EPWM信号的操作,比如更改分频系数
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);//更改完后再使能epwm时钟
1.5、时基计数器模式和定时器波形
时基计数器以四种模式之一操作:
- 不对称的计数模式。(Up-Count)
- 不对称的倒计时模式。(Down-Count)
- 具有对称性的上下计数(Up-Down-Count)
- 冻结在时基计数器保持在当前值不变的位置
为了说明前三种模式的操作,下面的时间图显示了事件何时生成,以及时间基如何响应EPWMxSYNCI信号。(注:这里是在说各个子模块怎么同步的)
2、计数器比较子模块(CC模块)
2.1、比较器子模块能完成的配置
计数器比较子模块以时基计数器值作为输入。该值连续与反比较A(CMPA)和反比较B(CMPB)寄存器进行比较。当时间基计数器等于其中一个比较寄存器时,计数器比较单元将生成一个适当的事件。
- 使用CMPA和CMPB寄存器基于可编程的时间戳生成事件
CTR=CMPA:时间基计数器等于计数器比较A寄存器(TBCTR=CMPA)
CTR=CMPB:时间基计数器等于计数器比较B寄存器(TBCTR=CMPB) - 如果操作限定符子模块配置正确,则控制PWM占空比
- 影子显示新的比较值,以防止在活动的PWM周期中出现损坏或故障
2.2、控制和监控CC子模块
CC子模块的操作由中所示的寄存器进行控制和监控
寄存器名 | 是否支持影子寄存器 | 描述 |
---|---|---|
CMPCTL | 否 | 计数器比较控制寄存器 |
CMPAHR | 是 | HRPWM,CC一个扩展寄存器(1) |
CMPA | 是 | 比较器A寄存器 |
CMPB | 是 | 比较器B寄存器 |
(1)此寄存器仅在具有高分辨率扩展(HRPWM)的ePWM模块上可用。在不包含HRPWM的ePWM模块上,保留此位置。该寄存器在设备特定的高分辨率脉冲宽度调制器(HRPWM)参考指南中都有描述。请参阅设备特定的数据手册,以确定哪些ePWM实例包含此功能。
信号名 | 事件描述 | 比较器寄存器 |
---|---|---|
CTR = CMPA | 时间基计数器等于活动的计数器比较A值时间基计数器等于活动的计数器比较A值 | TBCTR = CMPA |
CTR = CMPB | 时间基计数器等于活动的计数器比较A值时间基计数器等于活动的计数器比较B值 | TBCTR = CMPB |
CTR = PRD | 时间基计数器等于活动周期。用于从影子寄存器加载活动的计数器比较A和B寄存器 | TBCTR=0x0000 |
CTR = ZERO | 时间基计数器等于0,用于从影子寄存器加载活动的计数器比较A和B寄存器 |
2.3、CC子模块的操作要点
CC子模块负责基于两个比较寄存器生成两个独立的比较事件:
1.CTR=CMPA:时间基计数器等于计数器比较A寄存器(TBCTR=CMPA)。
2.CTR=CMPB:时间基计数器等于计数器比较B寄存器(TBCTR=CMPB)。
对于上计数或下计数模式,每个事件每个周期只发生一次。
对于上下计数模式,如果比较值在0x0000-TBPRD之间,则每个周期发生每个事件两次,如果比较值等于0x0000或等于TBPRD,则每个周期发生一次。
这些事件被输入到动作限定符子模块(AQ子模块)中,在这个子模块中它们被计数器方向限定,如果启用则转换为操作。
反比较寄存器CMPA和CMPB每个都有一个关联的影子寄存器。显示提供了一种保持对寄存器的更新与硬件同步的方法。当使用影子寄存器时,对活动寄存器的更新只发生在策略点(计数器计数为0时)。这可以防止由于软件异步修改寄存器而导致的损坏或虚假操作。活动寄存器和影子寄存器的存储器地址相同。哪个寄存器被写入或读取,由CMPCTL位和CMPCTL位决定。这些位分别启用和禁用CMPA影子寄存器和CMPB阴影寄存器。这两种加载模式的行为描述如下:
-
影子寄存器模式
CMPA的影子模式是通过清除CMPCTL[SHDWAMODE]位启用的,CMPB的阴影寄存器是通过清除CMPCTL[SHDWBMODE]位启用的。CMPA和CMPB都默认启用了阴影模式。
如果启用了阴影寄存器,则阴影寄存器的内容将传输到以下事件之一上的活动寄存器:
1、CTR=PRD:时基计数器等于周期(TBCTR=TBPRD)
2、CTR=Zero:时基计数器等于0(TBCTR=0x0000)
3、CTR=PRD和CTR=Zero -
即时加载模式
如果选择立即加载模式(即TBCTL[SHADWAMODE]=1或TBCTL[SHADWBMODE]=1),则寄存器的读取或写入将直接进入活动寄存器。
2.4、计数模式时间波形
CC模块可以在所有三种计数模式下生成比较事件:
- 上计数模式:用于生成一个不对称的PWM波形。
- 下计数模式:用于生成一个不对称的PWM波形。
- 上下计数模式:用于生成对称的PWM波形。
为了最好地说明前三种模式的操作,下面三个图中的时间图显示了事件何时生成,以及EPWMxSYNCI信号是如何交互的。
时基模块和CC模块共同决定了CMPA和CMPB在计数器周期触发的位置
3、动作子模块(AQ子模块)
3.1、AQ子模块配置的内容
- 根据以下事件进行限定和生成操作(高电平输出、低电平输出、电平切换[事件发生时输出高/低]):
1、CTR = PRD:时基计数器等于周期(TBCTR=TBPRD)。
2、CTR = Zero:时基计数器等于0(TBCTR=0)。
3、CTR = CMPA:时间基计数器等于计数器比较A寄存器(TBCTR=CMPA)
4、CTR = CMPB:时间基计数器等于计数器比较B寄存器(TBCTR=CMPB) - 当这些事件同时发生时,管理优先级
- 当时基计数器增加和减少时,提供对事件的独立控制,即根据计数方向进行动作
3.2、AQ子模块的控制和状态寄存器定义
寄存器名 | 有无影子寄存器 | 描述 |
---|---|---|
AQCTLA | 无 | 输出A的动作-限定符控制寄存器(EPWMxA) |
AQCTLB | 无 | 输出B的动作-限定符控制寄存器(EPWMxB) |
AQSFRC | 无 | AQ子模块软件强制操作寄存器 |
AQCSFRC | 有 | AQ子模块软件连续强制操作寄存器 |
AQ子模块控制这两个模块在特定事件发生时输出EPWMxA和EPWMxB时的行为。
AQ子模块的事件输入通过计数器方向(向上或向下)进一步限定。这允许在计数和计数阶段对输出采取独立行动。
对输出EPWMxA和EPWMxB施加的可能操作是:
- 设置高:
将输出EPWMxA或EPWMxB设置为高电平。 - 设置低:
将输出EPWMxA或EPMWxB设置为低电平。 - 电平跳变:
将输出EPWMxA或EPWMxB的电平跳变。 - 不做任何处理:
将输出EPWMxA和EPWMxB保持在当前设置的相同水平。虽然“不做任何处理”选项阻止事件对EPWMxA和EPWMxB输出引起操作,但该事件仍然可以触发中断和ADC开始转换。
3.3、AQ子模块事件优先级
ePWM动作限定符可以同时接收多个事件。在这种情况下,硬件为事件分配了优先级。一般规则是,稍后发生的事件具有更高的优先级,而软件强制事件总是具有最高的优先级。
上下计数模式下的事件优先级如下:
优先级等级 | 向上计数时 | 向下计数时 |
---|---|---|
1(最高优先级) | 软件强制操作事件 | 软件强制操作事件 |
2 | 计数器向上计数到CMPB | 计数器向下计数到CMPB |
3 | 计数器向上计数到CMPA | 计数器向下技术到CMPA |
4 | 计数器计数到0 | 计数器技术到周期值 |
5 | 计数器向下计数到CMPB | 计数器向上计数到CMPB |
6(最低优先级) | 计数器向下计数到CMPA | 计数器向上计数到CMPA |
向上计数模式的优先级:
优先级顺序 | 事件 |
---|---|
1(最高优先级) | 软件强制控制事件 |
2 | 计数器计数到周期值 |
3 | 计数器向上计数到CMPB |
4 | 计数器向上计数到CMPA |
5(最低优先级) | 计数器计数到0 |
向下计数模式的优先级顺序:
优先级顺序 | 事件 |
---|---|
1(最高优先级) | 软件强制控制事件 |
2 | 计数器计数到0 |
3 | 计数器向下计数到CMPB |
4 | 计数器向下计数到CMPA |
5(最低优先级) | 计数器计数到周期值 |
3.4、常见配置的波形
注:本文档中的波形显示了静态比较寄存器值的epwm行为。在正在运行的系统中,活动比较寄存器(CMPA和CMPB)通常每个周期从它们各自的影子寄存器更新一次。用户指定何时进行更新;或者时间基计数器达到零,或者时间基计数器达到周期。在某些情况下,基于新值的操作可以延迟一个时间段,或者基于旧值的操作可以额外生效一段时间。一些PWM配置避免了这种情况。这些内容包括但不限于以下内容:
使用上下计数模式来生成一个对称的PWM:
- 如果以零的方式加载CMPA/CMPB,则使用CMPA/CMPB值大于或等于1
- 如果在周期上加载CMPA/CMPB,则使用CMPA/CMPB值小于或等于TBPRD-1。
这意味着在PWM周期内总是会有至少一个TBCLK周期的脉冲,当非常短时,往往会被系统忽略。
使用上下计数模式来生成非对称PWM:
- 要实现50%-0%的非对称PWM,请使用以下配置:加载CMPA/CMPB,并使用周期操作清除PWM,使用比较操作设置PWM。将比较值从0调制到TBPRD,以实现50%-0%的PWM负荷。
当使用向上计数模式生成非对称PWM时:
- 要实现0-100%的非对称PWM,请使用以下配置:在TBPRD上加载CMPA/CMPB。使用Zero操作来设置PWM,并使用比较操作来清除PWM。将比较值从0调制到TBPRD+1,以实现0-100%的PWM负荷。
下图显示了如何使用TBCTR的上-下计数模式生成对称的PWM波形。在此模式下,0%-100%的直流调制是通过使用对波形的上计数和下计数部分的平等比较匹配来实现的。在所示的示例中,用CMPA来进行比较。当计数器增加时,CMPA匹配将提高PWM输出。同样,当计数器减少时,比较匹配将拉低PWM信号。当CMPA=0时,PWM信号在整个周期内较低,得到0%占空率波形。当CMPA=TBPRD时,PWM信号较高,达到100%占空比。
在实践中使用此配置时,如果以零加载CMPA/CMPB,则使用大于或等于1的CMPA/CMPB值。如果在周期上加载CMPA/CMPB,则使用CMPA/CMPB值小于或等于TBPRD-1。这意味着在PWM周期内总是会有至少一个TBCLK周期的脉冲,当非常短时,往往会被系统忽略。
下图中的PWM波形显示了一些常见的动作限定符配置。图配示例展示了如何为配置ePWM模块。在图和示例中使用的一些约定如下:
(手册中举了很多例子,但是大同小异,这里我只对几个比较经典的例子介绍库函数版本)
例1:
//A : PWM周期 = (TBPRD + 1) * T(TBCLK)
//B : EPWMxA的占空比调制由CMPA设置,并且具有高灵活性(即与CMPA成正比的高占空比)。
//C : EPWMxB的占空比调制由CMPB设置,并且具有高灵活性(即与CMPB成正比的高占空比)
//D : 为了完整性,“不显示”操作(X),但不会在后续图表中显示。
//E : 在零和期间的操作,虽然似乎同时发生,但实际上被一个TBCLK周期隔开。TBCTR包装从周期到0000。
// 对应的寄存器版本代码
// 时间初始化
// = = = = = = = = = = = = = = = = = = = = = = = =
EPwm1Regs.TBPRD = 600; // 周期 = 601 TBCLK counts
EPwm1Regs.CMPA.half.CMPA = 350; // CMPA = 350 TBCLK counts
EPwm1Regs.CMPB = 200; // CMPB = 200 TBCLK counts
EPwm1Regs.TBPHS = 0; // 设置偏移量为0
EPwm1Regs.TBCTR = 0; // 清0计数器值
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//向上计数模式
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁用偏移
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;//影子寄存器加载
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //分频系数为1 TBCLK = SYSCLK
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;//分频系数为1
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;//影子寄存器加载模式
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;//影子寄存器加载模式
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // 在计数器计数到0时重装载CMPA
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // 在计数器计数到0时重装载CMPB
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;//计数到0,EPWMA置高
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;//向上计数到CMPA,EPWMA置低
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;//计数到0,EPWMB置高
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;//向上计数到CMPB,EPWMB置低
//
// Run Time
// = = = = = = = = = = = = = = = = = = = = = = = =
EPwm1Regs.CMPA.half.CMPA = Duty1A; // adjust duty for output EPWM1A
EPwm1Regs.CMPB = Duty1B; // adjust duty for output EPWM1B
//对应库函数版本代码,这个不是官方文档的= =。只是我根据自己理解写的
SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);//设置前先关闭系统时钟
EPWM_setTimeBasePeriod(EPWM1_BASE, 600);//设置周期值
EPWM_setTimeBaseCounter(EPWM1_BASE, 0U);//设置初始值
EPWM_setCounterCompareValue(EPWM1_BASE,EPWM_COUNTER_COMPARE_A,350);//设置CMPA的值
EPWM_setCounterCompareValue(EPWM1_BASE,EPWM_COUNTER_COMPARE_B,200);//设置CMPB的值
EPWM_setPhaseShift(EPWM1_BASE, 0U);//设置偏移值为0
EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP);//设置为向上计数模式
EPWM_disablePhaseShiftLoad(EPWM1_BASE);//不偏移
//设置EPWM模块的时钟分频系数,TBCLK = EPWMCLK/(EPWM_CLOCK_DIVIDER_1*EPWM_HSCLOCK_DIVIDER_1)
EPWM_setClockPrescaler(EPWM1_BASE,EPWM_CLOCK_DIVIDER_1,EPWM_HSCLOCK_DIVIDER_1);//这里两个都设为1,不做分频
EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE,EPWM_COUNTER_COMPARE_A,EPWM_COMP_LOAD_ON_CNTR_ZERO);//CC子模块使用影子寄存器,在时基计数到0时载入CMPA的值
EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE,EPWM_COUNTER_COMPARE_B,EPWM_COMP_LOAD_ON_CNTR_ZERO);//CC子模块使用影子寄存器,在时基计数到0时载入CMPB的值
EPWM_setActionQualifierAction(EPWM1_BASE,
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);//时基向上计数到CMPA时,EPWMA输出低
EPWM_setActionQualifierAction(EPWM1_BASE,
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);//时基计数到0,EPWMA输出高
EPWM_setActionQualifierAction(EPWM1_BASE,
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);//时基向上计数到CMPB时,EPWMB输出低
EPWM_setActionQualifierAction(EPWM1_BASE,
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);//时基计数到0,EPWMB输出高
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);//初始化完成,则启动EPWM时钟
例2:
// 寄存器版本代码
// 初始化定时器
// = = = = = = = = = = = = = = = = = = = = = = = =
EPwm1Regs.TBPRD = 600; // 周期 = 2×600 TBCLK counts
EPwm1Regs.CMPA.half.CMPA = 400; // CMPA = 400 TBCLK counts
EPwm1Regs.CMPB = 500; // CMPB = 500 TBCLK counts
EPwm1Regs.TBPHS = 0; // 偏移量为0
EPwm1Regs.TBCTR = 0; // 清0时基计数器
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 上下计数模式
xEPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁用偏移
xEPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; //影子寄存器载入模式
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 分频系数为1,不分频
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;//CMPA载入为影子寄存器模式
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;//CMPB载入为影子寄存器模式
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // 计数到0时重装载CMPA
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // 计数到0时重装载CMPB
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//向上计数到CMPA时EPWMA输出为高
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;//向下计数到CMPA时EPWMA输出为低
EPwm1Regs.AQCTLB.bit.CBU = AQ_SET;//向上计数到CMPB时EPWMB输出为高
EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR;//向下计数到CMPB时EPWMB输出为低
//
// 运行定时器
// = = = = = = = = = = = = = = = = = = = = = = = =
EPwm1Regs.CMPA.half.CMPA = Duty1A; // adjust duty for output EPWM1A
EPwm1Regs.CMPB = Duty1B; // adjust duty for output EPWM1B
//对应库函数版本代码,这个不是官方文档的= =。只是我根据自己理解写的
SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);//设置前先关闭系统时钟
EPWM_setTimeBasePeriod(EPWM1_BASE, 600);//设置周期值 = 600 * 2
EPWM_setTimeBaseCounter(EPWM1_BASE, 0U);//设置初始值
EPWM_setCounterCompareValue(EPWM1_BASE,EPWM_COUNTER_COMPARE_A,400);//设置CMPA的值
EPWM_setCounterCompareValue(EPWM1_BASE,EPWM_COUNTER_COMPARE_B,500);//设置CMPB的值
EPWM_setPhaseShift(EPWM1_BASE, 0U);//设置偏移值为0
EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN);//设置为向上计数模式
EPWM_disablePhaseShiftLoad(EPWM1_BASE);//不偏移
//设置EPWM模块的时钟分频系数,TBCLK = EPWMCLK/(EPWM_CLOCK_DIVIDER_1*EPWM_HSCLOCK_DIVIDER_1)
EPWM_setClockPrescaler(EPWM1_BASE,EPWM_CLOCK_DIVIDER_1,EPWM_HSCLOCK_DIVIDER_1);//这里两个都设为1,不做分频
EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE,EPWM_COUNTER_COMPARE_A,EPWM_COMP_LOAD_ON_CNTR_ZERO);//CC子模块使用影子寄存器,在时基计数到0时载入CMPA的值
EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE,EPWM_COUNTER_COMPARE_B,EPWM_COMP_LOAD_ON_CNTR_ZERO);//CC子模块使用影子寄存器,在时基计数到0时载入CMPB的值
EPWM_setActionQualifierAction(EPWM1_BASE,
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);//时基向上计数到CMPA时,EPWMA输出高
EPWM_setActionQualifierAction(EPWM1_BASE,
EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);//时基向下计数到CMPA时,EPWMA输出低
EPWM_setActionQualifierAction(EPWM1_BASE,
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);//时基向上计数到CMPB时,EPWMB输出高
EPWM_setActionQualifierAction(EPWM1_BASE,
EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);//时基向下计数到CMPB,EPWMB输出低
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);//初始化完成,则启动EPWM时钟
4、死区发生器模块(死区模块、DB模块)
//关于死区的设置,可以参考另一个人写的TMS320F280049C 学习笔记25 ePWM死区 DB模块配置
4.1、DB子模块能完成的配置
“(AQ)模块”部分讨论了如何通过使用ePWM模块的CMPA和CMPB资源完全控制边缘的放置来生成所需的死带。然而,如果需要更经典的基于边缘延迟的具有极性控制的死带,那么应该使用这里描述的DB模块。
DB模块的主要功能有:
-
从单个EPWMxA输入中生成具有死带关系的适当信号对(EPWMxA和EPWMxB)
//简单来说就是一个输入对应两个输出,因为EPWMxA和EPWMxB都输入到DB模块,然后DB模块再输出,DB模块可以只接收EPWMxA或EPWMxB,一个正常DB后输出另一端通过反相器输出互补信号 -
应用于:
1、活动高(AH)
2、活动低(AL)
3、活动高互补(AHC)
4、活动低互补(ALC) -
向上升的边缘添加可编程的延迟(RED)
-
向下降的边缘添加可编程的延迟(FED)
-
可以完全绕过信号路径(注意图中的虚线)//就是可以不通过DB模块
4.2、控制和监控DB模块
通过以下寄存器完成控制、监控DB模块
寄存器名 | 描述 |
---|---|
DBCTL | DB控制寄存器 |
DBRED | DB上升沿控制寄存器 |
DBFED | DB下降沿控制寄存器 |
4.3、DB模块的操作要点
- 输入源选择:
到DB模块的输入信号是来自动作限定符的EPWMxA和EPWMxB输出信号。在本节中,它们将被称为EPWMxAIn和EPWMxBIn。使用DBCTL[IN_MODE)控制位,可以选择每个延迟、下降边缘或上升边缘的信号源:
1、EPWMxAIn是下降边和上升边延迟的来源。这是默认的模式。
2、EPWMxAIn是下降边延迟的源,EPWMxBIn是上升边延迟的源。
3、EPWMxAIn是上升边延迟的源,EPWMxBIn是下降边延迟的源。
4、EPWMxBIn是下降边和上升边延迟的来源。 - 输出模式控制:
输出模式通过DBCTL[OUT_MODE]位进行配置。这些位决定了下降边缘延迟,上升边缘延迟,两者都没有,或两者都应用于输入信号。 - 极性控制:
极性控制(DBCTL[POLSEL])允许您指定在发出DB模块之前,是否要将上升边缘延迟信号和/或下降边缘延迟信号倒置。
对应库函数应该如下图,改图来源于前面介绍过的文章,与上图略有不同,但是不影响你照着使用= =。
虽然支持所有组合,但并并非所有组合都是典型的使用模式。下表记录了一些经典的死带配置。这些模式假设DBCTL[IN_MODE]被配置为EPWMxAIn是下降边和上升边延迟的源。改变输入信号源可以通过实现增强或非传统模式。表中所示的模式可分为以下类别: - 模式1:同时绕过下降边缘延迟(FED)和上升边缘延迟(RED)
允许您从PWM信号路径中完全禁用死带子模块。 - 模式2-5:经典的死带极性设置:
这些代表了典型的极性配置,应该解决可用的行业电源开关门驱动器所需的所有主动高/低模式。这些典型情况下的波形如图2-29所示。请注意,要生成与下图相同的波形,请配置AQ子模块来生成信号,如EPWMxA所示。 - 模式6:旁路上升边缘延迟和模式7:旁路下降边缘延迟
最后,表中的最后两个条目显示了可以绕过下降边缘延迟(FED)或上升边缘延迟(RED)块的组合。
模式 | 模式描述 | DBCTL[POLSEL] | DBCTL[OUTMODE] |
---|---|---|---|
S3 S2 | S1 S0 | ||
1 | EPWMxA和EPWMxB已通过(无延迟) | X X | 0 0 |
2 | 活性高互补信号(AHC) | 1 0 | 1 1 |
3 | 活性低互补信号(ALC) | 0 1 | 1 1 |
4 | 活跃高电平信号(AH) | 0 0 | 1 1 |
5 | 活跃低电平信号(AL) | 1 1 | 1 1 |
6 | EPWMxA输出=EPWMxA在(无延迟) | 0或1 0或1 | 0 1 |
EPWMxB输出=EPWMxA在与下降的边缘延迟 | 同上 | 同上 | |
7 | EPWMxA输出=EPWMxA在与上升的边缘延迟 | 0或1 0或1 | 1 0 |
EPWMxB输出=EPWMxB在没有延迟 | 同上 | 同上 |
下图展示了0%<占空比<100%的典型情况的波形
DB子模块支持上升边缘(RED)和下降边缘(FED)延迟的独立值。使用DBRED和DBFED寄存器编程延迟量。这些是10位寄存器,它们的值代表时间基时钟的数量,TBCLK,信号边缘延迟的周期。例如,计算下降边缘延迟和上升边缘延迟的公式为:
FED = DBFED × TTBCLK
RED = DBRED × TTBCLK
其中TTBCLK是TBCLK的时期,即SYSCLKOUT。
为了方便起见,各种TBCLK选项的延迟值见表所示。
DBFED,DBRED | TBCLK = SYSCLKOUT/1 | TBCLK = SYSCLKOUT/2 | TBCLK = SYSCLKOUT/4 |
---|---|---|---|
1 | 0.01us | 0.02us | 0.04us |
5 | 0.05us | 0.10us | 0.20us |
10 | 0.10us | 0.20us | 0.40us |
100 | 1.00us | 2.00us | 4.00us |
200 | 2.00us | 4.00us | 8.00us |
300 | 3.00us | 6.00us | 12.00us |
400 | 4.00us | 8.00us | 16.00us |
500 | 5.00us | 10.00us | 20.00us |
600 | 6.00us | 12.00us | 24.00us |
700 | 7.00us | 14.00us | 28.00us |
800 | 8.00us | 16.00us | 32.00us |
900 | 9.00us | 18.00us | 36.00us |
1000 | 10.00us | 20.00us | 40.00us |
5、斩波模块(PC模块)
PWM斩波子模块允许高频载波信号调制由AQ和DB模块产生的PWM波形。如果您需要基于脉冲变压器的栅极驱动器来控制电源开关元件,这种功能很重要。
6.1、斩波子模块的配置项
PWM-斩波器子模块的关键功能是:
- 可编程斩波(载波)频率
- 第一脉冲的可编程脉冲宽度
- 第二脉冲和后续脉冲的可编程占空比
- 如果不需要,就可以完全绕过
6.2、控制斩波子模块
寄存器名 | 是否有影子寄存器 | 描述 |
---|---|---|
PCCTL | 无 | PWM斩波控制寄存器 |
6.3、PWM-斩波器子模块的操作要点
图显示了PWM-斩波器子模块的操作细节。载波时钟来自于系统输出。它的频率和占空比通过PCCTL寄存器中的占空位和占空位来控制。一次性块是一个特性,提供高能量的第一脉冲,以确保硬电源开关打开,而随后的脉冲维持脉冲,确保电源开关保持打开。一次性宽度是通过第一比特编程的。PWM-斩波器子模块可以通过CHPEN位完全禁用(绕过)。
6.4、波形
6.4.1、一次性脉冲
第一脉冲的宽度可以被编程为16个可能的脉冲宽度值中的任意一个。第一脉冲的宽度或周期由以下给出:
T1stpulse = TSYSCLKOUT × 8 × OSHTWTH
其中,停止是系统时钟的周期(停止),oshtwth是四个控制位(从1到16的值)
图显示了第一个和随后的持续脉冲,表给出了同步输出=100MHz的可能的脉冲宽度值。
6.4.2、载波周期控制
基于脉冲变压器的栅极驱动器设计需要了解变压器和相关电路的磁性特性或特性。饱和度就是这样一个考虑因素。为了帮助栅极驱动设计者,第二脉冲和后续脉冲的占空比已经被称为可编程。这些维持脉冲确保在接通期间电源开关门保持正确的驱动强度和极性,因此可编程占空比允许通过软件控制对设计进行调谐或优化。
图显示了通过编程占空比位可以实现的占空比控制。七种可能的占空比中可以选择一种,范围从12.5%到87.5%。注:图示显示的是载波信号的占空比
7、跳闸模块(TZ模块)
每个ePWM模块都连接到来自GPIOMUX的6个TZn信号(TZ1到TZ6)。这些信号指示外部故障或跳闸情况,ePWM输出可以编程以在故障发生时相应响应。
7.1、跳闸子模块的可配置项
- 跳闸输入TZ1到TZ6可以灵活地映射到任何ePWM模块。
- 在故障情况下,输出EPWMxA和EPWMxB可以强制执行以下选项之一:
置高
置低
高阻抗
不操作 - 支持主要短路或过流情况下的一次性跳闸(OSHT)。
- 支持可进行限流操作的逐次循环跳闸(CBC)。
- 每个跳闸输入引脚可以分配到一次触发操作或逐循环操作
- 在任何跳闸区引脚上都可以中断产生。
- 还支持软件强制跳闸。
- 如果不需要,可以完全绕过区域子模块。
7.2控制和监控跳闸子模块
寄存器名 | 有无影子寄存器 | 描述 |
---|---|---|
TZSEL | 无 | 选择寄存器 |
TZCTL | 无 | 控制寄存器 |
TZEINT | 无 | 使能中断寄存器 |
TZFLG | 无 | 标志位寄存器 |
TZCLR | 无 | 清0寄存器 |
TZFRC | 无 | 强制操作寄存器 |
所有的跳闸区寄存器都受到EALLOW的保护,只有在执行EALLOW指令后才能进行修改。
7.3、跳闸区子模块操作要点
在引脚TZ1至TZ6处的跳闸区信号(也统称为TZn)是主动的低输入信号。当其中一个引脚变低时,它表示已经发生了一个行程事件。每个ePWM模块可以单独配置为忽略或使用每个区域引脚。特定的ePWM模块使用哪些闸区引脚由该特定ePWM模块的TZSEL寄存器决定。闸信号可以与系统时钟同步(不同步),并在GPIOMUX块内进行数字滤波。TZn输入上至少1次排除低脉冲足以触发ePWM模块中的故障状态。异步跳闸确保如果由于任何原因缺少时钟,如果GPIO配置适当,输出仍然可以被TZn输入上存在的有效事件跳闸。
每个TZn输入可以单独配置为为ePWM模块提供一个周期或一次周期的跳闸事件。该配置分别由TZSEL[CBCn]和TZSEL[OSHTn]控制位(其中n对应于跳闸针)决定。
- 按周期(CBC):
当发生逐周期跳闸事件时,TZCTL寄存器将立即对EPWMxA和/或EPWMxB输出执行其中指定的操作。表列出了可能的操作。此外,将设置逐循环跳闸事件标志(TZFLG[CBC]),如果在TZEINT寄存器和PIE外围设备中启用,则将生成EPWMx_TZINT中断。
如果跳闸事件不再存在,当ePWM时间基础计数器达到0(TBCTR=0x0000)时,将自动清除针脚上的指定条件。因此,在此模式下,每个PWM周期都会清除或复位行程事件。TZFLG[CBC]标志位将保持设置,直到通过写入TZCLR[CBC]位手动清除。如果清除TZFLG[CBC]位时,逐循环跳闸事件仍然存在,则将立即置高。 - 单次触发(OSHT):
当一个一次性跳闸事件发生时,TZCTL寄存器中指定的操作将立即在EPWMxA和/或EPWMxB输出中执行该操作。表列出了可能的操作。此外,将设置一次性行程事件标志(TZFLG[OST]),如果在TZEINT寄存器和PIE外围设备中启用,它将生成EPWMx_TZINT中断。必须通过写入TZCLR[OST]位来手动清除一次性行程条件
当跳闸事件发生时所采取的操作可以通过TZCTL[TZA]和TZCTL[TZB]寄存器位为每个ePWM输出引脚单独配置。如表所示的四种可能的行动之一,可以在一次旅行活动中采取。
TZCTL[TZA]和/或TZCTL[TZB] | EPWMxA和/或EPWMxB | 操作 |
---|---|---|
0,0 | 高阻抗 | 触发 |
0,1 | 强制置高 | 触发 |
1,0 | 强制拉低 | 触发 |
1,1 | 不改变 | 不对输出模式做出更改 |
举例
场景A: |
---|
在TZ1上的一次一次性跳闸事件将EPWM1A,EPWM1B拉低,也迫使EPWM2A和EPWM2B拉高。 |
配置ePWM1寄存器如下: |
TZSEL[OSHT1]=1:允许TZ1作为ePWM1的一次性事件源 |
TZCTL[TZA]=2:EPWM1A将在跳闸事件中被迫拉低。 |
TZCTL[TZB]=2:EPWM1B将在旅行活动中被迫拉低。 |
配置ePWM2寄存器如下: |
TZSEL[OSHT1]=1:允许TZ1作为ePWM2的一次性事件源 |
TZCTL[TZA]=1:EPWM2A将在一次跳闸事件中强制拉高。 |
TZCTL[TZB]=1:EPWM2B将在一次跳闸事件中强制拉高。 |
------------------------------------------------------------------------------------------------------------------------------------------- |
场景B: |
TZ5上的一个循环事件将EPWM1A和EPWM1B都拉低。TZ1或TZ6上的一次性事件使EPWM2A进入高阻抗状态 |
配置ePWM1寄存器如下: |
TZSEL[OSHT1]=1:允许TZ1作为ePWM1的一次性事件源 |
TZCTL[TZA]=2:EPWM1A将在跳闸事件中被迫拉低。 |
TZCTL[TZB]=2:EPWM1B将在旅行活动中被迫拉低。 |
配置ePWM2寄存器如下: |
TZSEL[OSHT1]=1:允许TZ1作为ePWM2的一次性事件源 |
TZSEL[OSHT6]=1:允许TZ6作为ePWM2的一次性事件源 |
TZCTL[TZA]=0:EPWM2A将在跳闸事件中处于高阻抗状态。 |
TZCTL[TZB]=3:EPWM2B将忽略该行程事件。 |
------------------------------------------------------------------------------------------------------------------------------------------- |
7.4、跳闸事件中断
跳闸子模块控制逻辑
中断逻辑图:
8、事件触发子模块(ET模块)
//TZ模块控制的是EPWM的输出,ET模块控制的是ADC转换信号和中断服务信号
事件触发器子模块的关键功能是:
- 输入由时基和CC模块生成的事件输入
- 使用时基准方向信息进行向上计数事件和向下计数事件确认
- 使用预调用逻辑发出中断请求和ADC开始转换:
每次事件触发
每两次触发一次
每三次触发一次 - 通过事件计数器和标志提供事件生成的完全可见性
- 允许软件强制中断和ADC开始转换
ET模块管理由TB模块、CC模块生成的事件,以产生对CPU的中断和/或当选定事件发生时向ADC的转换脉冲的开始。
8.1、ET模块的操作概述
以下部分描述了ET模块的操作要点。每个ePWM模块都有一条连接到PIE的中断请求线和两个连接到ADC模块的开始转换信号(每个测序器一个)。如图所示,所有ePWM模块的ADC转换启动一起为ORed,因此多个模块可以启动ADC转换启动。如果在转换行的一个开始处出现两个请求,则ADC将只识别一个请求。
ET模块监视各种事件条件(下图所示的事件触发子模块的左侧输入),可以配置为在发出中断请求或ADC开始转换之前预先调放这些事件。事件触发器预调用逻辑可以在以下位置发出中断请求和ADC开始转换:
1、每次都触发
2、每两次触发一次
3、每三次触发一次
主要寄存器如下表:
寄存器名 | 有无影子寄存器 | 描述 |
---|---|---|
ETSEL | 无 | 选择寄存器 |
ETPS | 无 | 事件申请寄存器 |
ETFLG | 无 | 标志位寄存器 |
ETCLR | 无 | 清零寄存器 |
ETFRC | 无 | 强制操作寄存器 |
- ETSEL—这将选择哪些可能的事件将触发中断或启动ADC转换
- ETPS-此程序提供上面提到的事件预压选项。
- ETFLG—这些是表示所选和预缩放事件状态的标志位。
- ETCLR—这些位允许您通过软件清除ETFLG寄存器中的标志位。
- ETFRC——这些位允许软件强制执行一个事件。可用于调试或无干预。
下图显示事件触发器的中断生成逻辑。中断周期(ETPS[INTPRD])位指定了导致产生中断脉冲所需的事件数。可用的选择包括:
- 不要生成中断。
- 对每个事件产生一个中断
- 对每两次事件产生一个中断
- 对每三次事件产生一个中断
通过中断选择对可导致中断的事件(ETSEL[INTSEL])位进行配置。该事件可以是以下事件之一:
- 时间基计数器等于零(TBCTR=0x0000)。
- 时间基计数器等于周期(TBCTR=TBPRD)。
- 当计时器递增时,时间基计数器等于比较A寄存器(CMPA)。
- 当计数器递减时,时间基计数器等于比较A寄存器(CMPA)。
- 当计时器递增时,时间基计数器等于比较B寄存器(CMPB)。
- 当计时器递减时,时间基计数器等于比较B寄存器(CMPB)。
可以从中断事件计数器(ETPS[INTCNT])寄存器位中读取已发生的事件数。也就是说,当指定的事件发生时,ETPS[INTCNT]位将被增加,直到它们达到由ETPS[INTPRD]指定的值。当ETPS[INTCNT]=ETPS[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]时停止计数事件。
- 如果启用了中断,但中断标志已经设置,那么计数器将保持其高输出,直到ENTFLG[INT]标志被清除。这允许一个中断在提供服务时等待。
写入INTPRD位将自动清除计数器INTCNT=0,计数器输出将被重置(因此不会产生中断)。将1写入ETFRC[INT]位将增加事件计数器INTCNT。当INTCNT=INTPRD时,计数器的行为将如上所述。当INTPRD=0时,计数器被禁用,因此不会检测到任何事件,也会忽略ETFRC[INT]位。上述定义意味着您可以对每个事件、每第二个事件或每第三个事件生成一个中断。不能对每四分之一或多个事件生成一个中断。
下图显示了事件触发器的开始转换-A(SOCA)脉冲发生器的操作情况。ETPS计数器和ETPS周期值的行为与中断发生器相似,除了脉冲是连续产生的。也就是说,当脉冲产生时,脉冲标志ETFLG[SOCA]被锁定,但它不会停止进一步的脉冲产生。启用/禁用位ETSEL[SOCAEN]停止脉冲生成,但仍然可以计算输入事件,直到像中断生成逻辑一样达到周期值。将触发SOCA和SOCB脉冲的事件可以分别在“ETSEL”和“ETSEL”位中进行配置。可能的事件与可以为中断生成逻辑指定的事件相同。
下图显示事件触发器的开始转换-B(SOCB)脉冲发生器的操作情况。事件触发器的SOCB脉冲发生器的工作方式与SOCA相同。