STM32 HRTIM 学习心得(1):硬件框图的理解
或者说,autodelay 是如何起作用的?这要仔细看一下 Capture1、Counter 和 Compare2 是如何交互的:他们的交互由寄存器值 DELCMP2[1…
第二篇内容已经出来 STM32 HRTIM 学习心得(2):控制输出 PWM/SPWM/带死区的互补SPWM ,结合了本篇进行了 2 种波形的简单输出。
1. STM32 HRTIM 硬件框图
下面是 STM32G474 系列的 HRTIM 定时器的硬件框图:
其有一个 Master Timer 和一共 6 个独立的定时器 A-F Timer,每个 Timer 内部又有独立的 4 个 CMP 和独立的两路输出通道 HTIM_CHx1/2。
Cross-timer counter reset bus 总线可以将所有的定时器包括 Master Timer 连接在一起,使得每个定时器都可以接收总线上其他定时器发出的同步信号,同时所有定时器都可将自身的某些事件作为同步信号发送到总线上。
以定时器 Timer A 为例,其可以接收到来自 Cross-timer counter reset bus:
- Master timer period event
- Master timer cmp1/2/3/4 event
- Timer B cmp1/2/4 event
- Timer C cmp1/2/4 event
- Timer D cmp1/2/4 event
- Timer E cmp1/2/4 event
- Timer F cmp1/2 event
通过 Cross-timer counter reset bus,可以将所有的子定时器都与主定时器进行同步,也可以将所有的定时器分为几组,分别工作。
2. Master Timer
先详细了解一下 Master Timer:
2.1 f H R T I M f_{HRTIM} fHRTIM
从左到右看,HRTIM 基准的时钟是来源于 f H R T I M f_{HRTIM} fHRTIM :HRTIM 的主时钟,其对应硬件框图中的 hrtim_ker_ck 时钟,所有 HRTIM 内部定时器(Master Timer 以及 A ~ F Timer)的分频和同步的基准时钟;

f H R T I M f_{HRTIM} fHRTIM: main HRTIM clock (hrtim_ker_ck). All subsequent clocks are derived and synchronous with this source.
f H R T I M f_{HRTIM} fHRTIM 进入一个分频器,这个分频器对应 CubeMx 中的 Prescale Ratio,它不仅可以分频,还可以进行倍频:

例如:我设置倍频率为 32,那么我的 Master Timer 的计数器运行频率就是 170MHz * 32 = 5440 MHz = 5.44 GHz,即 Master Timer 的 Counter 每秒可以计数 5.44G 次,通过这个我们可以配置 PWM 的输出频率;
例如:我期望输出的 PWM 频率为 20KHz,设置 Prescaler Ratio 为不分频不倍率频,那么 f H R T I M f_{HRTIM} fHRTIM 为 170MHz,则我应该设置的 Period 的值为 P e r i o d = 170 M H z 20 K H z = 8 , 500 Period = \frac{170MHz}{20KHz} = 8,500 Period=20KHz170MHz=8,500

这就是 Precalor 和 Period 的用法,对 Timer A ~ F 定时器也是如此。
2.2 Counter
详细看一下 Counter,HRTIM 的 Counter 有三种工作模式:
- Single-shot Non-retriggerable
- Single-shot Retriggerable
- Continuous mode
这三种工作模式的区别如下:
首先,看一下 Continuous mode 模式,在接收到 Enable 信号(TxEN)后,计数器启动计数、一直到达 Period 后自动重载,然后重新计数,如果在计数期间接收到任何 Reset 信号(这个信号可以来源于前面提到的 Cross-timer counter reset bus),则触发重新计数;
再看一下两个 Single-shot 模式:
- 第一种 Single-shot Non-retriggerable,在接收到 Reset 信号后触发计数、在达到 Period 的值之前无法被 Reset,如果计算器达到 Period 的值之后会暂停;
- 第二种 Single-shot Retriggerable,则可以在计数中途被 Reset 信号触发,清空计数值重新计数;

2.3 Compare
普通的定时器输出的 PWM 中的高电平部分,要么在前部分,要么在后部分。例如,下面这个占空比百分之 25% 的 PWM 方波,其高电平位于后百分之二十五的部分,如果我们期望任意调控高电平部分的位置,甚至期望每个 PWM 的周期内,都可以灵活调整高电平出现的位置和宽度,那么 HRTIM 就提供了这个功能,也就是 4 路 Compare 的功能;

图片来源于 https://cloud.tencent.com/developer/article/2438631
这里以 Timer A 定时器的 Compare 为例,我们都知道 Timer A 有两个输出端口 CHA1 和 CHA2,其中 Compare1 和 Compare2 就是控制输出端口高电平在 PWM 中出现和消失的时刻:

例如,上图设置了 CMP1AR 寄存器为 0x80 和 CMP2AR 寄存器为 0x150,那么 CHA1 会在 Counter 达到 0x80 时控制端口输出高电平,在 Counter 达到 0x150的时候拉低端口输出,通过动态调整这两个寄存器的值,我们就可以灵活调控 PWM 的输出情况;
当然,这个是对于 Timer A ~ F 定时器的功能,我们都知道其实 Master Timer 没有输出的端口,那么这个 Master Timer 的 Compare1~4 就很简单,作为一个 Timer Reset 的信号源。
2.4 Half
仔细看 Compare 1 旁边还有个 Half 的功能:

按照手册原文的描述就是它可以使得 Compare 1 寄存器的值变为其原本的二分之一(HRTIM_PERxR/2),这个功能可以使得 PWM 的占空比动态扩大到原来的一半,这功能适用于当你有需要调整 PWM 为原来两倍的时候或者缩小两个的时候使用;
This mode aims at generating square signal with fixed 50% duty cycle and variable frequency (typically for converters using resonant topologies). It allows to have the duty cycle automatically forced to half of the period value when a new period is programmed.
This mode is enabled by writing HALF bit to 1 in the HRTIM_TIMxCR register. When the HRTIM_PERxR register is written, it causes an automatic update of the compare 1 value with HRTIM_PERxR/2 value.
2.5 Repetition
最后看一下 Period 上面的那个 Counter 和 Repetition 寄存器,这块功能是为了减少 CPU 的负担,减少中断信号触发次数而设计的,当计数器被 Reset 或者达到 Period 寄存器的值触发重新计数(连续模式下)时,都会使得 Repetition 的值减一(最小不小于零),当 Repetition 的值为 0 时,每次 Counter 被 Reset 或者达到 Period 寄存器的值时都会触发 REP 中断;
例如:当 Counter 工作在连接计数模式时:

上面分别是 REPxR (Repetition 的计数器值)为分别为 0、1、2,都只在 REPxR 寄存器为 0 时候触发中断。
2.6 External Synchronization Unit
HRTIM 不仅可以通过内部如 Period、Repetition、Compare 产生一些信号(事件),也可以通过外部一些外设,如:片内外设、芯片外部的一些信号(如:通过 GPIO 引脚触发)等产生一些同步信号,例如在最前面的框图中:

可以看到其可选的外部同步信号源高达 10 路,在 CubeMx 中我们可以配置这些外部信号:

我们通过配置 EEV Pin 的输入也可以指定芯片外部同步信号:

2.7 Crossbars
最后看一下 Master Timer 最后一个部分,位于最右边的 Crossbars:
Master Timer 可以往 Crossbars 上发送 6 个事件、SYNC 是由左上角的 External Synchronization Unit 提供的,回到最原先的硬件框图中,我们可以看到所有的定时器的输出都会被接入到 Crossbars 中:

这个 Crossbars 可以最终控制各个 CHx1/2 端口的输出,例如:控制其输出高电平或者控制其输出低电平,详细请自行参考手册。
3. Timer A ~ F
Timer A ~ F 的框图和 Master Timer 差不多,多了一些寄存器:
依旧从左到右来看。
3.1 Capture
这个寄存器是捕获 Counter 的作用,可以理解其可以根据事件捕获 Counter 的值:

例如:左侧这些事件都可以触发,Capture1 捕获当前 Timer A 的 Counter,这个可以作为我们两个事件的时间间隔,也就是 timing。
Capture 1 和 Capture 2 可以作为控制 Compare 2 和 Compare 4 的触发信号(前面我们了解到了 Compare2 和 Compare 4 有拉低端口为低电平的功能)。例如,我们希望一旦触发某个信号(事件),就拉低 PWM 的输出,那么就可以借助这个 Capture 寄存器来捕获这个时刻的计数器值,然后将其传递给 Compare 2 和 4 就能实现这个功能。
如果我们希望触发某个信号后,再自动延时个比如 5 个计数器的时间,再触发 Compare 2 和 4 起作用呢?那么就可以借助 autodelay 寄存器。
3.2 AutoDelay
刚刚我们提到可以设置 Capture1 的触发 Compare 2 和 Compare 4,这需要借助 Autodelay 这个寄存器:
autodelay 可以理解它会根据触发信息,能够基于触发信号触发的时刻(基于计数器的值),自动在这个时刻的基础上,加上一个延时后去关闭 PWM 的输出。通俗点说,比如我们希望一旦某个信号触发就触发 PWM 被拉低,或者我们希望某个信号触发后,再等待延时 5 个计数器时间,再拉低,那么这当中的再等待 5 个计数器的时间就可以通过设置 autodelay 这个寄存器来实现;
下面是一个 Capture1 控制 Compare 2 寄存器的例子,在 Counter 等于 2 的时候输出高电平,接着大概在 Counter 等于 4 的时候触发 External event 被 Capture 1 捕获(记录其计数值为 7),接着在下一次计数器到达时(计数值为 8),Capture 1 控制了 Compare 2 寄存器,然后 Compare2 在当前的基础上等个 Preload 的时长 5 个计数器后,即到达 5 + 7 = 12 5 + 7 = 12 5+7=12 时刻,触发 Compare 2 其作用。
为什么是 12 时刻起作用呢?或者说,autodelay 是如何起作用的?
这要仔细看一下 Capture1、Counter 和 Compare2 是如何交互的:

他们的交互由寄存器值 DELCMP2[1…0] 来控制:

-
取值为 00 时(Regular compare mode):不启用 Capture 和 autodelay 的功能,也是最一开始介绍的 Compare2 的功能,当计数器到达 Compare2 的值时就拉低引脚输出低电平;
-
取值为 01 时(Auto-delayed mode):启动 autodelay 功能,这时候的 Compare 2 的值会在 Capture 1 的事件触发后起作用。
-
取值为 10 时(Auto-delayed mode with timeout):如果启用了 Capture 1 功能,则会在 Capture 1 的事件触发后起作用。若没有启用 Capture 1 功能,则会在 Compare 1 事件触发后,开始工作;
例如:我们希望 Compare 1 输出后,再 10 个计数器后自动拉低 PWM 就可以采用这个模式,设置 Compare 2 寄存器的值为 10 个时刻,那么在 Compare 1 事件触发后,自动等待 10 个时刻后 Compare 2 也会触发;
-
取值为 11 时(Auto-delayed mode with timeout):如果启用了 Capture 1 功能,则会在 Capture 1 的事件触发后起作用。若没有启用 Capture 1 功能,则会在 Compare 3 事件触发后,开始工作;
4. 输出部分
最后看一下输出端口这部分内容:
输出端口的介绍对应,在参考手册里面是位于 Output management 章节,其硬件款图如下:
Timer 定时器的信号会先经过一个 Chopper,因此我们先看一下这个 Chopper 是干嘛的。
4.1 Chopper
Chopper 的硬件框图如下:
Chopper 是一种斩波机制,STM32 里面这个 Chopper 是作用是生成高频载波信号叠加到原来的 PWM 上面,开启这个功能后输出的 PWM 就从原本的方波,变成如下的波形:

放大一点看细节:

可以看到输出的波形,从原本的方波变成了高电平部分变成了高频的交变信号输出。
那么,这种波形有这么作用呢?
在驱动一些高压器件时候,如电源里的 MOSFET 时,我们可能需要在高压侧和低压侧(MCU 控制信号端)加一个隔离芯片或者叫驱动芯片,将小信号转成大功率信号。例如:三相逆变器的上管驱动传统方案是需要3个隔离电源 + 3个驱动芯片 + 6路隔离;如果使用了 Chopper 后,我们输出信号就能够穿过变压器,那么就可以利用隔离变压器作为隔离那么只需要 3 个小变压器即可实现类似的功能。
STM32G474 的 Chopper 可以叠加频率取决于对 f H R T I M {f_{HRTIM}} fHRTIM 的分频,例如:170MHz 的 f H R T I M {f_{HRTIM}} fHRTIM 官方手册说可以叠加的载波频率为 664 kHz 到 10.625 MHz。此外还可以在对原始信号,增加一个延迟,例如:先输出 1ns 的高电平,后再让输出变为斩波形式:
4.2 Output state
从 Chopper 出来的信号经过一个三项门电路输出选择后输出到实际的端口上,分为三种情况:
这三种情况的状态转移图,如下所示:

- ODIS:Output Disable,当设置这个位后,切入到 IDLE 状态,可以通过 ODS(Output Disable Status)寄存器的值来判断 ODIS 的状态;
有两种情况会触发 ODIS 被设置,一个是通过软件设置,另一个是故障保护、硬件保护和刹车(breakpoint)自动触发; - OEN:Output Enable,当设置这个位后,如果在 FAULTx[1:0] 没有出现故障的情况下,会切入的 RUN 状态,此时端口正常输出;如果此时有故障等情况则切入到 FAULT 状态;
4.3 Fault Protection
因此,我们详细看一下 Fault Protection 的内容,其硬件框图如下所示:
HRTIM 配备多功能故障保护电路,可在异常运行时禁用输出端。一旦触发故障,输出端将进入预设安全状态,该状态将持续保持直至软件重新启用。若发生永久性故障,即使软件尝试重新启用,输出端仍会保持故障状态,直至故障源消除。
可以通过 HRTIM_FLTINR1 和 HRTIM_FLTINR2 寄存器进行配置故障的来源。FLTxSRC[1:0]位用于选择故障信号的来源,该信号可为数字输入或内部事件(内置比较器输出)。
为了避免误判,对于故障模块里面是有个独立的计数器:

下面的 Fault input 在中途恢复了此时故障计数器就被清理零,下次再检测到故障输入,计数器会重新计数,当其达到设定的值(4)时候触发故障信号。
故障计数器的值和 f H R T I M f_{HRTIM} fHRTIM 的联合取值,决定了故障保护的响应时间,这个可以自由配置:

下面是一个故障保护的例子:

当计数器达到 3 时刻,触发了故障保护,PWM 的输出被关闭(这关闭时候的输出电平也可以自行配置)。
5. 小结
自此,基本介绍完了 HRTIM 定时器的核心功能,当然还有很多小功能,例如:设置 deadline 死区时间等。但我觉得,如果大家已经从总体上对这个外设有个清晰的认识,那么再去看这些小功能也会简单很多。
这篇可能会有一些细节上的错误,但是我个人感觉无关紧要,主要是从整体要对这个 HRTIM 有个清晰的认知,需要知道它有什么功能,这些功能有什么作用,至于怎么开启这些功能,大家需要仔细研究手册;
更多推荐
所有评论(0)