第二十二章 TIM——高级定时器

第二十二章 TIM——高级定时器

目录

第二十二章 TIM——高级定时器

1 高级控制定时器

2 高级控制定时器功能框图

2.1 时钟选择

3.5 捕获/比较通道

3.6 输入捕获模式

3.7 PWM 输入模式

3.8 输出比较模式

3.9 PWM 模式

3.10 互补输出和死区插入

3.11 产生六步 PWM 输出

3.12 单脉冲模式

3.13 编码器接口模式

3.14 定时器输入异或功能

3.15 与霍尔传感器的接口

3.16 TIMx 定时器和外部触发的同步

5 定时器初始化结构体详解

5.1 TIM_TimeBaseInitTypeDef

5.2 TIM_OCInitTypeDef

5.3 TIM_ICInitTypeDef

5.4 TIM_BDTRInitTypeDef


本章参考资料:《W55MH32中文参考手册》高级定时器章节。学习本章时,配合参考资料一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。

1 高级控制定时器

        高级控制定时器(TIM1和TIM8)和通用定时器在基本定时器的基础上引入了外部引脚,可以实现输入捕获和输出比较功能。 高级控制定时器比通用定时器增加了可编程死区互补输出、重复计数器、带刹车(断路)功能,这些功能都是针对工业电机控制方面。 这几个功能在本书不做详细的介绍,主要介绍常用的输入捕获和输出比较功能。

        高级控制定时器时基单元包含一个16位自动重装载寄存器ARR,一个16位的计数器CNT,可向上/下计数,一个16位可编程预分频器PSC, 预分频器时钟源有多种可选,有内部的时钟、外部时钟。还有一个8位的重复计数器RCR,这样最高可实现40位的可编程定时。

        W55MH32的高级/通用定时器的IO分配具体见下表,高级控制和通用定时器通道引脚分布 。配套开发板因为IO资源紧缺, 定时器的IO很多已经复用它途,故下表中的IO只有部分可用于定时器的实验。

高级定时器

通用定时器

TIM1

TIM8

TIM2

TIM5

TIM3

TIM4

CH1

PA8/PE9

PC6

PA0/PA15

PA0

PA6/PC6/PB4

PB6/PD12

CH1N

PB13/PA7/PE8

PA7

CH2

PA9/PE11

PC7

PA1/PB3

PA1

PA7/PC7/PB5

PB7/PD13

CH2N

PB14/PB0/PE10

PB0

CH3

PA10/PE13

PC8

PA2/PB10

PA2

PB0/PC8

PB8/PD14

CH3N

PB15/PB1/PE12

PB1

CH4

PA11/PE14

PC9

PA3/PB11

PA3

PB1/PC9

PB9/PD15

ETR

PA12/PE7

PA0

PA0/PA15

PD2

PE0

BKIN

PB12/PA6/PE15

PA6

2 高级控制定时器功能框图

        高级控制定时器功能框图包含了高级控制定时器最核心内容,掌握了功能框图,对高级控制定时器就有一个整体的把握,在编程时思路就非常清晰, 见下图,图中有些寄存器是带影子的,表示其有影子寄存器:

2.1 时钟选择

计数器时钟可由下列时钟源提供:

内部时钟(CK_INT)

外部时钟模式 1:外部输入引脚

外部时钟模式 2:外部触发输入 ETR

内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器。如可以配置一个定时器 Timer1 而作为另一个定时器 Timer2 的预分频器。

内部时钟源(CK_INT):如果禁止了从模式控制器(SMS=000),则 CEN、DIR(TIMx_CR1 寄存器)和 UG 位(TIMx_EGR 寄存器)是事实上的控制位,并且只能被软件修改(UG 位仍被自动清除)。只要 CEN 位被写成'1',预分频器的时钟就由内部时钟 CK_INT 提供。

下图显示控制电路和向上计数器在一般模式下,不带预分频器时的操作。

外部时钟源模式 1

当 TIMx_SMCR 寄存器的 SMS=111 时,此模式被选中。计数器可以在选定输入端的每个上升沿或下降沿计数。

        例如,要配置向上计数器在 T12 输入端的上升沿计数,使用下列步骤:配置 TIMx_CCMR1 寄存器CC2S=01,配置通道 2 检测 TI2 输入的上升沿。

        配置TIMx_CCMR1寄存器的IC2F[3:0],选择输入滤波器带宽(如果不需要滤波器,保持IC2F=0000)配置 TIMx_CCER 寄存器的 CC2P=0,选定上升沿极性W55MH32 参考手册 V1.0.0 201/671配置 TIMx_SMCR 寄存器的 SMS=111,选择定时器外部时钟模式 1 配置 TIMx_SMCR 寄存器中的TS=110,选定 TI2 作为触发输入源设置 TIMx_CR1 寄存器的 CEN=1,启动计数器。

        注:捕获预分频器不用作触发,所以不需要对它进行配置

        当上升沿出现在 TI2,计数器计数一次,且 TIF 标志被设置。在 TI2 的上升沿和计数器实际时钟之间的延时,取决于在 TI2 输入端的重新同步电路。

外部时钟源模式 2

        选定此模式的方法为:令 TIMx_SMCR 寄存器中的 ECE=1 计数器能够在外部触发 ETR 的每一个上升沿或下降沿计数。

下图是外部触发输入的框图:

        例如,要配置在 ETR 下每 2 个上升沿计数一次的向上计数器,使用下列步骤:本例中不需要滤波器,置 TIMx_SMCR 寄存器中的 ETF[3:0]=0000设置预分频器,置 TIMx_SMCR 寄存器中的 ETPS[1:0]=01.选择 ETR 的上升沿检测,置 TIMx_SMCR 寄存器中的 ETP=0 开启外部时钟模式 2,写 TIMx_SMCR寄存器中的 ECE=1.启动计数器,写 TIMx_CR1 寄存器中的 CEN=1 计数器在每 2 个 ETR 上升沿计数一次。在 ETR 的上升沿和计数器实际时钟之间的延时取决于在 ETRP 信号端的重新同步电路。外部时钟模式 2 下的控制电路如下图:

3.5 捕获/比较通道

捕获/比较通道(如:通道 1 输入部分)如下图:

输出部分产生一个中间波形 OCxRef(高有效)作为基准,链的末端决定最终输出信号的极性。

捕获/比较通道 1 的主电路如下图:

捕获/比较通道的输出部分(通道 1 至 3)如下图:

捕获/比较通道的输出部分(通道 4)如下图:

        捕获/比较模块由一个预装载寄存器和一个影子寄存器组成。读写过程仅操作预装载寄存器。在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。

        在比较模式下,预装载寄存器的内容被复制到影子寄存器中,然后影子寄存器的内容和计数器进行比较。

3.6 输入捕获模式

        在输入捕获模式下,当检测到 ICx 信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中。当发生捕获事件时,相应的 CCxIF 标志(TIMx_SR 寄存器)被置 1,如果开放了中断或者 DMA 操作,则将产生中断或者 DMA 请求。如果发生捕获事件时 CCxIF 标志已经为高,那么重复捕获标志 CCxOF(TIMx_SR 寄存器)被置 1。写 CCxIF=0 可清除 CCxIF,或读取存储在TIMx_CCRx 寄存器中的捕获数据也可清除 CCxIF。写 CCxOF=0 可清除 CCxOF。

        以下例子说明如何在 TI1 输入的上升沿时捕获计数器的值到 TIMx_CCR1 寄存器中,步骤如下:

        选择有效输入端:TIMx_CCR1 必须连接到 TI1 输入,所以写入 TIMx_CCR1 寄存器中的CC1S=01,只要 CC1S 不为'00',通道被配置为输入,并且 TIMx_CCR1 寄存器变为只读。

        根据输入信号的特点,配置输入滤波器为所需的带宽(即输入为 TIx 时,输入滤波器控制位是TIMx_CCMRx 寄存器中的 ICxF 位)。假设输入信号在最多 5 个内部时钟周期的时间内抖动,我们须配置滤波器的带宽长于 5 个时钟周期;因此我们可以(以 fDTS 频率)连续采样 8 次,以确认在 TI1 上一次真实的边沿变换,即在 TIMx_CCMR1 寄存器中写入 IC1F=0011。

        选择 TI1 通道的有效转换边沿,在 TIMx_CCER 寄存器中写入 CC1P=0(上升沿)。

        配置输入预分频器。在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预分频器被禁止(写 TIMx_CCMR1 寄存器的 IC1PS=00)。

        设置 TIMx_CCER 寄存器的 CC1E=1,允许捕获计数器的值到捕获寄存器中。

        如果需要,通过设置TIMx_DIER寄存器中的CC1IE位允许相关中断请求,通过设置TIMx_DIER寄存器中的 CC1DE 位允许 DMA 请求。

当发生一个输入捕获时:

        产生有效的电平转换时,计数器的值被传送到 TIMx_CCR1 寄存器。

        CC1IF 标志被设置(中断标志)。当发生至少 2 个连续的捕获时,而 CC1IF 未曾被清除,CC1OF也被置 1。

        如设置了 CC1IE 位,则会产生一个中断。

        如设置了 CC1DE 位,则还会产生一个 DMA 请求。

        为了处理捕获溢出,建议在读出捕获溢出标志之前读取数据,这是为了避免丢失在读出捕获溢出标志之后和读取数据之前可能产生的捕获溢出信息。

3.7 PWM 输入模式

该模式是输入捕获模式的一个特例,除下列区别外,操作与输入捕获模式相同:

两个 ICx 信号被映射至同一个 TIx 输入。

这 2 个 ICx 信号为边沿有效,但是极性相反。

其中一个 TIxFP 信号被作为触发输入信号,而从模式控制器被配置成复位模式。

例如,你需要测量输入到 TI1 上的 PWM 信号的长度(TIMx_CCR1 寄存器)和占空比(TIMx_CCR2 寄存器),具体步骤如下(取决于 CK_INT 的频率和预分频器的值):

选择 TIMx_CCR1 的有效输入:置 TIMx_CCMR1 寄存器的 CC1S=01(选中 TI1)。

选择 TI1FP1 的有效极性(用来捕获数据到 TIMx_CCR1 中和清除计数器):置 CC1P=0(上升沿有效)。

选择 TIMx_CCR2 的有效输入:置 TIMx_CCMR1 寄存器的 CC2S=10(选中 TI1)。

选择 TI1FP2 的有效极性(捕获数据到 TIMx_CCR2):置 CC2P=1(下降沿有效)。

选择有效的触发输入信号:置 TIMx_SMCR 寄存器中的 TS=101(选择 TI1FP1)。

配置从模式控制器为复位模式:置 TIMx_SMCR 中的 SMS=100。

使能捕获:置 TIMx_CCER 寄存器中 CC1E=1 且 CC2E=1。

PWM 输入模式时序图如下:

        因为只有 TI1FP1 和 TI2FP2 连到了从模式控制器,所以 PWM 输入模式只能使用TIMx_CH1/TIMx_CH2 信号。

