STM32 --通用定时器输入捕获功能

问题:

开始的时候没有搞清楚 定时器时基定时器溢出中断的概念,导致在计算频率的时候一直有问题。

开始并没有怀疑是配置有问题,因为之前接触过定时器输入捕获功能,靠着自己的记忆配置了一下,认为 捕获功能 的定时是通过定时器设置的定时溢出频率来计算的(真心抽自己两巴掌)。结果导致问题的发生。

真的是这些东西最好是通过博客的方式记录下来,方便自己,方便他人。

现在让我们重新回顾一下这个功能:通用定时器输入捕获。

内部定时器结构

STM32定时器系列 - STM32常规定时器时基与时钟源 这篇博文中,我们讲述过,定时器的结构。

其实我们只需要看这张图就可以了:
在这里插入图片描述
看流程的走向,由 时钟源 提供时钟 到 时间基(一般时钟源都是选择内部的CLK)
在这里插入图片描述
这里需要注意的就是看定时器时挂在那个总线下的,APB1 与 APB2 CLK不一样。

然后流向 输入捕获 的只有 PSC(预分配器) 并没有 重装载寄存器,因此,采样的频率就是定时器经过预分配器之后的频率,与重装载无关。

输入捕获【Input Capture】基本原理

定时器针对外部输入信号或者内部触发信号实现"边沿捕获";产生捕捉事件,并可以触发中断或者DMA请求,同时记录捕捉时刻计数器的值,基于这个原理,配合计数器实时计数器功能可以对捕捉信号进行脉冲宽度的测量,进而实现对周期性波形测量其周期与占空比,或者用来做通信解码(红外通信解码)。
在这里插入图片描述
具体到我们的定时器,输入捕获的功能主要是靠捕获比较单元来实现。输入捕获模式下:当捕获单元捕获到外来有效信号边沿事件【上升沿或者下降沿】,将此刻计数器的值锁存到CCR影子寄存器并自动将CCR影子寄存器的值拷贝进CCR预装寄存器,以供用户读取。

关于CCR寄存器,它是由影子寄存器与预装寄存器组成,带预装使能控制位。在输入模式下,此时CCR对用户是只读的,不可对其修改、赋值。

外部输入信号作为输入捕获信号,往往需要经过如下几个阶段:一般经过滤波,边沿检测,极性选择,捕获信号选择,捕获信号分频,最终进入捕获功能模块从而实现输入捕获。其中边沿检测、极性选择确定捕获单元对捕获信号的捕获极性,即捕获上升沿还是下降沿,甚至双边沿。

捕获信号选择是指:对输入捕获信号的信号进行选择,即前面提到过的作为捕获信号的信号源有两大类;
捕获信号分频是指对将被用作捕获信号的信号进行分频,比如2分频,3分频等,分频之后送到捕获功能模块去完成输入捕获。
(这里如果输入信号频率大于采样频率就可以采用捕获信号分频的方法降低信号频率,达到可以采集的目标,计算结果后,在乘以分频系数)

外部输入信号的滤波

为了防止因为输入信号上的噪声或边沿抖动而导致误计数、误触发,我们可以针对外部输入信号进行合适的滤波。

用户要做的就是针对输入信号具体情况【频率、噪声等】,通过寄存器配置适当的滤波参数,选择适当采样时钟和采样次数,其它事情交给定时器硬件去处理。这样也可以减少因为做滤波而导致的软件开销。
在这里插入图片描述
在这里插入图片描述
假设我们让定时器对某输入通道的信号进行捕捉,捕捉极性为上升沿。设置滤波的采样时钟与定时器内部时钟频率一致,采样次数为4次。则每当捕捉到上升沿时,硬件连续根据采样频率来采样4次【包括发生捕捉触发沿的那一次】。如果4次采样结果均为高电平,则此次触发有效。并可以产生触发事件,该事件可以触发中断或DMA请求,同时捕捉单元将此刻计数器的值放入到捕捉比较寄存器CCR中。

当然,如果捕捉到触发边沿后,没法做到连续4次采样均为高电平,则该触发无效,将会被丢弃。这样达到滤除噪声的目的。

内部触发输入信号【ITRx】作为输入捕获信号

在这里插入图片描述
在这里插入图片描述

与输入捕获相关的事件

  1. 捕获时刻的计数器值锁存到对应捕获通道的CCRx寄存器。
  2. 对应通道的捕获事件/中断会被置位;【CCxIF@TIMx_SR】
  3. 如果允许了捕获中断或者DMA请求,可以触发中断或者DMA请求。取决于【CCxIE/CCxDE@TIMx_DIER】配置。
  4. 如果运行连续捕获事件,前一次没有清零的话会置位【CCxOF@TIMx_SR】
  5. 对于CCxIF标志可以软件清零或者读取CCR来清零。
  6. 可以通过设置位【CCxG@TIMx_EGR】来软件触发输入捕获事件。

与输入捕获相关的事件主要就这些,我们要做到心中有数。只要了解它们后,在我们的定时器的实际应用中才能灵活使用它们,实现我们需要的功能。如在发生输入捕获事件时,利用相关中断或DMA请求实现其它功能,比如做数据的更新、ADC的启动、其它定时器的启动等等。

通过输入捕获测量脉冲周期

在输入捕捉模式下,定时器可用于测量外部信号周期。根据定时器时钟、预分频器和定时器分辨率,可推导出最大测量周期。

相应的定时器配置包括:

  1. 通过对CCMRx 寄存器中的 CCxS 位选择有效输入。
  2. 根据需要,通过对 CCMRx 寄存器中的 IC1F[3:0] 位执行操作以编程滤波器参数,并通过对IC1PSC[1:0] 位执行写操作以编程预分频器。
  3. 通过对 CCxNP/CCxP 位执行写操作选择极性,即选择上升沿触发、下降沿触发或边沿触发。

当输入通道检测到相应的信号发生跳变时,可使用输入捕捉模块进行捕捉。要获取外部信号周期,需连续进行两次捕捉,通过将两次捕捉到的值相减可计算得到周期。

对于单沿捕捉,计数器采用向上计数模式,待测信号不长于计数器的计数周期时:

假设两次连续捕捉值为 CCRx_tn 和 CCRx_tn+1
● 如果 CCRx_tn < CCRx_tn+1:捕捉宽度= CCRx_tn+1 - CCRx_tn
● 如果 CCRx_tn > CCRx_tn+1:捕捉宽度= (ARR_max - CCRx_tn) + CCRx_tn+1

如果待测信号周期长于当前计数器周期的话,需要考虑溢出问题。实际应用中有时因为忽略了这点而导致测试不正确。

  • 21
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值