STM32 HAL库学习系列第7篇---定时器TIM 输入捕获功能

测量脉冲宽度或者测量频率

?

基本方法

1.设置TIM2?CH1为输入捕获功能;?

2.设置上升沿捕获;?

3.使能TIM2?CH1捕获功能;?

4.捕获到上升沿后,存入capture_buf[0],改为捕获下降沿;

?5.捕获到下降沿后,存入capture_buf[1],改为捕获上升沿;?

6.捕获到上升沿后,存入capture_buf[2],关闭TIM2?CH1捕获功能;?

7.计算:capture_buf[2]?-?capture_buf[0]就是周期,capture_buf[1]?-?capture_buf[0]就是高电平所占时间。

时钟配置:

引脚看是否需要上拉

做项目中的一个例子:

/**
  * 函数功能: TIM_IC配置
  * 输入参数: value
  * 返 回 值: 无
  * 说    明: 无
  */
void user_ic_config(uint16_t value)
{
    TIM_IC_InitTypeDef sConfigIC;
    if(value != 0)  //1
    {
        sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;//上升沿
    }
    else//0
    {
        sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING; //下降沿
    }
    sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
    sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
    sConfigIC.ICFilter = 0;
    HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1);
}

/**
  * 函数功能: TIM_IC回调函数
  * 输入参数: htim
  * 返 回 值: 无
  * 说    明: 得到转速
  */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    static uint32_t uwICValue;
    static uint32_t last_uwICValue;
    uint32_t uwDiffCapture;

    if ( ((htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)||(htim->Channel== HAL_TIM_ACTIVE_CHANNEL_4)) && (htim->Instance == TIM3) )
    {
        pulseCntr++;
        last_uwICValue = uwICValue;
        uwICValue = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
        if(HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_3) != HAL_OK)   //开启定时器中断
        {

        }

        if (uwICValue > last_uwICValue)
        {
            uwDiffCapture = (uwICValue - last_uwICValue);    //脉冲宽度为前后两个周期相减
        }
        else if (uwICValue < last_uwICValue)   //若超值
        {
            /* 0xFFFF is max TIM2_CCRx value */
            uwDiffCapture = ((0xFFFF - last_uwICValue) + uwICValue) + 1;
        }
        if(uwDiffCapture < 0x10000)
        {
            middleCapture = uwDiffCapture;   //脉冲宽度
        }
        pulsein_flag = 1;  // 捕捉到标记
    }
    else if ( (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) && (htim->Instance == TIM2) )
    {
        if(uhCaptureIndex == 0)
    {
            // 第一个脉冲,检测的是上升沿
      uwIC2Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
      uhCaptureIndex = 1;
            user_ic_config(0);  //下降
            if(HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1) != HAL_OK)   //中断
          {
          }
    }
    else if(uhCaptureIndex == 1)
    {
            uwIC2Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
            uhCaptureIndex = 0;
            user_ic_config(1);//上升
            if(HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1) != HAL_OK)
            {
            }

            /* Capture computation */
            if (uwIC2Value2 > uwIC2Value1)
            {
                uwDiffCapture = (uwIC2Value2 - uwIC2Value1);  //脉冲宽度
            }
            else if (uwIC2Value2 < uwIC2Value1)
            {
                /* 0xFFFF is max TIM2_CCRx value */
                uwDiffCapture = ((40000 - uwIC2Value1) + uwIC2Value2) + 1;
            }

            RCin = uwDiffCapture/2;   //删除
        }
  }
}

应用:

1.脉冲时间测量

2.电容按键使用

原文地址:https://www.cnblogs.com/Allen5G/p/11145912.html

时间: 2024-11-06 03:38:16

STM32 HAL库学习系列第7篇---定时器TIM 输入捕获功能的相关文章

STM32学习笔记11(通用定时器作为输入捕获2)

通用定时器作为输入捕获的使用.我们将用 TIM5 的通道 1 (PA0)来做输入捕获,捕获 PA0 上高电平的脉宽(用 WK_UP 按键输入高电平),通过串口打印高电平脉宽时间 输入捕获简介 输入捕获模式可以用来测量脉冲宽度或者测量频率. STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.STM32 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的

