• STM32F4_TIM输入波形捕获(脉冲频率)


    Ⅰ、概述

    本文在前面文章“STM32基本的计数原理”的基础上进行拓展,讲述关于“定时器输入捕获”的功能,和上一篇文章“定时器比较输出”区别还是挺大的。在引脚上刚好相反:一个输入、一个输出。

    本文只使用一个TIM5通道3(也可其他通道)捕获输入脉冲的频率,通过捕获两次输入脉冲的间隔时间来计算脉冲波形的频率。间隔一定时间读取频率并通过串口打印出来。

    当然也可通过两路通道捕获脉冲信号的占空比,计划后期整理。

    笔者通过信号发生器产生信号,上位机串口助手显示捕获的脉冲频率。(没有信号发生器的朋友可以结合上一篇文章PWM输出做信号源:在同一块板子上也可以使用不同定时器,将输出引脚接在输入引脚)

    先看一下实例的实验现象

    关于本文的更多详情请往下看。

    Ⅱ、实例工程下载

    笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。

    笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。

    提供下载的软件工程是STM32F417的,但F4其他型号也适用(适用F4其他型号: 关注微信,回复“修改型号”)。

    STM32F4_TIM输入波形捕获(脉冲频率)实例:

    https://yunpan.cn/cB6XrSi6rK3TP  访问密码

    STM32F4资料:

    https://yunpan.cn/cR2pxqF5x2d9c  访问密码 53e7

    Ⅲ、原理描述

    笔者将TIM分为三大块:时基部分、比较输出和输入捕获,请看下面截图“通用TIM框图”。

    前面的文章已经将“时基部分”的一些基础知识讲述过了,“时基部分”的功能是比较有用的,它除了可以用来延时(定时)之外,它还可以拿来触发其他一些功能,如:触发DA转换、AD采集等。

    上一篇文章讲述的就是图中比较输出部分,比较输出部分功能相对比较简单。

    该文主要讲述“输入捕获”部分,这部分输入的通道12、通道34可以相互协作。该文只使用了TIM5的通道3,捕获输入信号频率。

    通用TIM框图:

    上面两图截取“STM32F4x5x7参考手册”建议下载手册参看。

    Ⅳ、源代码分析

    笔者以F4标准外设库(同时也建议初学者使用官方的标准外设库)为基础建立的工程,主要以库的方式来讲述。

    1.RCC时钟

    该函数位于bsp.c文件下面;

    本文提供的例程也可以使用TIM2(只要将例程源代码中使用到的TIM5改为TIM2,以及引脚改正过来就行)。

    重点注意:

    A.外设RCC时钟的配置要在其外设初始化的前面;

    B.匹配对应时钟。

    比如:RCC_APB2外设不要配置在RCC_APB1时钟里面

    【如:RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);这样能编译通过,但这是错误的代码】

    2.TIM输入捕获引脚配置

    该函数位于timer.c文件下面;

    注意2点:

    A.引脚与通道对应:这个需要参看“数据手册”,该文TIM5通道3对应的引脚就是PA2.

    B.复用配置:GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_TIM5);

    这个地方对于F1F0F4等的朋友需要注意,更加芯片系列及库的不同,他们之间存在一定的差异。

    3. TIM输入捕获配置

    该函数位于timer.c文件下面;

    “时基部分”是在前面两篇文章讲述过的,这里主要对“输入捕获”部分理解,主要5个参数:

    捕获通道:就是我们捕获的通道;

    捕获极性:就是我们捕获脉冲的高还是低电平;

    捕获选择:是直接捕获该通道,还是上面说的12通道协助捕获;

    捕获分频:对捕获的脉冲分频;

    捕获滤波:过滤掉波形;

    4. NVIC配置

    该函数位于bsp.c文件下面;

    这里不用多说,只是提醒大家不要忘记配置这里。

    5. 计算捕获波形频率原理

    该函数位于stm32f4xx_it.c文件下面;

    该函数是中断函数,也是计算频率重要的函数;

    A.两次捕获值

    捕获配置中,捕获的极性是高电平,这里就是在“上升沿”中断(捕获),如果配置为“下降沿”,则是在信号的下降沿中断。

    B.计算两次捕获差值

    这里常人理解都是: capture = (capture_value2 - capture_value1);

    但是,需要考虑另外两种情况,就是计数器在计满和相等时候。

    C.计算频率

    这里可以理解为:1秒钟计了多少个数。

    但是需要注意的是截图中“/2”,对系统时钟除2,原因在于RCCTIM提供的时钟就是除了2的,所以,这个地方需要/2.

    Ⅴ、说明

    关于笔者提供的软件工程实例,可关注微信,在会话框回复“关于工程”,有关于工程结构描述、型号修改等讲述。

    以上总结仅供参考,若有不对之处,敬请谅解。

    、最后

    更多精彩文章我讲第一时间在微信公众号里面分享。

    本着免费分享的原则,方便大家手机学习知识,定期在微信平台分享技术知识。如果你觉得分享的内容对你有用,又想了解更多相关的文章,请用微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,将有更多精彩内容等着你。

     

     

  • 相关阅读:
    【CF1009F】Dominant Indices(长链剖分优化DP)
    长链剖分学习笔记
    【洛谷5294】[HNOI2019] 序列(主席树维护单调栈+二分)
    【洛谷5286】[HNOI2019] 鱼(计算几何)
    【洛谷5292】[HNOI2019] 校园旅行(思维DP)
    【UVA1309】Sudoku(DLX)
    初学DLX
    【LOJ2461】「2018 集训队互测 Day 1」完美的队列(分块+双指针)
    【LOJ6062】「2017 山东一轮集训 Day2」Pair(线段树套路题)
    【LOJ6060】「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set(线性基)
  • 原文地址:https://www.cnblogs.com/strongerHuang/p/5662338.html
Copyright © 2020-2023  润新知