STM32定时器是 ST MCU 内部最基础且常用的外设,实际应用尤为普遍。去年,电堂推出了《STM32 TIMER基础及常规应用介绍》,为大家梳理了 STM32 TIMER 的庞大内容,涵盖 TIMER 的基本应用原理、常规应用等。现在将课程内容整理为文章,针对STM32定时器有基本了解的用户,分享具体的应用实现环节及常见问题解决。

STM32定时器除了基本计数定时功能外,还对外拓展了输入、输出通道,从而实现输入捕捉、比较输出功能。

输入捕获【Input Capture】基本原理:定时器针对外部输入信号或内部触发信号实行边沿捕捉;产生捕捉事件,并可以触发中断或DMA请求,同时记录捕捉时刻计数器的值。基于这个原理,配合计数器实时计数功能可以对捕捉信号进行脉冲宽度的测量,进而实现对周期性波形测量其周期或占空比,或者用来做通信解码。

具体到STM32定时器,输入捕获的功能主要靠捕捉比较单元来实现。输入捕获模式下:当捕获单元捕捉到外来有效信号边沿事件时【上升沿或下降沿】,将此刻计数器的值锁存到CCR影子寄存器并自动将CCR影子寄存器的值拷贝进CCR预装载寄存器,以供用户读取。

关于CCR寄存器,前面多次提到过。它也是由影子寄存器和预装寄存器组成,带预装使能控制位。在输入模式下,此时CCR对用户是只读的,不可对其进行修改、赋值。

什么信号可以作为捕捉信号?

两类信号可作为捕捉信号:

1. 来自定时器的各个输入通道的输入信号,比如TI1/TI2/TI3/TI4这些输入信号;

2. 内部触发输入信号,比如ITR0,ITR1,ITR3等,它们映射到各个输入捕捉通道;前面提到过ITR信号往往来自其它定时器的触发输出。

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

捕捉信号选择是指对可能作为输入捕获信号的信号进行选择,前面提到过了可能作为捕获信号的信号源有两大类;捕捉信号分频是指对将被用作捕获信号的信号进行分频,比如2分频、3分频等,分频之后送到捕捉功能模块去完成输入捕捉。

输入信号的滤波

1、外部引脚输入信号的滤波

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

用户要做的就是针对输入信号具体情况【频率、噪声等】,通过寄存器配置适当的滤波参数,选择适当采样时钟和采样次数,其它事情交给定时器硬件去处理。这样也可以减少因为做滤波而导致的软件开销。

假设我们让定时器对某输入通道的信号进行捕捉,捕捉极性为上升沿。设置滤波的采样时钟与定时器内部时钟频率一致,采样次数为4次。则每当捕捉到上升沿时,硬件连续根据采样频率来采样4次【包括发生捕捉触发沿的那一次】。如果4次采样结果均为高电平,则此次触发有效。并可以产生触发事件,该事件可以触发中断或DMA请求,同时捕捉单元将此刻计数器的值放入到捕捉比较寄存器CCR中。

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

2、内部触发输入信号ITRx作为输入捕捉信号

与输入捕获相关的事件

1. 捕获时刻的计数器值的锁存到对应捕获通道的CCRx寄存器;

2. 对应通道的捕获事件/中断标志会被置位;【CCxIF@TIMx_SR】;

3. 如果允许了 捕捉中断或DMA请求,可以触发中断或DMA请求,其它取决于CCxIE/CCxDE @TIMx_DIER的配置;

4. 如果发生连续的捕获事件,前次CCxIF没有清零的话会置位CCxOF@TIMx_SR;

5. 对于CCxIF标志可以软件清零或读取CCR来清零;

6. 可以通过置位CCxG@TIMx_EGR来软件触发输入捕获事件。

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

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

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

相应的定时器配置包括:

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

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

一种较特殊的测量脉宽及占空比的模式:

PWM输入模式