3.8 输出比较模式

        此项功能是用来控制一个输出波形,或者指示一段给定的的时间已经到时。当计数器与捕获/比较寄存器的内容相同时,输出比较功能做如下操作:

        将输出比较模式(TIMx_CCMRx 寄存器中的 OCxM 位)和输出极性(TIMx_CCER 寄存器中的 CCxP位)定义的值输出到对应的引脚上。在比较匹配时,输出引脚可以保持它的电平(OCxM=000)、被设置成有效电平(OCxM=001)、被设置成无效电平(OCxM=010)或进行翻转(OCxM=011)。

        设置中断状态寄存器中的标志位(TIMx_SR 寄存器中的 CCxIF 位)。

        若设置了相应的中断屏蔽(TIMx_DIER 寄存器中的 CCxIE 位),则产生一个中断。

        若设置了相应的使能位(TIMx_DIER 寄存器中的 CCxDE 位,TIMx_CR2 寄存器中的 CCDS 位选择 DMA 请求功能),则产生一个 DMA 请求。

        TIMx_CCMRx 中的 OCxPE 位选择 TIMx_CCRx 寄存器是否需要使用预装载寄存器。在输出比较模式下,更新事件 UEV 对 OCxREF 和 OCx 输出没有影响。

        同步的精度可以达到计数器的一个计数周期。输出比较模式(在单脉冲模式下)也能用来输出一个单脉冲。

输出比较模式的配置步骤:

1. 选择计数器时钟(内部,外部,预分频器)。

2. 将相应的数据写入 TIMx_ARR 和 TIMx_CCRx 寄存器中。

3. 如果要产生一个中断请求,设置 CCxIE 位。

4. 选择输出模式,例如:

要求计数器与 CCRx 匹配时翻转 OCx 的输出引脚,设置 OCxM=011

置 OCxPE=0 禁用预装载寄存器

置 CCxP=0 选择极性为高电平有效

置 CCxE=1 使能输出

5. 设置 TIMx_CR1 寄存器的 CEN 位启动计数器

        TIMx_CCRx 寄存器能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存器(OCxPE='0',否则 TIMx_CCRx 的影子寄存器只能在发生下一次更新事件时被更新)。下图给出了一个例子:

3.9 PWM 模式

        脉冲宽度调制模式可以产生一个由 TIMx_ARR 寄存器确定频率、由 TIMx_CCRx 寄存器确定占空比的信号。

        在 TIMx_CCMRx 寄存器中的 OCxM 位写入'110'(PWM 模式 1)或'111'(PWM 模式 2),能够独立地设置每个 OCx 输出通道产生一路 PWM。必须通过设置 TIMx_CCMRx 寄存器的 OCxPE 位使能相应的预装载寄存器,最后还要设置 TIMx_CR1 寄存器的 ARPE 位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。

        仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置 TIMx_EGR 寄存器中的 UG 位来初始化所有的寄存器。OCx 的极性可以通过软件在 TIMx_CCER 寄存器中的 CCxP 位设置,它可以设置为高电平有效或低电平有效。OCx 的输出使能通过(TIMx_CCER 和 TIMx_BDTR 寄存器中)CCxE、CCxNE、MOE、OSSI和 OSSR 位的组合控制。在 PWM 模式(模式 1 或模式 2)下,TIMx_CNT 和 TIMx_CCRx 始终在进行比较,(依据计数器的计数方向)以确定是否符合 TIMx_CCRx≤TIMx_CNT 或者 TIMx_CNT≤TIMx_CCRx。

        根据 TIMx_CR1 寄存器中 CMS 位的状态,定时器能够产生边沿对齐的 PWM 信号或中央对齐的 PWM信号。

PWM 边沿对齐模式

  • 向上计数配置

        当 TIMx_CR1 寄存器中的 DIR 位为低的时候执行向上计数。下面是一个 PWM 模式 1 的例子。当 TIMx_CNT<TIMx_CCRx 时,PWM 参考信号 OCxREF 为高,否则为低。如果 TIMx_CCRx 中的比较值大于自动重装载值(TIMx_ARR),则 OCxREF 保持为'1'。如果比较值为 0,则 OCxREF 保持为'0'。下图为 TIMx_ARR=8 时边沿对齐的 PWM 波形实例:

  • 向下计数的配置

        当 TIMx_CR1 寄存器的 DIR 位为高时执行向下计数。在 PWM 模式 1,当 TIMx_CNT>TIMx_CCRx 时参考信号 OCxREF 为低,否则为高。如果TIMx_CCRx 中的比较值大于 TIMx_ARR 中的自动重装载值,则 OCxREF 保持为'1'。该模式下不能产生 0%的 PWM 波形。

PWM 中央对齐模式

        当 TIMx_CR1 寄存器中的 CMS 位不为'00'时为中央对齐模式(所有其他的配置对 OCxREF/OCx 信号都有相同的作用)。根据不同的 CMS 位设置,比较标志可以在计数器向上计数时被置 1、在计数器向下计数时被置 1、或在计数器向上和向下计数时被置 1。TIMx_CR1 寄存器中的计数方向位(DIR)由硬件更新,不要用软件修改它。下图给出了一些中央对齐的 PWM 波形的例子。

TIMx_ARR=8

PWM 模式 1

        TIMx_CR1 寄存器的 CMS=01,在中央对齐模式 1 下,当计数器向下计数时设置比较标志。

使用中央对齐模式的提示:

        进入中央对齐模式时,使用当前的向上/向下计数配置;这就意味着计数器向上还是向下计数取决于 TIMx_CR1 寄存器中 DIR 位的当前值。此外,软件不能同时修改 DIR 和 CMS 位。

        不推荐当运行在中央对齐模式时改写计数器,因为这会产生不可预知的结果。特别地: 如果写入计数器的值大于自动重加载的值(TIMx_CNT>TIMx_ARR),则方向不会被更新。例如,如果计数器正在向上计数,它就会继续向上计数。如果将 0 或者 TIMx_ARR 的值写入计数器,方向被更新,但不产生更新事件 UEV。

        使用中央对齐模式最保险的方法,就是在启动计数器之前产生一个软件更新(设置 TIMx_EGR位中的 UG 位),并且不要在计数进行过程中修改计数器的值。

