YTM32微控制器上集成的eTMR模块,是一个定时器外设,下辖多至8个通道,除了可以进行基本的周期计数外,还可以实现硬件输出比较(PWM)、输入捕获的功能,有一些特别的eTMR示例,还支持正交编码器的功能。
YTM32微控制器上集成了定时器外设模块还有TMR、pTMR、LPTMR、RTC等,其中eTMR大多用于产生PWM信号,或者通过输入捕捉测量方波脉冲信号的宽度。大多用在电机相关的应用中。
每款芯片集成eTMR实例的数量不同,以YTM32B1ME05为例,总共6个eTMR,并且每个eTMR实例的部分功能也做了裁剪。如图x所示。
微控制器定时器外设模块的核心,是一个计数器。所谓通道,实际上是可以匹配计数器某个计数值的事件,用户可以配置在特定的情况下产生事件(例如,对外输出电平,对内产生触发信号等)对应输出比较
的功能;也可以配置被外部的同步信号触发,将发生事件的时刻快照到通道的数值寄存器中,对应输入捕获
的功能。因此,带有多通道的定时器外设大多设计得相似,可有系统框图,如图x所示。
eTMR外设对外有一些信号绑定到芯片的引脚上。如表x所示。
引脚名 | 信号描述 | 信号方向 |
---|---|---|
TCLK_IN0, TCLK_IN1, TCLK_IN2 | 可选其一作为外部输入的计数器时钟源 | 输入 |
eTMR_CH0, eTMR_CH1, … , eTMR_CH6, eTMR_CH7 | 通道的输入输出信号:当工作在输入捕捉模式时,可送入触发信号; 当工作在输出比较或PWM模式时,可输出电平信号,产生PWM波形。 |
输入/输出 |
eTMR_FLT0, eTMR_FLT1, eTMR_FLT2, eTMR_FLT3 | 捕获外部的错误信号(Fault Event) | 输入 |
eTMR_QD_PHA, eTMR_QD_PHB | 正交编码器模式的输入信号 | 输入 |
定时器外设引擎的基本核心是一个可以由外部时钟源驱动计数的定时器。
eTMR外设涉及到两个时钟源:驱动访问寄存器的外设总线时钟,和驱动定时器计数的功能时钟。有一些型号的芯片,可能会设计可以接入到eTMR的功能时钟的不同时钟源。例如,可以直接将PLL倍频后的高速时钟直接送入定时器外设,以获取更高的控制精度,也可以将低功耗模式下能够继续存活的低速时钟源接入定时器的时钟源,从而可以芯片的低功耗模式下继续自行工作。但在本例的YTM32B1ME05微控制器上,是将SCU模块中产生的FAST_BUS_CLK
固定接入eTMR的功能时钟源。如图x所示。这在IPC模块的章节中的表Table 13.1 IP Clock Control Table
的备注里,也有相关的描述。
eTMR module clock source is FAST_BUS_CLK default, also can use TCLK through configuring in the eTMR register, and TCLK frequency must be less than the half of FAST_BUS_CLK.
在eTMR外设模块内部,还可以通过配置寄存器eTMR_CTRL[CLKSRC]
,选择使用计数的功能时钟源,来自IPC
模块的FAST_BUS_CLK
,或是从eTMR_TCLK_IN0
引脚接入的外部时钟源。而在CIM
外设中,可以通过配置寄存器CIM_ETMROPT0[ETMRx_EXTCLK_SEL]
,选择eTMR_TCLK_IN0
/eTMR_TCLK_IN1
/eTMR_TCLK_IN2
其中之一生效。
eTMR的计数时钟信号CLK_src
进入eTMR外设后,还需要经过一个7位的分频器,才会送入eTMR的计数器驱动计数CLK_cnt
。这个分频器的分频因子,是在寄存器eTMR_CTRL[CLKPRS]
中设定的。有计数器计数时钟频率的计算公式如下:
C L K C N T = C L K S R C C T R L [ C L K P R S ] + 1 CLK_{CNT} = \frac{CLK_{SRC}}{CTRL[CLKPRS]+1} CLKCNT=CTRL[CLKPRS]+1CLKSRC
经过分频的时钟信号送入计数器,驱动计数。大多数eTMR的内部计数器是16位的(eTMR3是32位),一旦启动定时器(软件设置寄存器eTMR_CTRL[EN]=1
)并等到Load事件(标志位eTMR_SYNC[LDOK]=1
),则计数器将会从寄存器eTMR_INIT
载入初值到计数器寄存器eTMR_CNT
中(eTMR_SYNC[INITCNT]=1
)或是直接向eTMR_CNT
寄存器中写初值,开始递增计数。软件可以从计数器寄存器eTMR_CNT
中实时读到当前计数器的值。当计数值达到寄存器eTMR_MOD
中设定的值时,会触发Overflow溢出事件(可产生中断,也可产生触发信号),起eTMR_STS[TOF]
标志位,然后定时器计数器直接回返至寄存器eTMR_INIT
的值。如此,形成计数周期。如图x所示。
在一些应用场景中(例如电机控制),需要多个eTMR配合,使用相同频率的时钟源,并且使用相同相位的时钟信号。此时,就需要多个eTMR外设实例同步启动,为此,eTMR设计了GTB功能(Global Time Base)。所有设定了寄存器eTMR_CTRL[GLOBEN]=1
的eTMR实例将会并如GTB的集合,其中设定eTMR_SYNC[GLOB]=1
的eTMR实例将作为主机,其余eTMR实例为从机,由主机eTMR控制GTB集合中所有eTMR的启动。
eTMR外设可以配置成输出比较模式、输入捕获模式、专用PWM模式和编码器模式:
输出比较功能多用于产生简单的PWM信号。
设置通道控制寄存器eTMR_CHn_CTRL[CHMODE]=1
,该通道为输出比较模式。输出比较模式下,通道引脚为输出方向,引脚电平的初值由寄存器eTMR_CHn_CTRL[CHINIT]
和eTMR_CHn_CTRL[CHPOL]
指定,在匹配事件发生后,输出指定的电平(由eTMR_CHn_CTRL[VAL0CMP]
和eTMR_CHn_CTRL[VAL1CMP]
确定)。
不同于以往简单的多通道定时器外设的设计,eTMR为每个通道设计了两个匹配值寄存器eTMR_CHn_VAL0
和eTMR_CHn_VAL1
。当设定寄存器eTMR_CHn_CTRL[CHMODE]=2
时,该通道被设定为输出比较模式。寄存器eTMR_CHn_VAL0
和eTMR_CHn_VAL1
各自设定一个匹配值,控制该通道绑定的引脚输出指定电平(eTMR_CHn_CTRL[VAL0CMP]
和eTMR_CHn_CTRL[VAL1CMP]
的配置值,可以指定在匹配时输出高电平、低电平或是翻转)。以此可以产生PWM信号。
通过配置定时器的MOD,可以指定输出PWM信号的周期。在PWM信号的周期内部,通过配置通道的VAL0和VAL1,可以控制PWM信号的相位和占空比。
虽然输出比较模式可以用于产生简单的PWM信号,但eTMR仍然设计了专门的PWM模式(寄存器eTMR_CHn_CTRL[CHMODE]=1
)。在专门的PWM模式下,除了能够以约定的方式配置一些寄存器产生边沿对齐和中央对齐的PWM信号外,eTMR还可以将两路输出通道组合成一对互补输出,以及捕获硬件错误信号等,专门针对电机控制系统中对PWM信号的需求。
手册中描述了eTMR的PWM模式工作机制的框图,如图x所示。
实际上,在专门的PWM模式下,如手册上的详细描述,无论是产生中央对齐、边沿对齐还是非对称对齐(有相位差的边沿对齐)的PWM信号波形,对每个通道的INIT、MOD、VAL0、VAL1寄存器的使用方式,同在输出比较模式下产生PWM信号的用法并无二致。专门PWM模式较于使用输出比较模式产生PWM信号增加的主要功能,是能够将两个通道配对形成一个输出通道对(Channel Pair),而有一些功能,需要在启用通道对之后,才能解锁,例如产生互补输出PWM信号。
在有8个通道的eTMR模块中,偶数编号的通道同+1后的奇数通道可以配对,例如,0和1号通道配对,2和3号通道配对等。当启用任何需要通道配对完成的功能时(配置寄存器eTMR_CTRL
寄存器中的COMPLxx
或DBSWxx
字段),对应通道即配对成功。如图x所示。
当通道配对成功后,通常使用偶数编号的通道的配置,控制通道对在启用模式下的行为,奇数编号通道的配置不再生效。
当设置eTMR_CTRL[COMPLxx]=1
时,将对应通道配对,并启用互补输出模式。此时,奇数编号的通道的占空比设置都不起作用,奇数编号通道输出的信号完全与通道对的偶数号通道的输出电平相反。如图x所示。
从图中可以看到,PWM1的信号并没有受到CH1_VAL0和CH1_VAL1的控制,而是同PWM0相对。
当设置eTMR_CTRL[DBSWxx]=1
时,将对应通道配对,并启用双缓冲模式。当启用双缓冲模式后,偶数通道和奇数通道产生的PWM信号相互亦或XOR,通过偶数通道的引脚输出亦或之后的信号,如图x所示。
双缓冲模式通常同互补输出模式一起使用,此时偶数通道引脚输出的是两个通道亦或之后的信号,奇数通道输出的时取反的信号。这是基于FOC算法,实现电机应用中的开窗操作,方便ADC采样的一个小功能。
错误检测机制指的是,若外部的硬件电路检测到某种不安全的状态(例如电机突然停转,电机内部的电流采样过大,需要关断PWM控制的桥臂),就会立刻将PWM输出端口关断,或者将端口输出的切换至一种预设的安全的状态。这个错误检测的事件,对于eTMR模块来说,就是一个触发信号。这个信号可以来自于TMU(Trigger Multiplexer Module),也可以来自于错误检测引脚(eTMR_FLTn)。
eTMR对这个错误检测的的触发信号设计了一系列滤波和事件捕获机制(既然要突然关断eTMR的所有输出信号,当然是要慎之又慎),如图x所示。
图x中展示的关于错误检测信号的功能,均可在寄存器eTMR_FAULT
中设定。如图x所示。
设置通道控制寄存器eTMR_CHn_CTRL[CHMODE]=3
,该通道为输入捕获模式。输入捕获模式下,通道的引脚自动切换为输入方向,用以捕获触发信号(由寄存器CH_CTRL[CAPEDGE]
设置),在触发到来之时,将eTMR中计数器的值快照到通道的eTMR_CH_CVAL
寄存器中,同时通道的标志位eTMR_STS[CHxF]
也将置位。
输入捕捉通常用于记录某些关键事件发生的时刻,例如用来测量方波信号的频率或者脉宽等。
部分eTMR的实例被设计支持编码器模式。在有支持编码器模式的eTMR中(例如YTM32B1ME05的eTMR1),设置寄存器eTMR_QDCTRL[QDEN]=1
,即可将eTMR整个变成编码器,其余通道引脚和错误检测引脚的eTMR功能都被停用,使用专用的eTMR_QD_PHA
和eTMR_QD_PHB
引脚捕获来自编码器的脉冲信号流。
正交编码器的两个信号,是前后相位相差90度的同频方波信号,并且可通过相差的前后判断编码器的旋转方向。
图x展示了eTMR编码器模块的工作机制。将旋转编码器的两路输出信号输入到编码器模块的引脚后,eTMR模块内部对旋转编码器的信号先进行采样(同步,)、消抖(滤波,eTMR_QDCTRL[QDFCNT]
和eTMR_QDCTRL[QDFPER]
)、可选配置相位(eTMR_QDCTRL[PHAPOL]
和eTMR_QDCTRL[PHBPOL]
),然后进入编码器信号变换模块(主要是D触发器),将解析出的速度信号(脉冲序列)和方向信号(电平)送入eTMR的计数器(经过eTMR_QDCTRL[QDCLKPRS]
分频后送入),此时,eTMR的计数器的工作状态,等同于使用外部时钟源驱动计数。用户可以实时读取eTMR_CNT
的值,对应编码器的位置。
这里要注意,编码器的方向是可以正转,也可以反转的,这就意味着eTMR_CNT
寄存器中的值可以递增,也可以递减。
在eTMR_QDCTRL[QDMODE]
寄存器段中可以指定4中编码器的工作模式:
因为计数器和总线上访问寄存器使用两个不同的时钟域,又或是因为在有些应用(例如电机)场景中,需要硬件保证的同步更新一组寄存器,而不能又软件一个一个地赋值(否则切换过程中出现不当配置,电机就烧啦),eTMR为一些同计数相关的寄存器设计了缓冲寄存器(Buffered Registers),或者被称为“影子寄存器”(Shadow Registers)。影子寄存器对用户来说是不可见的。当启用影子模式后(eTMR_SYNC[REGLD] != 0
),用户通过APB总线向拥有影子寄存器的真实寄存器中写数时,实际由硬件控制先写到影子寄存器中,当预设的同步触发信号到来之时,硬件自动将影子寄存器中的数值写入到实际的寄存器中生效。如图x所示。
图x中展示了,eTMR中拥有影子的寄存器包括:eTMR_INIT、eTMR_MOD、eTMR_MID、eTMR_CHn_VAL0、eTMR_CHn_VAL1、eTMR_CHn_MASK,可以触发载入事件的触发信号,可以来自于MOD或者MID匹配事件、软件或者硬件触发,或者软件写eTMR_SYNC[LDOK]=1
。载入事件也可以至起标志位eTMR_STS[RF]
。
关于影子模式相关的寄存器配置,均在寄存器eTMR_SYNC
中可查阅。例如,eTMR_SYNC[LDREQ]
指定了在启用同步机制的情况下,连续触发多少次同步事件,才能真的同步一次。
eTMR的调制模式,是另一种通道对混合应用的方式,但不同于eTMR内部通道对信号的相互耦合,调制模式允许两个不同eTMR模块以不同频率的信号相互调制(进行与AND逻辑计算)。这种多个实例配合起来的功能,需要在SOC级上进行配置,这也就意味着并不是集成了多了eTMR外设,就一定支持调制模式。
以YTM32B1ME05为例,当启用调试模式时,eTMR0的8个通道(配置CIM_ETMROPT[eTMR0_CHxOUTSEL]
)可以同eTMR1的CH0调制,通过eTMR0的通道引脚输出调制后的PWM信号。
调试模式产生的信号,可用来实现BLDC电机控制中的负载调制,对相位控制信号用占空比进一步对信号功率打折,也可以用来实现某些红外调制的控制信号。
作为一个典型的带输入输出的多通道定时器外设,eTMR的超时事件、各通道的匹配(或输入捕获事件)事件、错误检测输入信号,以及编码器溢出事件都可以触发中断。当对应事件产生后,有标志将会在eTMR_STS
寄存器置位,若此时寄存器eTMR_INTE
的对应位被置1(启用中断),则会将触发信号送至中断管理器NVIC,触发中断。用户通过写eTMR_STS
寄存器以清零标志位。
这里需要注意的是,eTMR的每个通道设计了两个匹配寄存器,这两个寄存器会共用同一个通道标志位,这就意味着,如果要分别处理两个通道的中断,前一个匹配事件的中断处理过程要尽量短,或者用户仅使用后一个事件的中断(允许通道标志位溢出,即在标志位置位后未被清零的情况下再次发起标志位置位的操作)。
eTMR也可以产生DMA触发信号,通过配置各通道的eTMR_CHn_CTRL[DMAEN]=1
,可以启用该通道的匹配(或输入捕获)事件,向DMAMUX发送DMA触发请求。这里对应于每个通道的两个匹配事件,对应也会产生两次DMA触发请求。例如,在使用DMA的触发计数器对eTMR产生PWM信号的周期进行计数时,对通道的触发请求进行计数(eTMR的通道溢出事件不会产生DMA请求),将会是PWM周期数量的2倍。
DMA触发的优先级高于中断触发,二者只能有一个生效。一旦使能DMA,即使使能中断,也不会置起中断请求。
YTMicro SDK中设计了eTMR外设的驱动程序,有源码文件 etmr_driver.h
、etmr_common.c
、etmr_ic_driver.c
、etmr_mc_driver.c
、etmr_oc_driver.c
、etmr_pwm_driver.c
、etmr_qd_driver.c
等。同时提供了相应的样例工程:etmr_input_capture
、etmr_input_capture_interrupt
、etmr_output_compare
、etmr_pwm
。
本文介绍了eTMR的主要功能,作为一个典型的多通道定时器外设的实现,eTMR实现了输出比较、输入捕获和专用PWM模式。在常规应用中,可以使用输出比较功能产生PWM,在专用PWM模式下,可以使用通道配对,实现需要多个引脚输出实现的功能(例如互补输出)。eTMR还支持死区控制,复杂的掩码机制等,本文未作详解,读者可根据应用需求再详查手册。