TIM — 定时器
定时器(Timer)最基本的功能就是定时了,比如定时发送 USART数据、定时采集 AD数据等等。如果把定时器与 GPIO 结合起来使用的话可以实现非常丰富的功能,可以测量输入信号的脉冲宽度,可以产生输出波形。定时器产生 PWM 控制电机状态是工业控制普遍方法,这方面知识非常有必要深入了解。
STM32F42xxx 系列控制器有 2 个高级控制定时器、10 个通用定时器和 2 个基本定时器,还有 2 个看门狗定时器。控制器上所有定时器都是彼此独立的,不共享任何资源。
基本定时器功能框图:
定时器要实现计数必须有个时钟源,基本定时器时钟只能来自内部时钟,高级控制定时器和通用定时器还可以选择外部时钟源或者直接来自其他定时器等待模式。我们可以通过 RCC专用时钟配置寄存器(RCC_DCKCFGR)的 TIMPRE 位设置所有定时器的时钟频率,我们一般设置该位为默认值 0,使得表 31-1中可选的最大定时器时钟为 90MHz,即基本定时器的内部时钟(CK_INT)频率为 90MHz。基本定时器只能使用内部时钟,当 TIM6 和 TIM7 控制寄存器 1(TIMx_CR1)的 CEN 位置 1 时,启动基本定时器,并且预分频器的时钟来源就是 CK_INT。对于高级控制定时器和通用定时器的时钟源可以来找控制器外部时钟、其他定时器等等模式,较为复杂,我们在相关章节会详细介绍。
定时器控制器控制实现定时器功能,控制定时器复位、使能、计数是其基础功能,基本定时器还专门用于 DAC转换触发。
基本定时器计数过程主要涉及到三个寄存器内容,分别是计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR),这三个寄存器都是 16位有效数字,即可设置值为 0 至 65535。
高级定时器:
高级控制定时器(TIM1 和 TIM8)和通用定时器在基本定时器的基础上引入了外部引脚,可以输入捕获和输出比较功能。高级控制定时器比通用定时器增加了可编程死区互补输出、重复计数器、带刹车(断路)功能,这些功能都是针对工业电机控制方面。
高级控制定时器时基单元包含一个 16位自动重载计数器 ARR,一个 16 位的计数器CNT,可向上/下计数,一个 16位可编程预分频器 PSC,预分频器时钟源有多种可选,有内部的时钟、外部时钟。还有一个 8位的重复计数器 RCR,这样最高可实现 40 位的可编程定时。
1. ①时钟源
高级控制定时器有四个时钟源可选:
内部时钟源 CK_INT
外部时钟模式 1:外部输入引脚 TIx(x=1,2,3,4)
外部时钟模式 2:外部触发输入 ETR
内部触发输入
内部时钟源(CK_INT)
内部时钟 CK_INT即来自于芯片内部,等于 180M,一般情况下,我们都是使用内部
时钟。当从模式控制寄存器 TIMx_SMCR的 SMS位等于 000 时,则使用内部时钟。
外部时钟模式 1
①:时钟信号输入引脚
当使用外部时钟模式 1 的时候,时钟信号来自于定时器的输入通道,总共有 4 个,分
别为 TI1/2/3/4,即 TIMx_CH1/2/3/4。具体使用哪一路信号,由 TIM_CCMx 的位 CCxS[1:0]
配置,其中 CCM1控制 TI1/2,CCM2 控制 TI3/4。
②:滤波器
如果来自外部的时钟信号的频率过高或者混杂有高频干扰信号的话,我们就需要使用
滤波器对 ETRP信号重新采样,来达到降频或者去除高频干扰的目的,具体的由
TIMx_CCMx 的位 ICxF[3:0]配置。
③:边沿检测
边沿检测的信号来自于滤波器的输出,在成为触发信号之前,需要进行边沿检测,决
定是上升沿有效还是下降沿有效,具体的由 TIMx_CCER 的位 CCxP和 CCxNP配置。
④:触发选择
当使用外部时钟模式 1 时,触发源有两个,一个是滤波后的定时器输入 1(TI1FP1)
和滤波后的定时器输入 2(TI2FP2),具体的由 TIMxSMCR的位 TS[2:0]配置。
⑤:从模式选择
选定了触发源信号后,最后我们需把信号连接到 TRGI引脚,让触发信号成为外部时
钟模式 1 的输入,最终等于 CK_PSC,然后驱动计数器 CNT计数。具体的配置
TIMx_SMCR的位 SMS[2:0]为 000 即可选择外部时钟模式 1。
⑥:使能计数器
经过上面的 5 个步骤之后,最后我们只需使能计数器开始计数,外部时钟模式 1的配
置就算完成。使能计数器由 TIMx_CR1 的位 CEN 配置。
外部时钟模式 2
①:时钟信号输入引脚
当使用外部时钟模式 2 的时候,时钟信号来自于定时器的特定输入通道 TIMx_ETR,
只有 1 个。
②: 外部触发极性
来自 ETR引脚输入的信号可以选择为上升沿或者下降沿有效,具体的由 TIMx_SMCR
的位 ETP配置。
③: 外部触发预分频器
由于 ETRP的信号的频率不能超过 TIMx_CLK(180M)的 1/4,当触发信号的频率很
高的情况下,就必须使用分频器来降频,具体的由 TIMx_SMCR的位 ETPS[1:0]配置。
④: 滤波器
如果 ETRP的信号的频率过高或者混杂有高频干扰信号的话,我们就需要使用滤波器
对 ETRP信号重新采样,来达到降频或者去除高频干扰的目的。具体的由 TIMx_SMCR的
位 ETF[3:0]配置,其中的 f DTS 是由内部时钟 CK_INT分频得到,具体的由 TIMx_CR1 的位
CKD[1:0]配置。
⑤:从模式选择
经过滤波器滤波的信号连接到 ETRF引脚后,触发信号成为外部时钟模式 2 的输入,
最终等于 CK_PSC,然后驱动计数器 CNT计数。具体的配置 TIMx_SMCR的位 ECE 为 1
即可选择外部时钟模式 2。
⑥:使能计数器
经过上面的 5 个步骤之后,最后我们只需使能计数器开始计数,外部时钟模式 2的配
置就算完成。使能计数器由 TIMx_CR1 的位 CEN 配置。
内部触发输入
内部触发输入是使用一个定时器作为另一个定时器的预分频器。硬件上高级控制定时
器和通用定时器在内部连接在一起,可以实现定时器同步或级联。主模式的定时器可以对
从模式定时器执行复位、启动、停止或提供时钟。高级控制定时器和部分通用定时器
(TIM2 至 TIM5)可以设置为主模式或从模式,TIM9 和 TIM10 可设置为从模式。
2. ②控制器
高级控制定时器控制器部分包括触发控制器、从模式控制器以及编码器接口。触发控
制器用来针对片内外设输出触发信号,比如为其它定时器提供时钟和触发 DAC/ADC 转换。
编码器接口专门针对编码器计数而设计。从模式控制器可以控制计数器复位、启动、递增/
递减、计数。
3. ③时基单元
高级控制定时器时基单元包括四个寄存器,分别是计数器寄存器(CNT)、预分频器寄
存器(PSC)、自动重载寄存器(ARR)和重复计数器寄存器(RCR)。其中重复计数器 RCR是高
级定时器独有,通用和基本定时器没有。前面三个寄存器都是 16 位有效,TIMx_RCR寄存
器是 8 位有效。
器 预分频器 PSC
预分频器 PSC,有一个输入时钟 CK_PSC 和一个输出时钟 CK_CNT。输入时钟
CK_PSC 就是上面时钟源的输出,输出 CK_CNT则用来驱动计数器 CNT计数。通过设置
预分频器 PSC的值可以得到不同的 CK_CNT,实际计算为:f CK_CNT 等于
f CK_PSC /(PSC[15:0]+1),可以实现 1 至 65536 分频。
计数器 CNT
高级控制定时器的计数器有三种计数模式,分别为递增计数模式、递减计数模式和递
增/递减(中心对齐)计数模式。
(1) 递增计数模式下,计数器从 0 开始计数,每来一个 CK_CNT 脉冲计数器就增加 1,直
到计数器的值与自动重载寄存器 ARR值相等,然后计数器又从 0 开始计数并生成计数
器上溢事件,计数器总是如此循环计数。如果禁用重复计数器,在计数器生成上溢事
件就马上生成更新事件(UEV);如果使能重复计数器,每生成一次上溢事件重复计数
器内容就减 1,直到重复计数器内容为 0 时才会生成更新事件。
(2) 递减计数模式下,计数器从自动重载寄存器 ARR 值开始计数,每来一个 CK_CNT 脉
冲计数器就减 1,直到计数器值为 0,然后计数器又从自动重载寄存器 ARR 值开始递
减计数并生成计数器下溢事件,计数器总是如此循环计数。如果禁用重复计数器,在
计数器生成下溢事件就马上生成更新事件;如果使能重复计数器,每生成一次下溢事
件重复计数器内容就减 1,直到重复计数器内容为 0时才会生成更新事件。
(3) 中心对齐模式下,计数器从 0开始递增计数,直到计数值等于(ARR-1)值生成计数器上
溢事件,然后从 ARR值开始递减计数直到 1 生成计数器下溢事件。然后又从 0 开始计
数,如此循环。每次发生计数器上溢和下溢事件都会生成更新事件。
器 自动重载寄存器 ARR
自动重载寄存器 ARR用来存放与计数器 CNT比较的值,如果两个值相等就递减重复
计数器。可以通过 TIMx_CR1 寄存器的 ARPE 位控制自动重载影子寄存器功能,如果
ARPE 位置 1,自动重载影子寄存器有效,只有在事件更新时才把 TIMx_ARR值赋给影子
寄存器。如果 ARPE 位为 0,则修改 TIMx_ARR值马上有效。
器 重复计数器 RCR
在基本/通用定时器发生上/下溢事件时直接就生成更新事件,但对于高级控制定时器
却不是这样,高级控制定时器在硬件结构上多出了重复计数器,在定时器发生上溢或下溢
事件是递减重复计数器的值,只有当重复计数器为 0时才会生成更新事件。在发生 N+1 个
上溢或下溢事件(N 为 RCR的值)时产生更新事件。
4. ④输入捕获
输入捕获可以对输入的信号的上升沿,下降沿或者双边沿进行捕获,常用的有测量输
入信号的脉宽和测量 PWM 输入信号的频率和占空比这两种。
输入捕获的大概的原理就是,当捕获到信号的跳变沿的时候,把计数器 CNT的值锁存
到捕获寄存器 CCR中,把前后两次捕获到的 CCR寄存器中的值相减,就可以算出脉宽或
者频率。如果捕获的脉宽的时间长度超过你的捕获定时器的周期,就会发生溢出,这个我
们需要做额外的处理。
①输入通道
需要被测量的信号从定时器的外部引脚 TIMx_CH1/2/3/4 进入,通常叫 TI1/2/3/4,在后
面的捕获讲解中对于要被测量的信号我们都以 TIx 为标准叫法。
②输入滤波器和边沿检测器
当输入的信号存在高频干扰的时候,我们需要对输入信号进行滤波,即进行重新采样,
根据采样定律,采样的频率必须大于等于两倍的输入信号。比如输入的信号为 1M,又存
在高频的信号干扰,那么此时就很有必要进行滤波,我们可以设置采样频率为 2M,这样
可以在保证采样到有效信号的基础上把高于 2M的高频干扰信号过滤掉。
滤波器的配置由 CR1 寄存器的位 CKD[1:0]和 CCMR1/2 的位 ICxF[3:0]控制。从 ICxF
位的描述可知,采样频率 f SAMPLE 可以由 f CK_INT 和 f DTS 分频后的时钟提供,其中是 f CK_INT 内
部时钟,f DTS 是 f CK_INT 经过分频后得到的频率,分频因子由 CKD[1:0]决定,可以是不分频,
2 分频或者是 4 分频。
边沿检测器用来设置信号在捕获的时候是什么边沿有效,可以是上升沿,下降沿,或
者是双边沿,具体的由 CCER 寄存器的位 CCxP和 CCxNP决定。
③捕获通道
捕获通道就是图中的 IC1/2/3/4,每个捕获通道都有相对应的捕获寄存器 CCR1/2/3/4,
当发生捕获的时候,计数器 CNT的值就会被锁存到捕获寄存器中。
这里我们要搞清楚输入通道和捕获通道的区别,输入通道是用来输入信号的,捕获通
道是用来捕获输入信号的通道,一个输入通道的信号可以同时输入给两个捕获通道。比如
输入通道 TI1 的信号经过滤波边沿检测器之后的 TI1FP1 和 TI1FP2 可以进入到捕获通道
IC1 和 IC2,其实这就是我们后面要讲的 PWM输入捕获,只有一路输入信号(TI1)却占
用了两个捕获通道(IC1 和 IC2)。当只需要测量输入信号的脉宽时候,用一个捕获通道即
可。输入通道和捕获通道的映射关系具体由寄存器 CCMRx 的位 CCxS[1:0]配置。
④的预分频器
ICx 的输出信号会经过一个预分频器,用于决定发生多少个事件时进行一次捕获。具
体的由寄存器 CCMRx 的位 ICxPSC 配置,如果希望捕获信号的每一个边沿,则不分频。
⑤捕获寄存器
经过预分频器的信号 ICxPS是最终被捕获的信号,当发生捕获时(第一次),计数器
CNT的值会被锁存到捕获寄存器 CCR中,还会产生 CCxI中断,相应的中断位 CCxIF(在
SR寄存器中)会被置位,通过软件或者读取 CCR中的值可以将 CCxIF清 0。如果发生第
二次捕获(即重复捕获:CCR 寄存器中已捕获到计数器值且 CCxIF 标志已置 1),则捕获
溢出标志位 CCxOF(在 SR寄存器中)会被置位,CCxOF只能通过软件清零。
5. ⑤输出比较
输出比较就是通过定时器的外部引脚对外输出控制信号,有冻结、将通道 X(x=1,2,3,4)设置为匹配时输出有效电平、将通道 X设置为匹配时输出无效电平、翻转、强制变为无效电平、强制变为有效电平、PWM1和 PWM2 这八种模式,具体使用哪种模式由寄存器 CCMRx 的位 OCxM[2:0]配置。其中 PWM模式是输出比较中的特例,使用的也最多。
①比 较寄存器
当计数器 CNT的值跟比较寄存器 CCR的值相等的时候,输出参考信号 OCxREF的信号的极性就会改变,其中 OCxREF=1(高电平)称之为有效电平,OCxREF=0(低电平)称之为无效电平,并且会产生比较中断 CCxI,相应的标志位 CCxIF(SR寄存器中)会置位。然后 OCxREF再经过一系列的控制之后就成为真正的输出信号 OCx/OCxN。
②死区发生器
在生成的参考波形 OCxREF 的基础上,可以插入死区时间,用于生成两路互补的输出信号 OCx 和 OCxN,死区时间的大小具体由 BDTR寄存器的位 DTG[7:0]配置。死区时间的大小必须根据 与输出信号相连接的器件及其特性来调整。下面我们简单举例说明下带死区的
PWM信号的应用,我们以一个板桥驱动电路为例。
在这个半桥驱动电路中,Q1导通,Q2截止,此时我想让 Q1截止 Q2导通,肯定是要先让Q1截止一段时间之后,再等一段时间才让 Q2导通,那么这段等待的时间就称为死区时间,因为 Q1关闭需要时间(由 MOS管的工艺决定)。如果 Q1关闭之后,马上打开 Q2,那么此时一段时间内相当于 Q1和 Q2都导通了,这样电路会短路。
③输出控制
在输出比较的输出控制中,参考信号 OCxREF在经过死区发生器之后会产生两路带死区的互补信号 OCx_DT和 OCxN_DT(通道 1~3 才有互补信号,通道 4 没有,其余跟通道1~3 一样),这两路带死区的互补信号然后就进入输出控制电路,如果没有加入死区控制,那么进入输出控制电路的信号就直接是 OCxREF。
进入输出控制电路的信号会被分成两路,一路是原始信号,一路是被反向的信号,具体的由寄存器 CCER 的位 CCxP和 CCxNP控制。经过极性选择的信号是否由 OCx引脚输出到外部引脚 CHx/CHxN 则由寄存器 CCER 的位 CxE/CxNE 配置。
如果加入了断路(刹车)功能,则断路和死区寄存器 BDTR的 MOE、OSSI和 OSSR这三个位会共同影响输出的信号。
④输出引脚
输出比较的输出信号最终是通过定时器的外部 IO来输出的,分别为 CH1/2/3/4,其中前面三个通道还有互补的输出通道 CH1/2/3N。更加详细的 IO 说明还请查阅相关的数据手册。
6. ⑥断路功能
断路功能就是电机控制的刹车功能,使能断路功能时,根据相关控制位状态修改输出信号电平。在任何情况下,OCx 和 OCxN 输出都不能同时为有效电平,这关系到电机控制常用的 H桥电路结构原因。
断路源可以是时钟故障事件,由内部复位时钟控制器中的时钟安全系统(CSS)生成,也可以是外部断路输入 IO,两者是或运算关系。
系统复位启动都默认关闭断路功能,将断路和死区寄存器(TIMx_BDTR)的 BKE 为置 1,使能断路功能。可通过 TIMx_BDTR 寄存器的 BKP位设置设置断路输入引脚的有效电平,设置为 1 时输入 BRK为高电平有效,否则低电平有效。
发送断路时,将产生以下效果:
TIMx_BDTR 寄存器中主输出模式使能(MOE)位被清零,输出处于无效、空闲或
复位状态;
根据相关控制位状态控制输出通道引脚电平;当使能通道互补输出时,会根据情
况自动控制输出通道电平;
将 TIMx_SR 寄存器中的 BIF位置 1,并可产生中断和 DMA传输请求。
如果 TIMx_BDTR 寄存器中的 自动输出使能(AOE)位置 1,则 MOE位会在发生下
一个 UEV事件时自动再次置 1。
3 输入捕获应用
输入捕获一般应用在两个方面,一个方面是脉冲跳变沿时间测量,另一方面是 PWM输入测量
欢迎加入作者的小圈子
扫描下方左边二维码加入QQ交流群,扫描下方右边二维码关注个人微信公众号并,获取更多隐藏干货,QQ交流群:859800032 微信公众号:Crystal软件学堂
作者:Liu_Jing bilibili视频教程地址:https://space.bilibili.com/5782182 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在转载文章页面给出原文连接。 如果你觉得文章对你有所帮助,烦请点个推荐,你的支持是我更文的动力。 文中若有错误,请您务必指出,感谢给予我建议并让我提高的你。 |