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

发布者:明石轩最新更新时间:2019-06-21 来源: eefocus关键字:STM32  HAL库  定时器  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;   //删除

        }

  }

}


关键字:STM32  HAL库  定时器  TIM  输入捕获功能 引用地址:STM32 HAL库学习系列第7篇---定时器TIM 输入捕获功能

上一篇:STM32CubeMX学习笔记——STM32H743通用定时器
下一篇:基于STM32CubeMX的LL库学习记录(六)TIM1定时器设置

推荐阅读最新更新时间:2024-11-11 14:28

STM32学习笔记(五)---NVIC
F407在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和中断,其中系统异常有10个,中断有82个。 一、NVIC简介 NVIC是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。 在配置中断的时候一般只用ISER、ICER和IP这三个寄存器,ISER用来使能中断,ICER用来失能中断,IP用来设置中断的优先级。 二、中断优先级 优先级定义 NVIC有一个专门的中断优先级寄存器NVIC_IPRx,来配置外部中断的优先级,IPR宽度为8bit,原则上每个外部中断可配置的优先级为0-255,数值越小,优先级越高。 F407中只使用了高4位,bit 表达优先级的这4b
[单片机]
<font color='red'>STM32</font>学习笔记(五)---NVIC
STM32 控制4位共阳数码管输出计数
用到GPIO口 PA0~PA11共12个引脚 先上原理图 因为是共阳所以12,9,8,6为电源输入,其他引脚均为接地,所以对于芯片来说12,9,8,6高位输出,其他设定为低位即可。 //设定下GPIO口 void GPIO_Num_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); GPIO_InitStructure.GPI
[单片机]
<font color='red'>STM32</font> 控制4位共阳数码管输出计数
KST-STM32学习之PWM实现的各种途径(软件硬件+通用高级定时器)
一、STM32的通用定时器介绍 STM32F103ZE 拥有 TIM2、TIM3、TIM4 和 TIM5 共 4 个通用定时器。 STM32F103C8拥有TIM2/TIM3/TIM4这三个通用定时器 通用定时器除了具备基本定时器的向上计数器功能外,还可以向下、向上/向下计数。 此外还具备独立通道,能够实现输入捕获、输出比较、PWM 输出、单脉冲输出的功能。 二、输出比较产生PWM 1、产生PWM的几种方式 ①、硬件实现。比如STM32 自带的 PWM 输出功能。 注意了,硬件实现的时候,外部接线需要接到通用定时器的外部通道上! ②、通用定时器的输出比较实现软件的PWM,这个软件产生的PWM要比
[单片机]
TIM通用定时器:PWM输入捕获模式
一、概念理解 PWM输入捕获模式是输入捕获模式的特例,自己理解如下 1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3 IC4一组。并且可是设置管脚和寄存器的对应关系。 2. 同一个TIx输入映射了两个ICx信号。 3. 这两个ICx信号分别在相反的极性边沿有效。 4. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。 5. 当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获 一个PWM周期(即连续的两个上升沿或下降沿) ,它等于包含TIM 时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。 6. 同样另一个捕获通道捕获触发信号和下一个相
[单片机]
STM32的 USART1 用 DMA 方式发送与接收
USART1的DMA发送比较简单,在要发送之前,重新设置好DMA_BufferSize的大小,然后启动DMA就行了。不过在设置这一值时,得先关闭DMA通道。代码如下: DMA_ClearFlag(DMA1_FLAG_TC4); //清DMA发送完成标志 DMA_Cmd(DMA1_Channel4, DISABLE); //停止DMA DMA1_Channel4- CNDTR = sizeof(TxBuffer1) / sizeof(TxBuffer1 );//重设传输长度 DMA_Cmd(DMA1_Channel4, ENABLE); //启动DMA USART1的DMA接收:如果向USART1发
[单片机]
ATmega64 看门狗定时器
看门狗定时器 看门狗定时器由独立的1 Mhz 片内振荡器驱动。这是VCC = 5V 时的典型值。请参见特性 数据以了解其他VCC 电平下的典型值。通过设置看门狗定时器的预分频器可以调节看门狗 复位的时间间隔,如 P54Table 22 所示。看门狗复位指令WDR 用来复位看门狗定时器。 此外,禁止看门狗定时器或发生复位时定时器也被复位。复位时间有8 个选项。如果没有 及时复位定时器,一旦时间超过复位周期, ATmega64 就复位,并执行复位向量指向的 程序。具体的看门狗复位时序见P50。 为了防止无意之间禁止看门狗定时器或改变了复位时间,根据熔丝位M103C 和 WDTON 芯片提供了3 个不同的保护级别,如Table 21
[单片机]
ATmega64 看门狗<font color='red'>定时器</font>
STM32 模拟I2C (STM32F051)
/** ****************************************************************************** * @file i2c simu.c * @brief simulation function * @CPU STM32F051 * @compiler Keil uVision V4.74 * @author MetalSeed * @copyright WSHHB * @version V1.0.0 * @date 18-Sept-2014 * @modifydate20-Sept-2014 ***
[单片机]
STM32之一 建立工程及led闪烁
摸索了好久,今天终于实现了自己的工程模板,首先看下我的工程结构: 我的工程文件夹建立了五个文件夹,CMSIS、Libraries、Project、Startup、USER。里面分别存放了各自的初始文件, 关于MDK中的工程树情况如上图,分别在各自的文件夹下存放各自的文件,我们采用的是模块化编程,例如编写led程序就建立led.h和led.c文件,添加至工程,另外建立了延时函数文件,即delay.c和delay.h文件,而且这文件以后都可以用在其他工程中,led灯闪烁即led.c中, 首先要建立GPIO对象,然后首先要进行时钟使能,然后对GPIO进行初始化,下面来看led.h文件: 关键是中间的两个宏定义,定义ledon代表了
[单片机]
<font color='red'>STM32</font>之一 建立工程及led闪烁
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved