定时器功能简介:
相对于SysTick这种一般只用于系统时钟的计时定时器,STM32的定时器外设功能是非常强大的.(仅在《STM32参考手册》中对定时器的介绍就已经占了100多页)
STM32一共有8个都为16位的定时器.其中TIM6,TIM7是基本定时器,TIM2,TIM3,TIM4,TIM5是通用定时器,TIM1和TIM8是高级定时器,这些定时器使STM32具有定时,信号的频率测量,信号的PWM测量,PWM输出,三相6步点击控制以及编码器接口等功能,都是专门为工控领域量身订做的.
定时器工作分析:
基本定时器:
基本定时器TIM6和TIM7,这两个定时器只具备最基本的定时功能,就是累加的时钟脉冲数超过预定值时,能触发终端或触发DMA请求,由于在芯片内部与DAC外设相连,可通过触发输出驱动DAC.也可以作为其他通用定时器的时钟基准.
这两个基本定时器使用的时钟源都是 TIMxCLK,时钟源经过 PSC 预分频器输入至脉冲计数器(TIMx_CNT),基本定时器只能工作在向上计数模式,在重载寄存器(TIMx_ARR)保存的是定时器的溢出值。
工作时,脉冲计数器 TIMx_CNT 由时钟触发进行计数,当 TIMx_CNT 的计数值 X 等于重载寄存器 TIMx_ARR 中保存的数值 N 时,产生溢出事件,可触发中断或 DMA 请求。然后 TIMx_CNT 的值重新被置为 0,重新向上计数。
通用定时器:
通用定时器 TIM2~TIM5, 就比基本定时器复杂得多了。除了基本的定时,它主要用在测量输入脉冲的频率、脉冲宽与输出 PWM 脉冲的场合,还具有编码器的接口.
通用定时器的基本计时功能呢个和基本定时器的工作方式是一样的,同样把时钟源经过预分频器输出到脉冲计数器TIMx_CNT累加,溢出时产生中断或DMA请求.
而通用定时器比基本定时器多出的强大功能,就是因为通用定时器多出了一种寄存器–捕获/比较寄存器,TIMx_CCR(capture/compare register),它在输入时被用于捕获(存储)输入脉冲在电平发生翻转时,脉冲计数器TIMx_CNT的当前计数值,从而实现脉冲的频率测量.在输出时被用来存储一个脉冲数值,把这个数值用于脉冲计数TIMx_CNT的当前计数值进行比较,根据比较结果进行不同的电平输出.
举个例子:
PWM输出过程
通用定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出,PWM输出功能时,捕获/比较寄存器 TIMx_CCR被用作比较功能(以下称为比较寄存器)
若配置脉冲计数器 TIMx_CNT为向上计数,而重载寄存器 TIMx_ARR被配置为N,即 TIMx_CNT的当前计数值数值 X 在 TIMxCLK 时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。
而在 TIMxCNT 计数的同时,TIMxCNT 的计数值 X 会与比较寄存器TIMx_CCR 预先存储了的数值 A 进行比较,当脉冲计数器 TIMx_CNT 的数值 X小于比较寄存器 TIMx_CCR 的值 A 时,输出高电平(或低电平),相反地,当脉冲计数器的数值 X 大于或等于比较寄存器的值 A 时,输出低电平(或高电平)。
一直循环,得到的输出脉冲周期就为重载寄存器 TIMx_ARR 存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器 TIMx_CCR 的值A 乘以触发脉冲的时钟周期,即输出 PWM 的占空比为A/(N+1).
图中的为重载寄存器TIMx_ARR被配置为N=8,向上计数,比较寄存器TIMx_CCR的值被设置为A=4、8、大于8、等于0时的输出时序图.图中OCxREF即为GPIO引脚的输出时序、CCxIF为触发中断的时序.
PS:
CCRx = 4(累计数小于4输出高,大于等于4输出低)
CCRx > 8(累计数大于8,输出低,实际上不可能,因为N设置为8)
测量PWM输入过程:
而当定时器被配置为输入功能时,可以用于检测输入到 GPIO 引脚的信号(频率检测、输入 PWM 检测),此时捕获/比较寄存器TIMx_CCR被用作捕获功能,(以下称为捕获寄存器)。
按照上面的时序图来分析 PWM 输入脉冲宽检测的工作过程:要测量的PWM 脉冲通过 GPIO 引脚输入到定时器的脉冲检测通道,其时序为图中的TI1。把脉冲计数器 TIMx_CNT 配置为向上计数,重载计数器重载寄存器TIMx_ARR 的 N 值配置为足够大.在输入脉冲 TI1 的上升沿到达时,触发 IC1 和 IC2 输入捕获中断,这时把脉冲计数器 TIMx_CNT 的计数值复位为 0,于是 TIMx_CNT 的计数值 X 在TIMxCLK 的驱动下从 0 开始不断累加,直到 TI1 出现下降沿,触发 IC2 捕获事件,此时捕获寄存器 TIMx_CCR2 把脉冲计数器 TIMx_CNT 的当前值 2 存储起来,而 TIMx_CNT 继续累加,直到 TI1 出现第二个上升沿,触发了 IC1 捕获事件,此时 TIMx_CNT 的当前计数值 4 被保存到 TIMx_CCR1。
很明显 TIMx_CCR1(加 1)的值乘以 TIMxCLK 的周期,即为待检测的 PWM输入脉冲周期,TIMx_CCR2(加 1)的值乘以 TIMxCLK 的周期,就是待检测的PWM 输入脉冲的高电平时间,有了这两个数值,就可以计算出 PWM 脉冲的频率、占空比了。
定时器的时钟源:
从时钟源来说,通用定时器比基本定时器多了一个选择,因为它可以选择使用外部脉冲作为定时器的时钟源,使用外部时钟源时,要使用寄存器进行触发边沿,滤波器带宽的配置.如果选择内部时钟源的话和基本定时器是一样的,也是TIMxCLK.(要注意,所有定时器(包括基本,通用,高级)使用内部时钟时,定时器的时钟源都被称为 TIMxCLK,但 TIMxCLK的时钟来源并不一样,见下图)
TIM2~7,也就是基本定时器和通用定时器,TIMxCLK 的时钟来源是 APB1预分频器的输出,当APB1的分频系数为1时,则TIM2~7的TIMxCLK直接等于该APB1预分频器的输出,而APB1的分频系数不为1时,TIM2~7的TIMxCLK 则为APB1预分频器输出的2倍。
例如:
常见的配置中,AHB=72MHz,而 APB1 预分频器的分频系数被配置为2,则 PCK1 刚好达到最大值 36MHz,而此时 APB1 的分频系数不为 1,则TIM2~TIM7 的时钟 TIMxCLK = (AHB/2)*2 = 72MHz。
TIM1 和 TIM8 这两个高级的定时器,TIMxCLK 的时钟来源则是 APB2 预分频器的输出,同样它也根据分频系数分为两种情况。
常见的配置中 AHB=72MHz,APB2 预分频器的分频系数被配置为 1,此时PCKL2 刚好达到最大值 72MHz,而 TIMxCLK 则直接等于 APB2 分频器的输出,即 TIM1 和 TIM8 的时钟 TIMxCLK=AHB=72MHz。
PS:
虽然这种配置下最终 TIMxCLK 的时钟频率相等,但必须清楚实质上它们的时钟来源的是有区别的.(还要强调的是:TIMxCLK 是定时器内部的时钟源,但在时钟输出到脉冲计数器 TIMx_CNT 前,还经过一个预分频器 PSC,最终用于驱动脉冲计数器 TIMx_CNT 的时钟频率为根据预分频器PSC的配置而定)。
高级定时器:
TIM1和TIM8是两个高级定时器,它们具有基本、通用定时器的所有功能,还具有三相六步电机的接口,刹车功能(break function)及用于 PWM 驱动电路的死区时间控制等,使得它非常适合于电机的控制。
死区控制:
根据图可以知道,相比通用定时器,高级定时器多出了BRK,DTG两个结构,所以具有了死区时间的控制功能.
在H桥,三相桥的 PWM 驱动电路中,上下两个桥臂的 PWM 驱动信号是互补的,即上下桥臂轮流导通,但实际上为了防止出现上下两个臂同时导通(会造成短路),在上下两臂切换时留一小段时间,上下臂都施加关断信号,这个上下臂都关断的时间称为死区时间.
STM32 的高级定时器可以配置出输出互补的 PWM 信号,并且在这个 PWM信号中加入死区时间,为电机的控制提供了极大的便利。
OCxREF为参考信号(可理解为原信号),OCx和OCxN为定时器通过GPIO引脚输出的PWM互补信号。
如果不加入死区时间(图中的延时),当 OCxREF 出现下降沿,OCx 同时输出下降沿,OCxN则同时输出相反的上升沿,即这三个信号的跳变是同时的。
加入死区时间后,当 OCxREF 出现下降沿,OCx 同时输出下降沿,但OCxN 则过了一小段延迟再输出上升沿,OCxREF 出现上升沿后,OCx 要经过一段延时再输出上升沿。假如 OCx、 OCxN 分别控制上、下桥臂,有了延迟后,就不容易出现上、下桥臂同时导通的情况。
PS:
这个延迟时间是根据PWM信号驱动的电子器件特性相关的,从事工控领域的对此应该比较熟悉。在保证不出现短路的情况下,死区事件越短越好
PS:
后续附上实例.