首先说说PWM输入模式工作原理:它是基于输入捕获定时器从模式相结合的一个具体应用;同一个外部输入引脚【仅限于TI1/TI2的】的输入滤波信号【TIxFPx】映射到2个捕捉通道【仅限于IC1/IC2】,且配置为相反的捕捉极性,即一个通道捕捉上沿,另一个通道捕捉下沿。

  • 定时器配置在复位从模式,外部输入的滤波信号TIxFPx作为定时器的触发信号。
  • 经过两次连续的捕捉即可方便地测得信号的周期及占空比。【前提:待测信号周期不长于当前定时器计数周期】

需要强调提醒的是:

  • PWM输入模式测量脉宽和占空比,该方法只适用于来自定时器通道1或通道2的TI1或TI2输入信号,而且输入捕捉通道1【 IC1 】与捕捉通道2【IC2 】配合使用。一路直接输入,一路间接输入。一路捕捉上升沿,一路捕捉下降沿。同时,输入信号经滤波和极性选择后提供触发信号给从模式控制器,让定时器工作在复位从模式。
  • 只有来自TI1或TI2的外来信号才能产生触发信号连接到从模式控制器。
  • 现有ST参考库代码也有最大时长问题。即待测信号周期超过ARR所对应的时间后,得考虑溢出事件的统计问题,须自行修改代码。

通过PWM输入模式测量脉宽和占空比,它有其测试方面的方便性。只需两次捕捉,无需过多运算即可得出脉冲的宽度与占空比。但也有其局限性,通道不能随意,还必须结合定时器的复位从模式。

如果我们不使用PWM输入模式测量脉冲宽度和占空比,往往就没有通道选择上的限制,可以一个通道也可以两个通道,自由度更大,也无须一定工作在从模式。但软件代码实现方面稍嫌麻烦点。

1、外部输入信号的直接输入与间接输入

该说法只存在于输入通道1与通道2之间或者通道3与通道4之间。

所谓直接输入,即各类输入信号经过滤波、极性选择或者分频之后连接到各自对应的输入捕获通道,这时就是直接输入。

如:TI1FP2就是通道2的间接输入信号,TI3FP4就是通道4的间接输入信号。换言之,通道1的输入捕捉信号并非一定来自TI1,而可能来自TI2的信号。请弄清这些细节,不然有些地方看不懂或不知配置。

2、关于输入捕获测量异常的提醒

实际应用过程中使用TIMER进行输入捕获测量时间失败者较常见,常见的原因可能有如下几方面:

1. 待测量的脉冲长于当前ARR所对应的时间,代码又没考虑溢出事件;

2. 使用PMW输入模式测量时选择了TI1/TI2以外的通道;

3. CCR寄存器整体上是可读可写的。但是,当相应通道配置为捕获输入时,CCR为只读寄存器,即用户不可修改或赋值。

4. 在发生捕获事件时,CCR影子寄存器的内容由硬件自动将其拷贝到CCR预装寄存器,以供用户或DMA读取。

