嵌入式——定时器(2)PWM
定时器
目录
一. 通用定时器概述(F1)(TIM2/TIM3 /TIM4 /TIM5)
一. 通用定时器概述(F1)(TIM2/TIM3 /TIM4 /TIM5)
1. 介绍
通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。
2. 特性
(1)16位递增、递减、中心对齐计数器(计数值:0~65535)
(2)16位预分频器(分频系数:1~65536)
(3)可用于触发DAC、ADC
(4)在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求
(5)4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式
(6)使用外部信号控制定时器且可实现多个定时器互连的同步电路
(7)支持编码器和霍尔传感器电路等
3. 框图
4. 相关寄存器
(1)从模式控制寄存器(TIMx_SMCR)
位15(ETP):外部触发极性
位13:12(ETPS):外部触发预分频【 频率必须最多是CK_INT频率的1/4 】
位14(ECE):外部时钟使能位【 设置该位与选择外部时钟模式1并将TRGI连到ETRF(SMS=111和TS=111)具有相同功效 】
位11:8(ETF):外部触发滤波【 定义了对ETRP信号采样的频率和对ETRP数字滤波的带波器是一个事件计数器,它记录到N个事件后会产生一个输出的跳变(1/0) 】
位6:4(TS):触发选择
位2:0(SMS):从模式选择
(2)捕获/比较模式寄存器 1(TIMx_CCMR1)
位9:8(CC2S): 捕获/比较2选择
位7(OC1CE):输出比较1清0使能
位6:4(OC1M):输出比较1模式
位3(OC1PE):输出比较1预装载使能
位1:0(CC1S):捕获/比较1选择
位7:4(IC1F):输入捕获1滤波器( 定义了TI1输入的采样频率及数字滤波器长度)
(3)控制寄存器 1(TIMx_CR1)
位9:8(CKD):时钟分频因子【 定义在定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)使用的采样频率之间的分频比例 】
(4)捕获/比较使能寄存器(TIMx_CCER)
位5(CC2P):输入/捕获2输出极性
位1(CC1P):输入/捕获1输出极性
位0(CC1E):输入/捕获1输出使能
(5)控制寄存器 2(TIMx_CR2)
位6:4(MMS):主模式选择
(6)捕获/比较寄存器 1(TIMx_CCR1)
若CC1通道配置为输出:CCR1包含了装入当前捕获/比较1寄存器的值(预装载值)。如果在TIMx_CCMR1寄存器(OC1PE位)中末选择预裝载特性,写入的数值会被立即传输至当前寄存器中。否则只有当更新事件发生时,此预装载值才传输至当前捕获/比较1寄存器中。当前捕获/比较寄存器参与同计数器TIMx_CNT的比较,并在OC1端口上产生输出信号。
若CC1通道配置为输入:CCR1包含了由上一次输入捕获1事件(lC1)传输的计数器值。
二. 计数器时钟
1. 计数器时钟选择
(1)内部时钟——CK_INT(来自外设总线APB提供的时钟)
来自于芯片内部,等于72MHz。一般情况下,我们都是使用内部时钟。
配置方法:从模式控制寄存器TIMx_SMCR设置SMS=000
(2)外部时钟模式1——外部输入引脚(TIx)(来自定时器通道1或者通道2引脚的信号)
配置方法:设置TIMx_SMCR的SMS=111
①时钟信号输入引脚
当使用外部时钟模式1的时候,时钟信号来自于定时器的输入通道,共有4个,分别为TI1/2/3/4,即TIMx_CH1/2/3/4。具体使用哪一路信号,由TIM_CCMRx的位CCxS[1:0]配置(其中CCMR1控制T1/2,CCMR2控制TI3/4)。
②滤波器
如果来自外部的时钟信号的频率过高或者混杂有高频干扰信号的话,我们就需要使用滤波器对信号重新采样,来达到降频或者去除高频干扰的目的,具体由TIMx_CCMRx的位ICxF[3:0]配置。
③边缘检测器
边沿检测的信号来自于滤波器的输出,在成为触发信号之前,需要进行边沿检测,决定是上升沿有效还是下降沿有效,具体由TIMx_CCER的位CCxP和CCxNP配置。
④触发选择
当使用外部时钟模式1时,触发源有两个:滤波后的定时器输入1(TI1FP1)和滤波后的定时器输入2(TI2FP2),具体由TIMx_SMCR的位TS[2:0]配置。
⑤从模式选择
选定了触发源信号后,最后我们需把信号连接到TRGI引脚,让触发信号成为外部时钟模式1的输入,最终等于CK_PSC,然后驱动计数器CNT计数。具体配置TIMx_SMCR的位SMS[2:0]为000,即可选择外部时钟模式1。
⑥使能计数器
经过上面的5个步骤之后,最后我们只需使能计数器开始计数,外部时钟模式1的配置就算完成。使能计数器由TIMx_CR1的位CEN配置。
例:配置向上计数器在Tl2输入端的上升沿计数:
①配置TIMx_CCMR1寄存器CC2S=’01’,配置通道2检测T12输入的上升沿
②配置TIMx_CCMR1寄存器的IC2F,选择输入滤波器带宽(如果不需要滤波器,保持IC2F=0000)
③配置TIMx_CCER寄存器的CC2P='0’,选定上升沿极性
④配置TIMx_SMCR寄存器的SMS='111',选择定时器外部时钟模式1
⑤配置TIMx SMCR寄存器中的TS='110’,选定T12作为触发输入源
⑥设置TIMx_CR1寄存器的CEN=‘1’,启动计数器
【 当上升沿出现在TI2,计数器计数一次,且TIF标志被设置 】
(3)外部时钟模式2——外部触发输入(ETR)(来自可以复用为TIMx_ETR的IO引脚)
配置方法:设置TIMx_SMCR的ECE=1
①时钟信号输入引脚
当使用外部时钟模式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。
⑥使能计数器
经过上面的5个步骤之后,最后只需使能计数器开始计数,外部时钟模式2的配置就算完成。使能计数器由TIMx_CR1的位CEN配置。
例:配置在ETR下每2个上升沿计数一次的向上计数器:
①不需要滤波器,置TIMx_SMCR寄存器中的ETF=0000
②设置预分频器,置TIMX_SMCR寄存器中的ETPS=01
③设置在ETR的上升沿检测,置TIMxSMCR寄存器中的ETP=0
④开启外部时钟模式2,置TIMx_SMCR寄存器中的ECE=1
⑤启动计数器,置TIMx_CR1寄存器中的CEN=1
【 计数器在每2个ETR上升沿计数一次 】
(4)内部触发输入——ITRx(用于与芯片内部其它通用/高级定时器级联)
补:使用一个定时器作为另一个定时器的预分频器
三、输入捕获
1.理解
输入捕获可以对输入的信号的上升沿、下降沿或者双边沿进行捕获,常用的有测量输入信号的脉宽和测量PWM输入信号的频率和占空比这两种。
2.大概原理
当捕获到信号的跳变沿的时候,把计数器CNT的值锁存到捕获寄存器CCR中,把前后两次捕获到的CCR寄存器中的值相减,就可以算出脉宽或者频率。如果捕获的脉宽的时间长度超过你的捕获定时器的周期,就会发生溢出,这个我们需要做额外的处理。
3.结构分解
① 输入通道
需要被测量的信号从定时器的外部引脚TIMx_CH1/2/3/4进入,通常叫T1/2/3/4。
② 输入滤波器和边沿检测器
当输入的信号存在高频干扰的时候,需要对输入信号进行滤波,即进行重新采样。根据采样定律,采样的频率必须大于等于两倍的输入信号频率。比如输入的信号为1MHz,又存在高频的信号干扰,那么此时就很有必要进行滤波,可以设置采样频率为2MHz,这样可以在保证采样到有效信号的基础上把高于2MHz的高频干扰信号过滤掉。
滤波器的配置由CR1寄存器的位CKD[1:0]和CCMR1/2的位ICxF[3:0]控制。从ICxF位的描述可知,采样频率f可以由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]配置。
④ 预分频器
用于决定发生多少个事件时进行一次捕获。具体的由寄存器CCMRx的位ICxPSC配置,如果希望捕获信号的每一个边沿,则不分频。
⑤ 捕获寄存器
经过预分频器的信号ICxPS是最终被捕获的信号,当发生捕获时(第1次),计数器CNT的值会被锁存到捕获寄存器CCR中,还会产生CCxI中断,相应的中断位CCxIF(在SR寄存器中)会被置位,通过软件或者读取CCR中的值可以将CCxIF清0。如果发生第2次捕获(即重复捕获:CCR寄存器中己捕获到计数器值且CCxIF标志已置1),则捕获溢出标志位CCxOF(在SR寄存器中)会被置位,CCxOF只能通过软件清零。
4.应用
输入捕获一般应用在两个方面:脉冲跳变沿时间测量和PWM输入测量。
(1)测量脉宽或者频率
①测量频率
当捕获通道TIx上第1次出现上升沿时,发生第1次捕获,计数器CNT的值会被锁存到捕获寄存器CCR中,而且还会进入捕获中断,在中断服务程序中记录一次捕获(可以用一个标志变量来记录),并把捕获寄存器中的值读取到value1中。
当出现第2次上升沿时,发生第2次捕获,计数器CNT的值会再次被锁存到捕获寄存器CCR中,并再次进入捕获中断,在捕获中断中,把捕获寄存器的值读取到value3中,并清除捕获记录标志。
利用value3和value1的差值我们就可以算出信号的周期(频率)。
②测量脉宽
当捕获通道TIx上第1次出现上升沿时,发生第1次捕获,计数器CNT的值会被锁存到捕获寄存器CCR中,而且还会进入捕获中断,在中断服务程序中记录一次捕获(可以用一个标志变量来记录),并把捕获寄存器中的值读取到value1中。然后把捕获边沿改变为下降沿捕获,目的是捕获后面的下降沿。
当下降沿到来的时候,发生第2次捕获,计数器CNT的值会再次被锁存到捕获寄存器CCR中,并再次进入捕获中断,在捕获中断中,把捕获寄存器的值读取到value3中,并清除捕获记录标志。然后把捕获边沿设置为上升沿捕获。
利用value1可以求出脉冲宽度,利用value1与value3的比值可以求出占空比。在测量脉宽过程中需要来回的切换捕获边沿的极性,如果测量的脉宽时间比较长,定时器就会发生溢出,溢出的时候会产生更新中断,可以在中断里面对溢出进行记录处理。
(2)PWM输入模式(更简便的测量脉宽和频率)
当使用PWM输入模式的时候,因为一个输入通道(TIx)会占用两个捕获通道(ICx),所以一个定时器在使用PWM输入的时候最多只能使用两个输入通道(TIx)。
以输入通道TI1工作在PWM输入模式为例:
PWM信号由输入通道TI1进入,因为是PWM输入模式的缘故,信号会被分为两路:一路是TI1FP1,另外一路是TI2FP2。其中一路是周期,另一路是占空比,具体一路信号对应周期还是占空比,得从程序上设置哪一路信号作为触发输入,作为触发输入的哪一路信号对应的就是周期,另一路就是对应占空比。作为触发输入的那一路信号还需要设置极性,是上升沿还是下降沿捕获。一旦设置好触发输入的极性,另外一路硬件就会自动配置为相反的极性捕获,无需软件配置。
一句话概括就是:选定输入通道,确定触发信号,然后设置触发信号的极性即可。因为是PWM输入的缘故,另一路信号则由硬件配置,无需软件配置。使用PWM输入模式的时候必须将从模式控制器配置为复位模式(配置寄存器SMCR的位SMS[2:0]来实现),即当我们启动触发信号开始进行捕获的时候,同时把计数器CNT复位清零。
PWM信号由输入通道TI1进入,配置TI1FP1为触发信号,上升沿捕获。当上升沿的时候IC1和IC2同时捕获,计数器CNT清零,到了下降沿的时候,IC2捕获,此时计数器CNT的值被锁存到捕获寄存器CCR2中,到了下一个上升沿的时候,IC1捕获,计数器CNT的值被锁存到捕获寄存器CCR1中。
其中CCR2+1测量的是脉宽,CCR1+1测量的是周期。( 要注意的是:CCR2和CCR1的值在计算占空比和频率的时候都必须加1,因为计数器是从0开始计数的 )
从软件上来说,用PWM输入模式测量脉宽和周期更容易,付出的代价是需要占用两个捕获寄存器。
四、输出比较
1.理解
输出比较就是通过定时器的外部引脚对外输出控制信号,有冻结、将通道X(x=1,2,3,4)设置为( 匹配时输出有效电平、将通道X设置为匹配时输出无效电平、翻转、强制变为无效电平、强制变为有效电平、PWM1和PWM2 )8种模式,具体使用哪种模式由寄存器CCMRx的位OCxM[2:0]配置。其中PWM模式是输出比较中的特例,使用的也最多。
2.结构分解
① 比较寄存器
当计数器CNT的值与比较寄存器CCR的值相等的时候,输出参考信号OCxREF的信号的极性就会改变,其中OCxREF=1(高电平)称为有效电平,OCxREF=0(低电平)称为无效电平,并且会产生比较中断CCxI,相应的标志位CCxIF (SR寄存器中)会置位。然后OCxREF再经过一系列的控制之后就成为真正的输出信号OCx。
③输出引脚
输出比较的输出信号最终是通过定时器的外部IO来输出的,分别为CH1~4。
3. 详细结构(以通道1为例)
(1)捕获/比较通道1的主电路——输出部分
(2)捕获/比较通道1——输出部分
五. 通用定时器输出PWM模式
1. 介绍
【 ARR:自动重装载寄存器的值 CCRx:捕获/比较寄存器x的值 】
PWM模式1:
递增:CNT < CCRx,输出有效电平 CNT >= CCRx,输出无效电平
递减:CNT > CCRx,输出无效电平 CNT <= CCRx,输出有效电平
PWM模式2:
递增:CNT < CCRx,输出无效电平 CNT >= CCRx,输出有效电平
递减:CNT > CCRx,输出有效电平 CNT <= CCRx,输出无效电平
原理:当 CNT 值小于 CCRx 的时候,IO输出低电平(0),当CNT 值大于等于 CCRx 的时候,IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。改变 CCRx 的值,就可以改变 PWM输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率。
2. 模式的配置
(1)配置定时器基础工作参数:HAL_TIM_PWM_Init() (初始化定时器TIM3并设置ARR、PSC等参数)
(2)定时器PWM输出MSP初始化:HAL_TIM_PWM_MspInit() (配置NVIC、CLOCK、GPIO等)
(3)配置PWM模式/比较值等:HAL_TIM_PWM_ConfigChannel()(配置PWM模式、比较值、输出极性等)
(4)使能输出并启动计数器:HAL_TIM_PWM_Start() (使能开启输出并启动计数器)——开始产生PWM信号
(5)修改比较值控制占空比(可选):__HAL_TIM_SET_COMPARE() (修改比较值)
(6)使能通道预装载(可选):__HAL_TIM_ENABLE_OCxPRELOAD() (使能通道预装载)
(7) 参考代码
更多推荐
所有评论(0)