3.10 互补输出和死区插入

        高级控制定时器(TIM1 和 TIM8)能够输出两路互补信号,并且能够管理输出的瞬时关断和接通。这段时间通常被称为死区,用户应该根据连接的输出器件和它们的特性(电平转换的延时、电源开关的延时等)来调整死区时间。

        配置 TIMx_CCER 寄存器中的 CCxP 和 CCxNP 位,可以为每一个输出独立地选择极性(主输出 OCx或互补输出 OCxN)。

        互补信号 OCx和OCxN通过下列控制位的组合进行控制:TIMx_CCER寄存器的CCxE和CCxNE位,TIMx_BDTR 和 TIMx_CR2 寄存器中的 MOE、OISx、OISxN、OSSI 和 OSSR 位,特别的是,在转换到 IDLE 状态时(MOE 下降到 0)死区被激活。

        同时设置 CCxE 和 CCxNE 位将插入死区,如果存在刹车电路,则还要设置 MOE 位。每一个通道都有一个 10 位的死区发生器。参考信号 OCxREF 可以产生 2 路输出 OCx 和 OCxN。如果 OCx 和 OCxN为高有效:

        OCx 输出信号与参考信号相同,只是它的上升沿相对于参考信号的上升沿有一个延迟。

        OCxN 输出信号与参考信号相反,只是它的上升沿相对于参考信号的下降沿有一个延迟。如果延迟大于当前有效的输出宽度(OCx 或者 OCxN),则不会产生相应的脉冲。下列几张图显示了死区发生器的输出信号和当前参考信号 OCxREF 之间的关系。(假设 CCxP=0、CCxNP=0、MOE=1、CCxE=1 并且 CCxNE=1)。带死区插入的互补输出如下图所示:

死区波形延迟大于负脉冲如下图所示:

死区波形延迟大于正脉冲如下图所示:

        每一个通道的死区延时都是相同的,是由 TIMx_BDTR 寄存器中的 DTG 位编程配置。重定向 OCxREF 到 OCx 或 OCxN

        在输出模式下(强置、输出比较或 PWM),通过配置 TIMx_CCER 寄存器的 CCxE 和 CCxNE 位,OCxREF 可以被重定向到 OCx 或者 OCxN 的输出。

        这个功能可以在互补输出处于无效电平时,在某个输出上送出一个特殊的波形(例如 PWM 或者静态有效电平)。另一个作用是,让两个输出同时处于无效电平,或处于有效电平和带死区的互补输出。

3.11 产生六步 PWM 输出

        当在一个通道上需要互补输出时,预装载位有 OCxM、CCxE 和 CCxNE。在发生 COM 换相事件时,这些预装载位被传送到影子寄存器位。这样你就可以预先设置好下一步骤配置,并在同一个时刻同时修更改所有通道的配置。COM 可以通过设置 TIMx_EGR 寄存器的 COM 位由软件产生,或在TRGI 上升沿由硬件产生。

        当发生 COM 事件时会设置一个标志位(TIMx_SR 寄存器中的 COMIF 位),这时如果已设置了TIMx_DIER 寄存器的 COMIE 位,则产生一个中断;如果已设置了 TIMx_DIER 寄存器的 COMDE 位,则产生一个 DMA 请求。

        下图显示当发生 COM 事件时,三种不同配置下 OCx 和 OCxN 输出:

3.12 单脉冲模式

        单脉冲模式(OPM)是前述众多模式的一个特例。这种模式允许计数器响应一个激励,并在一个程序可控的延时之后产生一个脉宽可程序控制的脉冲。可以通过从模式控制器启动计数器,在输出比较模式或者 PWM 模式下产生波形。设置 TIMx_CR1寄存器中的 OPM 位将选择单脉冲模式,这样可以让计数器自动地在产生下一个更新事件 UEV 时停止。

        仅当比较值与计数器的初始值不同时,才能产生一个脉冲。启动之前(当定时器正在等待触发),

须如下配置:

向上计数方式:计数器 CNT<CCRx≤ARR(特别地,0<CCRx),

向下计数方式:计数器 CNT>CCRx。

        例如,你需要在从 TI2 输入脚上检测到一个上升沿开始,延迟 tDELAY 之后,在 OC1 上产生一个长度为 tPULSE 的正脉冲。

假定 TI2FP2 作为触发 1:

置 TIMx_CCMR1 寄存器中的 CC2S=01,把 TI2FP2 映像到 TI2。

置 TIMx_CCER 寄存器中的 CC2P=0,使 TI2FP2 能够检测上升沿。

置 TIMx_SMCR 寄存器中的 TS=110,TI2FP2 作为从模式控制器的触发(TRGI)。

置 TIMx_SMCR 寄存器中的 SMS=110(触发模式),TI2FP2 被用来启动计数器。OPM 的波形由写入比较寄存器的数值决定(要考虑时钟频率和计数器预分频器)

tDELAY 由 TIMx_CCR1 寄存器中的值定义。

tPULSE 由自动装载值和比较值之间的差值定义(TIMx_ARR-TIMx_CCR1)。

        假定当发生比较匹配时要产生从 0 到 1 的波形,当计数器达到预装载值时要产生一个从 1 到0 的波形;首先要置 TIMx_CCMR1 寄存器的 OC1M=111,进入 PWM 模式 2;根据需要有选择地使能预装载寄存器:置 TIMx_CCMR1 中的 OC1PE=1 和 TIMx_CR1 寄存器中的 ARPE;然后在 TIMx_CCR1 寄存器中填写比较值,在 TIMx_ARR 寄存器中填写自动装载值,设置 UG 位来产生一个更新事件,然后等待在 TI2 上的一个外部触发事件。本例中,CC1P=0。

        在这个例子中,TIMx_CR1 寄存器中的 DIR 和 CMS 位应该置低。因为只需要一个脉冲,所以必须设置 TIMx_CR1 寄存器中的 OPM=1,在下一个更新事件(当计数器从自动装载值翻转到 0)时停止计数。