STM32 HAL库和LL库的区别

上次开发一个项目,使用一个小容量的STM32 ARM CORTEX核心的单片机,使用STM32CUBEMX自动生成配置代码,正准备编写程序的时候,发现容量竟然有6K多.这个容量在使用大容量FLASH的单片机时不感到什么,可是使用小容量单片机的时候,就明显不够用了. 没有办法,只好打算回去使用原来的StdLib库,前两年不就这么干的嘛,也没什么难的.可是回头找对应库的时候,发现悲剧了,没有这个序列的标准库. 这也难不倒我们老司机!我就从HAL库里面把必须的寄存器语句摘出来,把冗余的有效检验和冲突处

Intelli IDEA学习系列之快捷键篇

Intelli IDEA学习系列之快捷键篇 IDEA简介: IDEA 全称IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持.Ant.JUnit.CVS整合.代码审查. 创新的GUI设计等方面的功能可以说是超常的.IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主. 在学习过程中会慢慢补充..... [1.查找] 1

STM32学习笔记3(TIM输入捕获)

PWM 输入捕获模式< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" /> 一.概念理解 PWM输入捕获模式时输入捕获模式的特例 1.每个定时器有四个输入通道IC1.IC2.IC3.IC4,且IC1 IC2一组,IC3 IC4一组,并可是设置管脚和寄存器的对应关系 2.两个TI输出映射了两个ICx信号 3.这两个ICx信号分别在相反的极性边沿有效 4.两个边沿

STM32使用定时器实现输入捕获

输入捕获简介输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能. STM32的输入捕获,简单地说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将此刻定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获. 使用TIM2输入捕获的配置步骤:1.开启TIM2时钟,配置PA0为下拉输入.需要使用到PA0作为TIM2_CH1上面的脉冲输入.2.设

Spring Cloud学习系列第五篇【API网关服务】

这篇随笔接着学习微服务中一个比较重要的组件API网关服务.当我们微服务架构完成后最终是要提供给外部访问的,于是我们需要一个统一的访问入口,能隐藏我们内部服务URL细节,这就有点像局域网里那个网关的概念了,这是API网关服务就应运而生了.API网关作用有能为实现请求路由.负载均衡.校验过滤等基础功能,还能实现请求转发的熔断机制.服务集合等高级功能.补充下通常我们对外服务统一入口可以采用F5.Nginx等方式也能实现前面的请求路由与负载均衡,但是要实现后面功能了F5.Nginx就无能为力了吧,这就是

Boost库学习之旅入门篇

学习及使用Boost库已经有一段时间了,Boost为我的日常开发中带来了极大的方便,也使得我越来越依赖于boost库了.但boost功能太多,每次使用还是得翻看以前的 资料,所以为了以后可以更方便的使用,在此对常用的功能作一个总结,也希望以此与大家共勉. boost库下载,Svn地址: http://svn.boost.org/svn/boost/trunk 编译源码 编译boost库自带脚本解释工具: 使用vs自带命令行工具Visual Studio 命令提示(2010),运行bat脚本boo

STM32 HAL库 UART使用printf

// 添加这个函数 int fputc(int ch,FILE *f) { uint8_t temp[1]={ch}; HAL_UART_Transmit(&UartHandle,temp,1,2); } MDK设置:勾选Use Micro LIB 测试板子:STM32F746NG-DISCOVERY main.c文件 /* Includes ------------------------------------------------------------------*/ #include

STM32 HAL库 IIC 协议库函数

/* 第1个参数为I2C操作句柄 第2个参数为从机设备地址 第3个参数为从机寄存器地址 第4个参数为从机寄存器地址长度 第5个参数为发送的数据的起始地址 第6个参数为传输数据的大小 第7个参数为操作超时时间 */HAL_I2C_Mem_Write(&hi2c2,salve_add,0,0,PA_BUFF,sizeof(PA_BUFF),0x10); HAL_I2C_Mem_Write_IT(): HAL_I2C_Mem_Read(); HAL_I2C_Mem_Read_IT(); HAL_I2C