STM32-一文搞懂通用定时器捕获/比较通道

在前面文章《STM32-定时器系统原理》已经详细介绍了定时器的系统最基本的计数单元,这边文章来写定时器系统的两个主要应用单元——捕获/比较通道。

捕获和比较

捕获

什么是捕获

所谓捕获就是通过检测捕获通道上的边沿信号。在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCR)里面,完成一次捕获。

捕获的应用

STM32支持一下捕获模式:

  • 输入捕获模式
  • PWM输入模式

输入捕获模式可以用来测量脉冲宽度或者测量频率。下图是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中 t1~t2 时间,就是需要测量的高电平时间。

测量方法如下:首先设置定时器通道 x 为上升沿捕获,这样,t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并设置通道 x为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。这样,根据定时器的计数频率,我们就可以算出 t1~t2 的时间,从而得到高电平脉宽。

比较

什么是比较

所谓比较就是计数器的值和与装载的值进行比较。

比较的应用

STM32支持一下比较模式:

  • 强置输出模式
  • 输出比较模式
  • PWM模式
  • 单脉冲模式

最近本的应用就是PWM模式了!

上图是输出PWM的原理,假定定时器工作在向上计数 PWM模式,且当 CNT<CCRx 时,输出 0,当 CNT>=CCRx 时输出 1。当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率。

捕获/比较通道概述

捕获/比较通道与定时器密切相关,密不可分,水乳交融,使用不同的功能要使用到不同的寄存器,这里只列举与输入捕获、PWM相关的寄存器。如果使用到其他功能,详细的相关的寄存器在《STM32中/英文参考手册》的14.4章节。通用定时器框图如下所示,红色框是计数器部分,在计数器的基础上,还有下方的4个独立的捕获/比较通道,主要用于

  • 输入捕获
  • 输出比较
  • PWM生成(边缘或中间对齐模式) 
  • 单脉冲模式输出

每一个捕获/比较通道都是围绕着一个捕获/比较寄存器,包括捕获的输入部分(数字滤波、多路复用和预分频器),和输出部分(比较器和输出控制)。捕获/比较通道的的主电路如下图所示(通道1为例)

捕获/比较模块由一个预装载寄存器和一个影子寄存器组成。读写过程仅操作预装载寄存器。

在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。
在比较模式下,预装载寄存器的内容被复制到影子寄存器中,然后影子寄存器的内容和计数器进行比较。

输入通道

捕获/比较通道的输入通道1如下图所示。

输出通道

捕获/比较通道的输出通道1如下图所示。

捕获/比较相关寄存器

捕获/比较模式寄存器 1 (TIMx_CCMR1)

通道可用于输入(捕获模式)或输出(比较模式),通道的方向由相应的CCxS[1:0]定义。以CC1S[1:0]为例

CC1S[1:0]:捕获/比较1 选择,这2位定义通道的方向(输入/输出),及输入脚的选择:
00:CC1通道被配置为输出;
01:CC1通道被配置为输入,IC1映射在TI1上;
10:CC1通道被配置为输入,IC1映射在TI2上;
11:CC1通道被配置为输入,IC1映射在TRC上。此模式仅工作在内部触发器输入被选中时(由
TIMx_SMCR寄存器的TS位选择)。
注:CC1S仅在通道关闭时(TIMx_CCER寄存器的CC1E=’0’)才是可写的。

其中IC1和TI1的关系在上面系统图中可以看到,下图可见,IC1是可以接到TI1或TI2或TRC上的,这个位就是配置这里的!

该寄存器其它位的作用在输入和输出模式下不同,OCxx(第一行)描述了通道在输出模式下的功能,ICxx(第二行)描述了通道在输出模式下的功能。该寄存器是针对 2 个通道的配置,低八位[7:0]用于捕获/比较通道 1 的控制,而高八位[15:8]则用于捕获/比较通道 2 的控制。CCMR2 是用来控制通道 3 和通道 4

输入模式

每个通道的位相同,这里是看其中一个通道的相关位

f_{CKINT} 是定时器的输入频率,一般是72MHz。f_{DTS}是根据TIMx_CR1的CKD[1:0]的设置来确定,一般为00,f_{DTS}=f_{CKINT}