特殊情况:OCx 快速使能:

        在单脉冲模式下,在 TIx 输入脚的边沿检测逻辑设置 CEN 位以启动计数器。然后计数器和比较值间的比较操作产生了输出的转换。但是这些操作需要一定的时钟周期,因此它限制了可得到的最小延时 tDELAY。如果要以最小延时输出波形,可以设置 TIMx_CCMRx 寄存器中的 OCxFE 位;此时 OCxREF(和 OCx)直接响应激励而不再依赖比较的结果,输出的波形与比较匹配时的波形一样。OCxFE 只在通道配置为 PWM1 和 PWM2 模式时起作用。

3.13 编码器接口模式

        选择编码器接口模式的方法是:如果计数器只在 TI2 的边沿计数,则置 TIMx_SMCR 寄存器中的SMS=001;如果只在 TI1 边沿计数,则置 SMS=010;如果计数器同时在 TI1 和 TI2 边沿计数,则置SMS=011。

        通过设置 TIMx_CCER 寄存器中的 CC1P 和 CC2P 位,可以选择 TI1 和 TI2 极性;如果需要,还可以对输入滤波器编程。

        两个输入 TI1 和 TI2 被用来作为增量编码器的接口。参看表 71,假定计数器已经启动(TIMx_CR1 寄存器中的 CEN=1),则计数器由每次在 TI1FP1 或 TI2FP2 上的有效跳变驱动。TI1FP1 和 TI2FP2 是TI1 和 TI2 在通过输入滤波器和极性控制后的信号;如果没有滤波和变相,则 TI1FP1=TI1,TI2FP2=TI2。根据两个输入信号的跳变顺序,产生了计数脉冲和方向信号。依据两个输入信号的跳变顺序,计数器向上或向下计数,同时硬件对 TIMx_CR1 寄存器的 DIR 位进行相应的设置。不管计数器是依靠 TI1 计数、依靠 TI2 计数或者同时依靠 TI1 和 TI2 计数,在任一输入端(TI1 或者 TI2)的跳变都会重新计算 DIR 位。

        编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟。这意味着计数器只在 0 到TIMx_ARR 寄存器的自动装载值之间连续计数(根据方向,或是 0 到 ARR 计数,或是 ARR 到 0 计数)。所以在开始计数之前必须配置 TIMx_ARR;同样,捕获器、比较器、预分频器、重复计数器、触发输出特性等仍工作如常。编码器模式和外部时钟模式 2 不兼容,因此不能同时操作。在这个模式下,计数器依照增量编码器的速度和方向被自动的修改,因此计数器的内容始终指示着编码器的位置。计数方向与相连的传感器旋转的方向对应。下表列出了所有可能的组合,假设TI1 和 TI2 不同时变换。

有效边沿

相对信号的电平(TI1FP1 对应 TI2, TI2FP2 对应 TI1)

TI1FP1 信号

TI2FP2 信号

上升

下降

上升

下降

仅在 TI1 计数

向下计数

向上计数

不计数

不计数

向上计数

向下计数

不计数

不计数

仅在 TI2 计数

不计数

不计数

向上计数

向下计数

不计数

不计数

向下计数

向上计数

在 TI1 和 TI2 上计数

向下计数

向上计数

向上计数

向下计数

向上计数

向下计数

向下计数

向上计数

        一个外部的增量编码器可以直接与 MCU 连接而不需要外部接口逻辑。但是,一般会使用比较器将编码器的差动输出转换到数字信号,这大大增加了抗噪声干扰能力。编码器输出的第三个信号表示机械零点,可以把它连接到一个外部中断输入并触发一个计数器复位。

        下图是一个计数器操作的实例,显示了计数信号的产生和方向控制。它还显示了当选择了双边沿时,输入抖动是如何被抑制的;抖动能会在传感器的位置靠近一个转换点时产生。在这个例子中,我们假定配置如下:

CC1S='01'(TIMx_CCMR1 寄存器,IC1FP1 映射到 TI1)

CC2S='01'(TIMx_CCMR2 寄存器,IC2FP2 映射到 TI2)

CC1P='0'(TIMx_CCER 寄存器,IC1FP1 不反相,IC1FP1=TI1)

CC2P='0'(TIMx_CCER 寄存器,IC2FP2 不反相,IC2FP2=TI2)

SMS='011'(TIMx_SMCR 寄存器,所有的输入均在上升沿和下降沿有效).

CEN='1'(TIMx_CR1 寄存器,计数器使能)

编码器模式下的计数器操作实例如下:

下图为当 IC1FP1 极性反相时计数器的操作实例(CC1P='1',其他配置与上例相同):

        当定时器配置成编码器接口模式时,提供传感器当前位置的信息。使用第二个配置在捕获模式的定时器,可以测量两个编码器事件的间隔,获得动态的信息(速度,加速度,减速度)。指示机械零点的编码器输出可被用做此目的。根据两个事件间的间隔,可以按照固定的时间读出计数器。如果可能的话,你可以把计数器的值锁存到第三个输入捕获寄存器(捕获信号必须是周期的并且可以由另一个定时器产生);也可以通过一个由实时时钟产生的 DMA 请求来读取它的值。

3.14 定时器输入异或功能

        TIMx_CR2 寄存器中的 TI1S 位,允许通道 1 的输入滤波器连接到一个异或门的输出端,异或门的 3个输入端为 TIMx_CH1、TIMx_CH2 和 TIMx_CH3。

        异或输出能够被用于所有定时器的输入功能,如触发或输入捕获。下节 23.3.18 给出了此特性用于连接霍尔传感器的例子。

3.15 与霍尔传感器的接口

        使用高级控制定时器(TIM1 或 TIM8)产生 PWM 信号驱动马达时,可以用另一个通用 TIMx(TIM2、TIM3、TIM4 或 TIM5)定时器作为“接口定时器”来连接霍尔传感器,3 个定时器输入脚(CC1、CC2、CC3)通过一个异或门连接到 TI1 输入通道(通过设置 TIMx_CR2 寄存器中的 TI1S 位来选择),“接口定时器”捕获这个信号。

        从模式控制器被配置于复位模式,从输入是 TI1F_ED。每当 3 个输入之一变化时,计数器从新从 0开始计数。这样产生一个由霍尔输入端的任何变化而触发的时间基准。

        “接口定时器”上的捕获/比较通道 1 配置为捕获模式,捕获信号为 TRC。捕获值反映了两个输入变化间的时间延迟,给出了马达速度的信息。

        “接口定时器”可以用来在输出模式产生一个脉冲,这个脉冲可以(通过触发一个 COM 事件)用于改变高级定时器 TIM1 或 TIM8 各个通道的属性,而高级控制定时器产生 PWM 信号驱动马达。因此“接口定时器”通道必须编程为在一个指定的延时(输出比较或 PWM 模式)之后产生一个正脉冲,这个脉冲通过 TRGO 输出被送到高级控制定时器 TIM1 或 TIM8。

        举例:霍尔输入连接到 TIMx 定时器,要求每次任一霍尔输入上发生变化之后的一个指定的时刻,改变高级控制定时器 TIMx 的 PWM 配置。

        置 TIMx_CR2 寄存器的 TI1S 位为'1',配置三个定时器输入逻辑或到 TI1 输入,时基编程:置 TIMx_ARR 为其最大值(计数器必须通过 TI1 的变化清零)。设置预分频器得到一个最大的计数器周期,它长于传感器上的两次变化的时间间隔。

        设置通道 1 为捕获模式(选中 TRC):置 TIMx_CCMR1 寄存器中 CC1S=01,如果需要,还可以设置数字滤波器。

        设置通道 2 为 PWM2 模式,并具有要求的延时:置 TIMx_CCMR1 寄存器中的 OC2M=111 和CC2S=00。

        选择 OC2REF 作为 TRGO 上的触发输出:置 TIMx_CR2 寄存器中的 MMS=101。在高级控制寄存器TIM1中,正确的ITR输入必须是触发器输入,定时器被编程为产生PWM信号,捕获/比较控制信号为预装载的(TIMx_CR2 寄存器中 CCPC=1),同时触发输入控制 COM 事件(TIMx_CR2 寄存器中 CCUS=1)。在一次 COM 事件后,写入下一步的 PWM 控制位(CCxE、OCxM),这可以在处理 OC2REF 上升沿的中断子程序里实现。下图显示了这个实例:

3.16 TIMx 定时器和外部触发的同步

        TIMx 定时器能够在多种模式下和一个外部的触发同步:复位模式、门控模式和触发模式。

从模式:复位模式

        在发生一个触发输入事件时,计数器和它的预分频器能够重新被初始化;同时,如果TIMx_CR1寄存器的 URS位为低,还产生一个更新事件 UEV;然后所有的预装载寄存器(TIMx_ARR,TIMx_CCRx)都被更新了。

        在以下的例子中,TI1 输入端的上升沿导致向上计数器被清零:

        配置通道 1 以检测 TI1 的上升沿。配置输入滤波器的带宽(在本例中,不需要任何滤波器,因此保持 IC1F=0000)。触发操作中不使用捕获预分频器,所以不需要配置。CC1S位只选择输入捕获源,即 TIMx_CCMR1 寄存器中 CC1S=01。置 TIMx_CCER 寄存器中 CC1P=0 以确定极性(只检测上升沿)。

        置 TIMx_SMCR 寄存器中 SMS=100,配置定时器为复位模式;置 TIMx_SMCR 寄存器中 TS=101,选择 TI1 作为输入源。

        置 TIMx_CR1 寄存器中 CEN=1,启动计数器。

        计数器开始依据内部时钟计数,然后正常运转直到 TI1 出现一个上升沿;此时,计数器被清零然后从 0 重新开始计数。同时,触发标志(TIMx_SR 寄存器中的 TIF 位)被设置,根据 TIMx_DIER 寄存器中 TIE(中断使能)位和 TDE(DMA 使能)位的设置,产生一个中断请求或一个 DMA 请求。

        下图显示当自动重装载寄存器 TIMx_ARR=0x36 时的动作。在 TI1 上升沿和计数器的实际复位之间的延时取决于 TI1 输入端的重同步电路:

从模式:门控模式

        按照选中的输入端电平使能计数器。在如下的例子中,计数器只在 TI1 为低时向上计数:

        配置通道 1 以检测 TI1 上的低电平。配置输入滤波器带宽(本例中,不需要滤波,所以保持IC1F=0000)。触发操作中不使用捕获预分频器,所以不需要配置。CC1S 位用于选择输入捕获源,置 TIMx_CCMR1 寄存器中 CC1S=01。置 TIMx_CCER 寄存器中 CC1P=1 以确定极性(只检测低电平)。

        置 TIMx_SMCR 寄存器中 SMS=101,配置定时器为门控模式;置 TIMx_SMCR 寄存器中 TS=101,选择 TI1 作为输入源。

        置 TIMx_CR1 寄存器中 CEN=1,启动计数器。在门控模式下,如果 CEN=0,则计数器不能启动,不论触发输入电平如何。

        只要 TI1 为低,计数器开始依据内部时钟计数,一旦 TI1 变高则停止计数。当计数器开始或停止时都设置 TIMx_SR 中的 TIF 标置。TI1 上升沿和计数器实际停止之间的延时取决于 TI1 输入端的重同步电路:

