代码改变世界

stm32高级定时器

2022-04-05 15:08  jym蒟蒻  阅读(1250)  评论(0编辑  收藏  举报

stm32高级定时器

高级定时器时基单元:

包含一个16位自动重装载寄存器 ARR

一个16位的计数器CNT,可向上/下计数

一个16位可编程预分频器PSC,预分频器时钟源有多种可选,有内部的时钟、外部时钟。

一个8位的重复计数器 RCR,最高可实现40位的可编程定时。

STM32F103ZET6的高级/通用定时器的IO分配:

在这里插入图片描述

高级控制定时器功能框图

在这里插入图片描述

时钟源

高级控制定时器有四个时钟源:

内部时钟源 CK_INT

外部时钟模式1:外部输入引脚TIx(x=1,2,3,4)

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

内部触发输入(ITRx)

内部时钟源

CK_INT来自于芯片内部,72M,

模式控制寄存器TIMx_SMCR的SMS位=000时,使用内部时钟。

外部时钟模式1

在这里插入图片描述

时钟信号输入引脚:

时钟信号来自于定时器的输入通道,共4个,分别为TI1/2/3/4,即TIMx_CH1/2/3/4。

使用哪一路信号由TIM_CCMRx的位CCxS[1:0]配置,CCMR1控制TI1/2,CCMR2控制TI3/4。

滤波器:

来自外部的时钟信号频率过高、混杂有高频干扰信号,需要用滤波器对信号重新采样,达到降频、去除高频干扰的目的。

由 TIMx_CCMRx 的位 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。

使能计数器:

使能计数器开始计数,外部时钟模式1的配置完成。

使能计数器由TIMx_CR1的位CEN配置。

外部时钟模式2

在这里插入图片描述

时钟信号输入引脚:

时钟信号来自于定时器的输入通道TIMx_ETR,仅有1个。

外部触发极性:

来自ETR引脚的输入信号可选择为上升沿或者下降沿有效。

由TIMx_SMCR位ETP配置。

外部触发预分频器:

ETRP信号的频率不能超过TIMx_CLK(72M)的1/4。

触发信号的频率很高的情况下,须使用分频器降频。

由TIMx_SMCR的位ETPS[1:0]配置。

滤波器:

ETRP信号的频率过高或、混杂有高频干扰信号,要用滤波器对ETRP信号重新采样。

由TIMx_SMCR位ETF[3:0]配置。

fDTS由内部时钟CK_INT分频得到,由TIMx_CR1位CKD[1:0]配置。

从模式选择:

经滤波器滤波的信号,连接到ETRF引脚,触发信号成为外部时钟模式2的输入。

最终等于 CK_PSC,驱动计数器CNT计数。

TIMx_SMCR的位ECE为1,即可选择外部时钟模式2。

接下来配置TIMx_CR1的位CEN,使能计数器开始计数,完成外部时钟模式2的配置。

内部触发输入

使用一个定时器作为另一个定时器的预分频器

高级控制定时器和通用定时器在内部连接在一起。

可实现定时器同步或级联。

主模式定时器可对从模式定时器执行复位、启动、停止、提供时钟。

控制器

包括触发控制器、从模式控制器、编码器接口。

触发控制器:

对片内外设输出触发信号,为其它定时器提供时钟、触发DAC/ADC转换。

从模式控制器:

控制计数器复位、启动、递增/递减、计数。

编码器接口:

编码器计数。

时基单元

在这里插入图片描述

时基单元包括四个寄存器:

计数器寄存器(CNT)、预分频器寄存器(PSC)、自动重载寄存器(ARR)、重复计数器寄存器(RCR)。前三个寄存器16位有效,TIMx_RCR寄存器8位有效。

预分频器PSC:

输入时钟CK_PSC,输出时钟CK_CNT。

输出时钟CK_CNT用来驱动计数器CNT计数。

设置预分频器PSC的值可得到不同的CK_CNT。

fCK_CNT=fCK_PSC/(PSC[15:0]+1),实现1至65536分频。

计数器CNT:

三种计数模式:

递增计数模式、递减计数模式、递增/递减(中心对齐)计数模式。

递增计数模式:

计数器从0开始计数,每来一个CK_CNT脉冲,计数器加1,直到计数器的值=自动重载寄存器 ARR的值,计数器从0开始计数并生成计数器上溢事件。

若禁用重复计数器,计数器生成上溢事件时生成更新事件(UEV)。

若使能重复计数器,生成一次上溢事件,重复计数器内容减1,直到重复计数器内容=0 ,才会生成更新事件。

递减计数模式:

从自动重载寄存器ARR的值开始计数。

每来一个CK_CNT脉冲,计数器减1,直到计数器值=0。

然后,计数器又从自动重载寄存器ARR的值开始递减,并生成计数器下溢事件。

若禁用重复计数器,计数器生成下溢事件时生成更新事件(UEV)。

若使能重复计数器,生成一次下溢事件,重复计数器内容减1,直到重复计数器内容=0 ,才会生成更新事件。

递增/递减(中心对齐)计数模式:

从0开始递增计数,直到计数值=(ARR-1)值,生成计数器上溢事件。然后,从ARR值开始递减计数,直到计数值=1,生成计数器下溢事件。

然后又从0开始计数,循环。

每次发生上溢、下溢事件,都会生成更新事件。

自动重载寄存器ARR:

存放与计数器CNT比较的值。

两个值相等就递减重复计数器。

TIMx_CR1寄存器的ARPE位,控制自动重载影子寄存器功能。

ARPE位=1,自动重载影子寄存器有效。在事件更新时,才把TIMx_ARR值赋给影子寄存器。

ARPE位=0,修改TIMx_ARR值马上有效。

重复计数器RCR:

基本/通用定时器,发生上/下溢事件时,直接生成更新事件。

高级控制定时器多出了重复计数器。

定时器发生上溢、下溢事件时,递减重复计数器的值。

当重复计数器为0时,才会生成更新事件。

发生N+1个上溢、下溢事件(N 为 RCR 的值)时,产生更新事件。

输入捕获

在这里插入图片描述

可以对输入的信号的上升沿、下降沿、双边沿进行捕获。

测量输入信号的脉宽、测量PWM输入信号的频率和占空比。

捕获到信号的跳变沿时,把计数器CNT的值锁存到捕获寄存器CCR中。

将前后两次捕获到的CCR寄存器中的值相减,可以算出脉宽或频率。

捕获的脉宽的时间长度超过捕获定时器的周期,会发生溢出。

输入通道

需要被测量的信号,从定时器外部引脚TIMx_CH1/2/3/4进入,通常叫TI1/2/3/4。

输入滤波器和边沿检测器

输入的信号存在高频干扰,需要对输入信号进行滤波,进行重新采样。

采样的频率必须大于等于两倍的输入信号。

输入信号为1M,设置采样频率为2M,可以在采样到有效信号的基础上,把高于2M的高频干扰信号过滤掉。

由CR1寄存器的位CKD[1:0]和CCMR1/2的位ICxF[3:0]配置滤波器。

采样频率fSAMPLE可以由fCK_INT和fDTS分频后的时钟提供。

fCK_INT是内部时钟,fDTS是fCK_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只能通过软件清零。

输出比较

在这里插入图片描述

通过定时器的外部引脚,对外输出控制信号。

有冻结、将通道X(x=1,2,3,4)设置为匹配时输出有效电平、匹配时输出无效电平、翻转、强制变为无效电平、强制变为有效电平、PWM1、PWM2八种模式。

具体使用哪种模式,由寄存器CCMRx的位OCxM[2:0]配置。

比较寄存器

计数器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都导通了,电路会短路。

所以需要死区时间。

带死区插入的互补输出,死区时间要根据MOS管的工艺来调节。

输出控制

在这里插入图片描述

参考信号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。

断路功能

断路功能是电机控制的刹车功能。

使能断路功能时,根据相关控制位状态,修改输出信号电平。

在任何情况下,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。

输入捕获应用

脉宽/频率测量示意图

在这里插入图片描述

测量频率

捕获通道TIx上出现上升沿时,发生第一次捕获。

计数器CNT的值,被锁存到捕获寄存器CCR中,进入捕获中断。

在中断服务程序中记录一次捕获(可以用一个标志变量来记录),并把捕获寄存器中的值读取到value1中。

当出现第二次上升沿时,发生第二次捕获。

计数器CNT的值,再次被锁存到捕获寄存器CCR中,再次进入捕获中断。

在捕获中断中,把捕获寄存器的值读取到value3中,清除捕获记录标志。

利用value3和value1的差值,可以算出信号的周期(频率)。

测量脉宽

当捕获通道TIx上出现上升沿时,发生第一次捕获。

计数器CNT的值,被锁存到捕获寄存器CCR中,进入捕获中断。

在中断服务程序中记录一次捕获(用一个标志变量来记录),并把捕获寄存器中的值读取到value1中。

然后,把捕获边沿改变为下降沿捕获,目的是捕获后面的下降沿。

当下降沿到来的时候,发生第二次捕获。

计数器CNT的值会再次被锁存到捕获寄存器CCR中,再次进入捕获中断。

在捕获中断中,把捕获寄存器的值读取到value3中,并清除捕获记录标志。

然后把捕获边沿设置为上升沿捕获。

在测量脉宽过程中,需要来回切换捕获边沿的极性。

如果测量的脉宽时间比较长,定时器就会发生溢出。

溢出的时候,会产生更新中断,可以在中断里面对溢出进行记录处理。

PWM输入模式

可以使用PWM输入模式测量脉宽和频率。

该模式是输入捕获的特例,只能使用通道1和通道2,通道3和通道4无法使用。

与上面只使用一个捕获寄存器测量脉宽和频率的方法相比,PWM输入模式需占用两个捕获寄存器。

在这里插入图片描述

使用PWM输入模式时,一个输入通道(TIx)会占用两个捕获通道(ICx),所以,一个定时器使用PWM输入的时候最多只能使用两个输入通道(TIx)。

以输入通道TI1工作在PWM输入模式为例:

PWM信号由输入通道TI1进入,因为是PWM输入模式,信号被分为两路。

一路是TI1FP1,另一路是TI2FP2。

其中一路是周期,另一路是占空比。

作为触发输入的那一路信号,对应的就是周期,另一路对应占空比。

作为触发输入的那一路信号,还需设置极性,上升沿还是下降沿捕获。

设置好触发输入的极性,另外一路硬件就会自动配置为相反的极性捕获,无需软件配置。

总之,选定输入通道,确定触发信号,设置触发信号的极性。

因为是PWM输入,另一路信号由硬件配置,无需软件配置。

当使用PWM输入模式时,必须将从模式控制器配置为复位模式(配置寄存器 SMCR 的位 SMS[2:0]来实现),当启动触发信号,开始进行捕获时,把计数器CNT复位清零。

PWM输入模式时序图如下。

在这里插入图片描述

PWM信号由输入通道TI1进入,配置TI1FP1为触发信号,上升沿捕获。

当上升沿的时候,IC1、IC2同时捕获,计数器CNT清零。

下降沿的时候,IC2捕获,计数器CNT的值,被锁存到捕获寄存器CCR2中,到了下一个上升沿的时候,IC1捕获,计数器CNT的值,被锁存到捕获寄存器CCR1中。

CCR2+1测量的是脉宽,CCR1+1测量的是周期。

CCR2和CCR1的值在计算占空比和频率时,都必须加1。

因为计数器是从0开始计数的。

从软件上来说,用PWM 输入模式测量脉宽和周期更容易,代价是需要占用两个捕获寄存器。

输出比较应用

输出比较模式共有8种,由寄存器CCMRx的位OCxM[2:0]配置。

PWM输出模式

PWM 输出,就是对外输出脉宽(即占空比)可调的方波信号,信号频率由自动重装寄 存器ARR的值决定,占空比由比较寄存器CCR的值决定。

PWM模式分为两种,PWM1、PWM2。

在这里插入图片描述

以PWM1模式为例。

以计数器CNT计数的不同方向,分为边沿对齐模式、中心对齐模式。

PWM信号主要用来控制电机,一般的电机控制用的是边沿对齐模式,FOC电机一般用中心对齐模式。

下面分析这两种模式信号波形的区别。

PWM边沿对齐模式

边沿对齐模式PWM1波形如下(ARR=8)

在这里插入图片描述

递增计数模式下,计数器从0计数到自动重装载值(TIMx_ARR寄存器的内容),然后重新从0开始计数,生成计数器上溢事件。

边沿对齐模式下,计数器CNT只工作在一种模式,递增或者递减模式。

这里以CNT工作在递增模式为例,上图,ARR=8,CCR=4,CNT从0开始计数.

当CNT<CCR,OCxREF为有效的高电平,同时,比较中断寄存器CCxIF置位。

CCR<=CNT<=ARR,OCxREF为无效的低电平。CNT又从0开始计数,并生成计数器上溢事件,循环往复。

PWM中心对齐模式

中心对齐模式PWM1波形如下(ARR=8)。
在这里插入图片描述

中心对齐模式,计数器CNT工作在递增/递减模式下。

开始时,计数器CNT从0开始,计数到自动重载值减1(ARR-1),生成计数器上溢事件;

然后从自动重载值开始,向下计数到1,生成计数器下溢事件。

然后从0开始重新计数。

上图,ARR=8,CCR=4。

第一阶段,计数器CNT工作在递增模式下,从0开始计数。

当CNT<CCR的值时,OCxREF为有效的高电平。

CCR<=CNT<ARR,OCxREF为无效的低电平。

第二阶段,计数器CNT工作在递减模式,从ARR的值开始递减。

CNT>CCR时,OCxREF为无效的低电平。

CCR=>CNT>=1时,OCxREF为有效的高电平。

把波形分为两个阶段,第一个阶段1,2是计数器CNT工作在递增模式的波形。

第二个阶段3,4是计数器CNT工作在递减模式的波形。

中心对齐模式下的波形特征:

1,3阶段的时间相等,2,4阶段的时间相等。

中心对齐模式又分为中心对齐模式1/2/3。

由寄存器CR1位CMS[1:0]配置。

区别在于中断标志位CCxIF置1的条件。

模式1在CNT递减计数时置1,模式2在CNT递增计数时置1,模式3在CNT递增和递减计数时都置1。