博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32 HAL库学习系列第7篇---定时器TIM 输入捕获功能
阅读量:5227 次
发布时间:2019-06-14

本文共 3020 字,大约阅读时间需要 10 分钟。

12856594-a8518d7be3709d7a.webp.jpg

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

 

基本方法

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]就是高电平所占时间。

时钟配置:

image.png

引脚看是否需要上拉

image.png

做项目中的一个例子:

/**  * 函数功能: 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

你可能感兴趣的文章
迅为iTOP-4418开发板兼容八核6818开发板介绍
查看>>
HTML标签_1
查看>>
程序员的自我修养九Windows下的动态链接
查看>>
细说WebSocket - Node篇
查看>>
Extjs控件之 grid打印功能
查看>>
Jquery操作cookie,实现简单的记住用户名的操作
查看>>
【原创】大数据基础之Zookeeper(4)应用场景
查看>>
静态变量数组实现LRU算法
查看>>
中文系统 上传file的input显示英文
查看>>
比callback更简洁的链式执行promise
查看>>
android permission
查看>>
【译】在Asp.Net中操作PDF - iTextSharp - 使用字体
查看>>
.net 文本框只允许输入XX,(正则表达式)
查看>>
Python 第四十五章 MySQL 内容回顾
查看>>
实验2-2
查看>>
MongoDB遇到的疑似数据丢失的问题。不要用InsertMany!
查看>>
android smack MultiUserChat.getHostedRooms( NullPointerException)
查看>>
实用的VMware虚拟机使用技巧十一例
查看>>
监控工具之---Prometheus 安装详解(三)
查看>>
不错的MVC文章
查看>>