从模式:触发模式

        输入端上选中的事件使能计数器。在下面的例子中,计数器在 TI2 输入的上升沿开始向上计数:

        配置通道 2 检测 TI2 的上升沿。配置输入滤波器带宽(本例中,不需要任何滤波器,保持IC2F=0000)。触发操作中不使用捕获预分频器,不需要配置。CC2S 位只用于选择输入捕获源,置 TIMx_CCMR1 寄存器中 CC2S=01。置 TIMx_CCER 寄存器中 CC2P=1 以确定极性(只检测低电平)。

        置 TIMx_SMCR 寄存器中 SMS=110,配置定时器为触发模式;置 TIMx_SMCR 寄存器中 TS=110,选择 TI2 作为输入源。当 TI2 出现一个上升沿时,计数器开始在内部时钟驱动下计数,同时设置 TIF 标志。TI2 上升沿和计数器启动计数之间的延时,取决于 TI2 输入端的重同步电路:

从模式:外部时钟模式 2+触发模式

        外部时钟模式 2 可以与另一种从模式(外部时钟模式 1 和编码器模式除外)一起使用。这时,ETR 信号被用作外部时钟的输入,在复位模式、门控模式或触发模式可以选择另一个输入作为触发输入。不建议使用 TIMx_SMCR 寄存器的 TS 位选择 ETR 作为 TRGI。

        在下面的例子中,一旦在 TI1 上出现一个上升沿,计数器即在 ETR 的每一个上升沿向上计数一次:

1. 通过 TIMx_SMCR 寄存器配置外部触发输入电路:

  • ETF=0000:没有滤波
  • ETPS=00:不用预分频器
  • ETP=0:检测 ETR 的上升沿,置 ECE=1 使能外部时钟模式 2。

2. 按如下配置通道 1,检测 TI 的上升沿:

  • IC1F=0000:没有滤波
  • 触发操作中不使用捕获预分频器,不需要配置
  • 置 TIMx_CCMR1 寄存器中 CC1S=01,选择输入捕获源
  • 置 TIMx_CCER 寄存器中 CC1P=0 以确定极性(只检测上升沿)

3. 置 TIMx_SMCR 寄存器中 SMS=110,配置定时器为触发模式。置 TIMx_SMCR 寄存器中 TS=101,选择 TI1 作为输入源。当 TI1 上出现一个上升沿时,TIF 标志被设置,计数器开始在 ETR 的上升沿计数。ETR 信号的上升沿和计数器实际复位间的延时,取决于 ETRP 输入端的重同步电路。

5 定时器初始化结构体详解

        在标准库函数头文件w55mh32_tim.h中对定时器外设建立了四个初始化结构体,分别为时基初始化结构体TIM_TimeBaseInitTypeDef、 输出比较初始化结构体TIM_OCInitTypeDef、输入捕获初始化结构体TIM_ICInitTypeDef和断路和死区初始化结构体TIM_BDTRInitTypeDef, 高级控制定时器可以用到所有初始化结构体,通用定时器不能使用TIM_BDTRInitTypeDef结构体, 基本定时器只能使用时基结构体。接下来我们具体讲解下这四个结构体。

5.1 TIM_TimeBaseInitTypeDef

        时基结构体TIM_TimeBaseInitTypeDef用于定时器基础参数设置,与TIM_TimeBaseInit函数配合使用完成配置。

代码清单:高级定时器-1 定时器基本初始化结构体

typedef struct {
    uint16_t TIM_Prescaler;          // 预分频器
    uint16_t TIM_CounterMode;        // 计数模式
    uint32_t TIM_Period;             // 定时器周期
    uint16_t TIM_ClockDivision;      // 时钟分频
    uint8_t TIM_RepetitionCounter;   // 重复计算器
} TIM_TimeBaseInitTypeDef;

TIM_Prescaler: 定时器预分频器设置,时钟源经该预分频器才是定时器计数时钟CK_CNT,它设定PSC寄存器的值。 计算公式为:计数器时钟频率 (fCK_CNT) 等于 fCK_PSC / (PSC[15:0] + 1),可实现1至65536分频。

TIM_CounterMode: 定时器计数方式,可设置为向上计数、向下计数以及中心对齐。高级控制定时器允许选择任意一种。

TIM_Period: 定时器周期,实际就是设定自动重载寄存器ARR的值,ARR 为要装载到实际自动重载寄存器(即影子寄存器)的值,可设置范围为0至65535。

TIM_ClockDivision: 时钟分频,设置定时器时钟CK_INT频率与死区发生器以及数字滤波器采样时钟频率分频比。可以选择1、2、4分频。

TIM_RepetitionCounter: 重复计数器,只有8位,只存在于高级定时器。

5.2 TIM_OCInitTypeDef

        输出比较结构体TIM_OCInitTypeDef用于输出比较模式,与TIM_OCxInit函数配合使用完成指定定时器输出通道初始化配置。高级控制定时器有四个定时器通道,使用时都必须单独设置。

代码清单:高级定时器-2 定时器比较输出初始化结构体

