基本方法

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.电容按键使用
————————————————
版权声明:本文为CSDN博主「CodeAllen的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/super828/java/article/details/79598903

最新文章

  1. Jesse Livermore的21句投机至理名言
  2. 15.linux 中无法输入指令
  3. springMVC robots.txt 处理
  4. 序列化反序列化api(入门级)
  5. C++语言出现的bug
  6. 2.js基础
  7. Linux下VI的使用
  8. hexo资源--theme等
  9. 设置su和sudo为不需要密码
  10. ArrayList and LinkedList
  11. iOS开发手记 - iOS9.3 UINavigationController添加后不显示storyboard中viewcontroller里的控件的解决方法
  12. Spring Security 入门(1-7)Spring Security - Session管理
  13. 图解Tomcat
  14. win10个人助理conrtana软件能否支持用户反馈、后续优化
  15. Linux常用基本命令(paste)
  16. FIFO IP核
  17. RHEL7 MariaDB测试
  18. com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1169 &gt; 1024)
  19. CentOS7安装OpenStack(Rocky版)-04.安装Nova计算服务(控制节点)
  20. 七、java数组

热门文章

  1. 浅析Java三大特性封装、继承、多态,及作业分析
  2. 【集群实战】共享存储实时备份(解决nfs共享存储的单点问题)
  3. 解决Vue-cli3.0下scss文件编译过慢、卡顿问题
  4. TEC-004-php文件下载任意文件读取漏洞修复
  5. 谈谈JavaScript中的变量、指针和引用
  6. bfs—Catch That Cow—poj3278
  7. POJ 1287 Networking 垃圾题目
  8. C++ 函数重载,函数模板和函数模板重载,选择哪一个?
  9. OpenCV 4下darknet修改
  10. python:入门