另外关于滤波器的长度要特别解释一下,我们知道边沿信号的跳变可能不是完美的。比如我们在处理按键的跳变信号的时候都有一个“消抖”的过程,而消抖有两种方式:1.等待稳定  2.数字滤波;第一种方式就是所谓的“延时消抖”,第二种方式就是在定时器中断的方式获取按键的状态(以采样周期T对按键状态进行采样),如果连续采集到N次按键的状态是“按下”的状态就认为是按下的状态,如果连续的N次采集中至少有一次不是“按下”的状态就不认为按键被按下,也就是说只有等按键按下之后的波形稳定之后才能被连续采集到N次“按下”状态,以此达到滤波的目的。

举个栗子:假设一个包含毛刺的上升沿跳变信号的采样如下(时间从左到右)

0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 

如果我们用N=4进行滤波的话,红色部分就会被认为没有上升沿跳变,绿色部分才被认为跳变!

0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 

如果用N=2进行滤波的话,红色部分会被认为没有上升沿跳变,绿色部分被认为有上升沿跳变!但是由于这个边沿信号抖动太厉害,N=2的滤波没能有效滤波,误认为有两次跳变!因此,对不同的跳变信号,要选用合适的滤波长度,滤波长度要能覆盖最长的边沿信号抖动!

0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 

输出模式

这三位定义了输出参考信号OC1REF的动作,而OC1REF决定了OC1的值。OC1REF是高电平有效,而OC1的有效电平取决于捕获/比较使能寄存器TIMx_CCER的CC1P位

共可以配置成 7 种模式,为110或111时为PWM模式。这两种 PWM 模式的区别就是输出电平的极性相反。其中有效电平可以设置为高电平有效或者低电平有效。

电路中的极性就是电压的方向,两个PWM的一个周期的电平正好相反(0和非0)就是极性相反。

输入捕获相关寄存器

需要用到的寄存器有:TIMx_ARR、TIMx_PSC、TIMx_CCMR1、TIMx_CCER、TIMx_DIER、TIMx_CR1、TIMx_CCR1

TIMx_ARR 和 TIMx_PSC用来设定时器x的自动重装载值和 TIMx 的时钟分频,在《STM32-定时器系统原理》中已经说到,TIMx_CCMR1和TIMx_CCMR2前文已经说到,不再赘述。

捕获/比较使能寄存器 (TIMx_CCER)

这个寄存器包含了4个通道,每个通道两个(CCxE和CCxP)的使能位。

以第一个通道为例

要使能输入捕获,必须设置 CC1E=0,而 CC1P 则根据自己的需要来配置。

DMA/中断使能寄存器 (TIMx_DIER)

CCxIE:允许捕获/比较x中断 (Capture/Compare 1 interrupt enable) 
0:禁止捕获/比较x中断;
1:允许捕获/比较x中断。
如果用到中断来处理捕获数据,必须开启通道 1 的捕获比较中断,即 CC1IE 设置为 1。

控制寄存器 1 (TIMx_CR1)

前文《STM32-定时器系统原理》介绍过这个寄存器,所有与定时器相关的应用都要通过置位它的最低位来使能定时器。

捕获/比较寄存器 1~4 (TIMx_CCR1~4)

这四个寄存器分别是四个通道的,功能相似!这里仅以通道1的为例。

若CC1通道配置为输出:
CCR1包含了装入当前捕获/比较1寄存器的值(预装载值)。
如果在TIMx_CCMR1寄存器(OC1PE位)中未选择预装载特性,写入的数值会被立即传输至当前寄存器中。否则只有当更新事件发生时,此预装载值才传输至当前捕获/比较1寄存器中。当前捕获/比较寄存器参与同计数器TIMx_CNT的比较,并在OC1端口上产生输出信号。
若CC1通道配置为输入:
CCR1包含了由上一次输入捕获1事件(IC1)传输的计数器值。

PWM输出相关的寄存器

所有PWM相关寄存器都在上文提到,PWM输出一般不需要触发中断,因此用不到DMA/中断使能寄存器 (TIMx_DIER)。

猜你喜欢

转载自blog.csdn.net/wei348144881/article/details/109091539