stm32捕获占空比_「话说定时器系列」之六:STM32定时器输入捕获话题相关推荐

  1. spring boot 高性能批量新增_「SpringBoot DB系列」Jooq之新增记录使用姿势

    [SpringBoot DB 系列]Jooq 之新增记录使用姿势 接下来我们开始进入 jooq 的增删改查的使用姿势系列,本篇将主要介绍如何利用 jooq 来实现添加数据 I. 项目搭建 本项目借助S ...

  2. git 代码回退_「Vue 入门系列」第三期,适合新手入门的 Git 使用教程

    引言 Git 工具对于程序员来说已经不陌生了,在开发中也算是必不可少的工具了,本期我们就来看看如何利用 Git 管理代码,以及如何将代码提交到远程(线上) Github 仓库中. 主题:使用 Git ...

  3. 求长方形的周长和面积c语言两个函数_「长方形的周长」C语言初级-输入长方形的两边长a和b,求长方形的周长和面积 - 金橙教程网...

    长方形的周长 任务和代码/* *Copyright (c)2018,CSDN学院 *All rights reserved. *文件名称:main.c *作 者:解玉柱 *完成时间:2018年10月3 ...

  4. STM32 TIM定时器的使用(2)——输入捕获

    输入捕获实验是电容按键检测实验的前提所以需要先学习用TIM实现输入捕获 1.系列目录 基本计时实验 输入捕获实验(实验3的基础) 电容按键检测实验 输出PWM实验 PWM驱动无刷电机实验 2 .输入捕 ...

  5. stm32捕获比较通道是干嘛的_STM32第八章-TIM输入捕获

    在第七章我们介绍了 STM32 的定时器作为 PWM 输出的使用方法,这一章,我们将向大家介绍通用定时器作为输入捕获的使用.这个输入捕获在哪个地方会用到呢?如果你玩过小车就会知道小车的编码器测速就用到 ...

  6. 「真香系列」新物种首发亮相 聚划算爆款孵化玩法升级

    从普通商品到优质好物,差的便是那一句"真香". 2022聚划算99划算节,聚划算首发「真香系列」,为消费者精选了一批价格香.品质香.服务香的「十三香」好物.不过,聚划算的" ...

  7. 「想法题系列」逗比三角形-二分

    传送门:「想法题系列」逗比三角形-hzwer 题解 因为限制了盒子的宽,所以贪心让每个三角形尽量高(即让最短边紧贴盒子底面所在直线). 考虑把每个三角形竖着剖分成宽为 d d d的矩形. 将所有矩形降 ...

  8. 「性能优化系列」APP内存优化理论与实践

    当一个应用同时运行越来越多的任务以及复杂的业务,Android系统的内存管理机制已经无法满足内存的释放与回收,为了应用的稳定性与性能,去控制内存的创建和回收就成为了一个重要的命题. 本篇文章主要涉及内 ...

  9. 「春招系列」30张图理解HTTP在面试中所有会出现的题

    前言 又是一年金三银四,春招与跳槽热闹的开展着,而在面试过程中,HTTP 被提问的概率还是非常高的. 我搜集了 5 大类 HTTP 面试常问的题目,同时这 5 大类题跟 HTTP 的发展和演变关联性是 ...

最新文章

  1. 实例变量的访问及数据封装
  2. intel 汇编中断解释
  3. 《零基础》MySQL NULL 值处理(二十一)
  4. 互联网日报 | 2月23日 星期二 | 华为发布新一代折叠旗舰Mate X2;字节跳动游戏官网正式上线;携程设立轮值制度...
  5. 分区变为RAW的解决办法
  6. dubbo go中的TPS Limit设计与实现 滑动窗口、固定窗口有什么区别?
  7. Receive 163 mails
  8. JS 延时函数 setTimeout 或者 rxjs 写法
  9. 10年磨一剑,铸就里程碑之作,深度评测 米10 Ultra
  10. Safari兼容IE
  11. 红色警戒常用的快捷键
  12. 聚合支付与智能POS
  13. 【10.28 校内普及组】 小B浇花 题解
  14. 直播电商平台开发,video组件实现视频弹幕功能
  15. 深度学习-【语义分割】学习笔记4 膨胀卷积(Dilated convolution)
  16. CopyOnWriteArrayList
  17. 惠普电脑BIOS设置图文详细介绍
  18. ERP术语 英文对照(部分)(参考)
  19. 大B和小b的区别及关联
  20. 为什么能够通过type_id::create创建实例

热门文章

  1. java8学习之Function与BiFunction函数式接口详解
  2. ORACLE常用函数汇总【转】
  3. Web.config中注册用户控件和自定义控件
  4. Dell PowerEdge R610 iDRAC6 远程控制卡设置手册
  5. Linux系统安全概述-sudo授权-pam认证机制-对称加密-非对称加密-md5-数字证书
  6. ubuntu修改系统时区和jvm时区
  7. Java中Jedis连接Linux上的Redis出现connect time out(解决方案)
  8. 解决ssh或ftp下root用户认证失败问题
  9. css3 动画与display:none冲突的解决方案
  10. 解决springboot启动失败问题:Unable to start embedded container;