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时,使用内部时钟。
时钟信号输入引脚:
时钟信号来自于定时器的输入通道,共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配置。
时钟信号输入引脚:
时钟信号来自于定时器的输入通道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位有效。
输入时钟CK_PSC,输出时钟CK_CNT。
输出时钟CK_CNT用来驱动计数器CNT计数。
设置预分频器PSC的值可得到不同的CK_CNT。
fCK_CNT=fCK_PSC/(PSC[15:0]+1),实现1至65536分频。
三种计数模式:
递增计数模式、递减计数模式、递增/递减(中心对齐)计数模式。
递增计数模式:
计数器从0开始计数,每来一个CK_CNT脉冲,计数器加1,直到计数器的值=自动重载寄存器 ARR的值,计数器从0开始计数并生成计数器上溢事件。
若禁用重复计数器,计数器生成上溢事件时生成更新事件(UEV)。
若使能重复计数器,生成一次上溢事件,重复计数器内容减1,直到重复计数器内容=0 ,才会生成更新事件。
递减计数模式:
从自动重载寄存器ARR的值开始计数。
每来一个CK_CNT脉冲,计数器减1,直到计数器值=0。
然后,计数器又从自动重载寄存器ARR的值开始递减,并生成计数器下溢事件。
若禁用重复计数器,计数器生成下溢事件时生成更新事件(UEV)。
若使能重复计数器,生成一次下溢事件,重复计数器内容减1,直到重复计数器内容=0 ,才会生成更新事件。
递增/递减(中心对齐)计数模式:
从0开始递增计数,直到计数值=(ARR-1)值,生成计数器上溢事件。然后,从ARR值开始递减计数,直到计数值=1,生成计数器下溢事件。
然后又从0开始计数,循环。
每次发生上溢、下溢事件,都会生成更新事件。
存放与计数器CNT比较的值。
两个值相等就递减重复计数器。
TIMx_CR1寄存器的ARPE位,控制自动重载影子寄存器功能。
ARPE位=1,自动重载影子寄存器有效。在事件更新时,才把TIMx_ARR值赋给影子寄存器。
ARPE位=0,修改TIMx_ARR值马上有效。
基本/通用定时器,发生上/下溢事件时,直接生成更新事件。
高级控制定时器多出了重复计数器。
定时器发生上溢、下溢事件时,递减重复计数器的值。
当重复计数器为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输入模式测量脉宽和频率。
该模式是输入捕获的特例,只能使用通道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 输出,就是对外输出脉宽(即占空比)可调的方波信号,信号频率由自动重装寄 存器ARR的值决定,占空比由比较寄存器CCR的值决定。
PWM模式分为两种,PWM1、PWM2。
以PWM1模式为例。
以计数器CNT计数的不同方向,分为边沿对齐模式、中心对齐模式。
PWM信号主要用来控制电机,一般的电机控制用的是边沿对齐模式,FOC电机一般用中心对齐模式。
下面分析这两种模式信号波形的区别。
边沿对齐模式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开始计数,并生成计数器上溢事件,循环往复。
中心对齐模式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。