typedef struct {
    uint16_t TIM_OCMode;        // 比较输出模式
    uint16_t TIM_OutputState;   // 比较输出使能
    uint16_t TIM_OutputNState;  // 比较互补输出使能
    uint32_t TIM_Pulse;         // 脉冲宽度
    uint16_t TIM_OCPolarity;    // 输出极性
    uint16_t TIM_OCNPolarity;   // 互补输出极性
    uint16_t TIM_OCIdleState;   // 空闲状态下比较输出状态
    uint16_t TIM_OCNIdleState;  // 空闲状态下比较互补输出状态
} TIM_OCInitTypeDef;
  1. TIM_OCMode: 比较输出模式选择,总共有八种,常用的为PWM1/PWM2。它设定CCMRx寄存器OCxM[2:0]位的值。
  2. TIM_OutputState: 比较输出使能,决定最终的输出比较信号OCx是否通过外部引脚输出。它设定TIMx_CCER寄存器CCxE/CCxNE位的值。
  3. TIM_OutputNState: 比较互补输出使能,决定OCx的互补信号OCxN是否通过外部引脚输出。它设定CCER寄存器CCxNE位的值。
  4. TIM_Pulse: 比较输出脉冲宽度,实际设定比较寄存器CCR的值,决定脉冲宽度。可设置范围为0至65535。
  5. TIM_OCPolarity: 比较输出极性,可选OCx为高电平有效或低电平有效。它决定着定时器通道有效电平。它设定CCER寄存器的CCxP位的值。
  6. TIM_OCNPolarity: 比较互补输出极性,可选OCxN为高电平有效或低电平有效。它设定TIMx_CCER寄存器的CCxNP位的值。
  7. TIM_OCIdleState: 空闲状态时通道输出电平设置,可选输出1或输出0,即在空闲状态(BDTR_MOE位为0)时,经过死区时间后定时器通道输出高电平或低电平。它设定CR2寄存器的OISx位的值。
  8. TIM_OCNIdleState: 空闲状态时互补通道输出电平设置,可选输出1或输出0,即在空闲状态(BDTR_MOE位为0)时,经过死区时间后定时器互补通道输出高电平或低电平, 设定值必须与TIM_OCIdleState相反。它设定是CR2寄存器的OISxN位的值。

5.3 TIM_ICInitTypeDef

        输入捕获结构体TIM_ICInitTypeDef用于输入捕获模式,与TIM_ICInit函数配合使用完成定时器输入通道初始化配置。 如果使用PWM输入模式需要与TIM_PWMIConfig函数配合使用完成定时器输入通道初始化配置。

代码清单:高级定时器 定时器输入捕获初始化结构体

typedef struct {
    uint16_t TIM_Channel;      // 输入通道选择
    uint16_t TIM_ICPolarity;   // 输入捕获触发选择
    uint16_t TIM_ICSelection;  // 输入捕获选择
    uint16_t TIM_ICPrescaler;  // 输入捕获预分频器
    uint16_t TIM_ICFilter;     // 输入捕获滤波器
} TIM_ICInitTypeDef;

TIM_Channel: 捕获通道ICx选择,可选TIM_Channel_1、 TIM_Channel_2、TIM_Channel_3或TIM_Channel_4四个通道。它设定CCMRx寄存器CCxS位 的值。

TIM_ICPolarity: 输入捕获边沿触发选择,可选上升沿触发、 下降沿触发或边沿跳变触发。它设定CCER寄存器CCxP位和CCxNP位的值。

TIM_ICSelection: 输入通道选择,捕获通道ICx的信号可来自三个输入通道,分别为TIM_ICSelection_DirectTI、 TIM_ICSelection_IndirectTI或TIM_ICSelection_TRC,具体的区别见下图,输入通道与捕获通道IC的映射图 。 如果是普通的输入捕获,4个通道都可以使用,如果是PWM输入则只能使用通道1和通道2。它设定CCRMx寄存器的CCxS[1:0]位的值。

TIM_ICPrescaler: 输入捕获通道预分频器,可设置1、2、4、8分频,它设定CCMRx寄存器的ICxPSC[1:0]位的值。如果需要捕获输入信号的每个有效边沿,则设置1分频即可。

TIM_ICFilter: 输入捕获滤波器设置,可选设置0x0至0x0F。它设定CCMRx寄存器ICxF[3:0]位的值。一般我们不使用滤波器,即设置为0。

5.4 TIM_BDTRInitTypeDef

        断路和死区结构体TIM_BDTRInitTypeDef用于断路和死区参数的设置,属于高级定时器专用,用于配置断路时通道输出状态,以及死区时间。 它与TIM_BDTRConfig函数配置使用完成参数配置。这个结构体的成员只对应BDTR这个寄存器,有关成员的具体使用配置请参考手册BDTR寄存器的详细描述。

代码清单:高级定时器-4 断路和死区初始化结构体

typedef struct {
    uint16_t TIM_OSSRState;        // 运行模式下的关闭状态选择
    uint16_t TIM_OSSIState;        // 空闲模式下的关闭状态选择
    uint16_t TIM_LOCKLevel;        // 锁定配置
    uint16_t TIM_DeadTime;         // 死区时间
    uint16_t TIM_Break;            // 断路输入使能控制
    uint16_t TIM_BreakPolarity;    // 断路输入极性
    uint16_t TIM_AutomaticOutput;  // 自动输出使能
} TIM_BDTRInitTypeDef;

  1. TIM_OSSRState: 运行模式下的关闭状态选择,它设定BDTR寄存器OSSR位的值。
  2. TIM_OSSIState: 空闲模式下的关闭状态选择,它设定BDTR寄存器OSSI位的值。
  3. TIM_LOCKLevel: 锁定级别配置, BDTR寄存器LOCK[1:0]位的值。
  4. TIM_DeadTime: 配置死区发生器,定义死区持续时间,可选设置范围为0x0至0xFF。它设定BDTR寄存器DTG[7:0]位的值。
  5. TIM_Break: 断路输入功能选择,可选使能或禁止。它设定BDTR寄存器BKE位的值。
  6. TIM_BreakPolarity: 断路输入通道BRK极性选择,可选高电平有效或低电平有效。它设定BDTR寄存器BKP位的值。
  7. TIM_AutomaticOutput: 自动输出使能,可选使能或禁止,它设定BDTR寄存器AOE位的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值