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

基本方法

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

时钟配置:

引脚看是否需要上拉

做项目中的一个例子:

  1. /**
  2. * 函数功能: TIM_IC配置
  3. * 输入参数: value
  4. * 返 回 值: 无
  5. * 说 明: 无
  6. */
  7. void user_ic_config(uint16_t value)
  8. {
  9. TIM_IC_InitTypeDef sConfigIC;
  10. if(value != 0) //1
  11. {
  12. sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;//上升沿
  13. }
  14. else//0
  15. {
  16. sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING; //下降沿
  17. }
  18. sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  19. sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
  20. sConfigIC.ICFilter = 0;
  21. HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1);
  22. }
  23. /**
  24. * 函数功能: TIM_IC回调函数
  25. * 输入参数: htim
  26. * 返 回 值: 无
  27. * 说 明: 得到转速
  28. */
  29. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
  30. {
  31. static uint32_t uwICValue;
  32. static uint32_t last_uwICValue;
  33. uint32_t uwDiffCapture;
  34. if ( ((htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)||(htim->Channel== HAL_TIM_ACTIVE_CHANNEL_4)) && (htim->Instance == TIM3) )
  35. {
  36. pulseCntr++;
  37. last_uwICValue = uwICValue;
  38. uwICValue = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
  39. if(HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_3) != HAL_OK) //开启定时器中断
  40. {
  41. }
  42. if (uwICValue > last_uwICValue)
  43. {
  44. uwDiffCapture = (uwICValue - last_uwICValue); //脉冲宽度为前后两个周期相减
  45. }
  46. else if (uwICValue < last_uwICValue) //若超值
  47. {
  48. /* 0xFFFF is max TIM2_CCRx value */
  49. uwDiffCapture = ((0xFFFF - last_uwICValue) + uwICValue) + 1;
  50. }
  51. if(uwDiffCapture < 0x10000)
  52. {
  53. middleCapture = uwDiffCapture; //脉冲宽度
  54. }
  55. pulsein_flag = 1; // 捕捉到标记
  56. }
  57. else if ( (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) && (htim->Instance == TIM2) )
  58. {
  59. if(uhCaptureIndex == 0)
  60. {
  61. // 第一个脉冲,检测的是上升沿
  62. uwIC2Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
  63. uhCaptureIndex = 1;
  64. user_ic_config(0); //下降
  65. if(HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1) != HAL_OK) //中断
  66. {
  67. }
  68. }
  69. else if(uhCaptureIndex == 1)
  70. {
  71. uwIC2Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
  72. uhCaptureIndex = 0;
  73. user_ic_config(1);//上升
  74. if(HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1) != HAL_OK)
  75. {
  76. }
  77. /* Capture computation */
  78. if (uwIC2Value2 > uwIC2Value1)
  79. {
  80. uwDiffCapture = (uwIC2Value2 - uwIC2Value1); //脉冲宽度
  81. }
  82. else if (uwIC2Value2 < uwIC2Value1)
  83. {
  84. /* 0xFFFF is max TIM2_CCRx value */
  85. uwDiffCapture = ((40000 - uwIC2Value1) + uwIC2Value2) + 1;
  86. }
  87. RCin = uwDiffCapture/2; //删除
  88. }
  89. }
  90. }

应用:

1.脉冲时间测量

2.电容按键使用

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

  1. STM32 HAL库学习系列第6篇---定时器TIM 级联配置

    应用情景 使用定时器配置编码器模式,发现STM32只有两个定时器是32位,16位的测量值不够用,发现是可以使用两个16位定时器级联为32位的. 我是在使用编码器计数电机转速时使用,但是最终实现的效果不 ...

  2. STM32 HAL库学习系列第5篇 定时器TIM---编码器接口模式配置

    cube基本配置,外设开启编码器,串口2 可能大家在设置的时候有这个错误 错误:error:  #20: identifier "TIM_ICPOLARITY_BOTHEDGE" ...

  3. STM32 HAL库学习系列第4篇 定时器TIM----- 开始定时器与PWM输出配置

    基本流程: 1.配置定时器 2.开启定时器 3.动态改变pwm输出,改变值  HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); 函数总结: __HAL_TIM ...

  4. STM32 HAL库学习系列第8篇---回调函数总结

    普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数 对普通函数的调用: 调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返 ...

  5. STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置

    ADC工作均为非阻塞状态 轮询模式 中断模式 DMA模式 库函数: HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);//轮询模式,需放 ...

  6. STM32 HAL库学习系列第3篇 常使用的几种延时方式

    1   自带的hal_delay 函数    毫秒级延迟 void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = HAL_GetTick( ...

  7. STM32 HAL库学习系列第2篇 GPIO配置

    GPIO 库函数 基本就是使用以下几个函数 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void H ...

  8. STM32 HAL库学习系列---定时器TIM 输入捕获功能

    基本方法 1.设置TIM2 CH1为输入捕获功能: 2.设置上升沿捕获: 3.使能TIM2 CH1捕获功能: 4.捕获到上升沿后,存入capture_buf[0],改为捕获下降沿: 5.捕获到下降沿后 ...

  9. 【书籍连载】《STM32 HAL 库开发实战指南—基于F7》-第一章

    从今天起,每天开始连载一章<STM32 HAL 库开发实战指南—基于F7>.欢迎各位阅读.点评.学习. 第1章  如何使用本书 1.1  本书的参考资料 本书参考资料为:<STM32 ...

随机推荐

  1. HDU - 2294 Pendant (DP滚动数组降维+矩阵高速功率)

    Description On Saint Valentine's Day, Alex imagined to present a special pendant to his girl friend ...

  2. WPF 验证错误模板

    <Window x:Class="BindingExam.MainWindow"        xmlns="http://schemas.microsoft.co ...

  3. java.text.MessageFormat 专题

    java.text.MessageFormat类MessageFormat提供一种语言无关的方式来组装消息,它允许你在运行时刻用指定的参数来替换掉消息字符串中的一部分.你可以为MessageForma ...

  4. redis zincrby zadd 遇到的问题

    在维护代理池时 报错1: zincrby(REDIS_KEY,proxy,-1)redis.exceptions.ResponseError: value is not a valid float 查 ...

  5. 快速写入Xml文件

    我们在做一些操作的时候会需要生成日志,Xml文件就是我们常用的一种日志文件. 普通操作Xml文件的代码遇到大数据量的话就很慢了. 用这个生成Xml文件的话,即使数据量很大,也很快 private vo ...

  6. SQL Server 事务复制分发到订阅同步慢

    原文:SQL Server 事务复制分发到订阅同步慢 最近发现有一个发布经常出现问题,每几天就出错不同步,提示要求初始化.重新调整同步后,复制还是很慢!每天白天未分发的命令就达五六百万条!要解决慢的问 ...

  7. SQLServer 复制中移除和添加发布而不初始化所有项目

    原文:SQLServer 复制中移除和添加发布而不初始化所有项目 -- 若提前"禁止架构更改",新增的列不会自动添加大发布,此时应使用 sp_articlecolumn 添加列 E ...

  8. grep专题

    grep -R --include="*.cpp" key dir[指定文件的扩展名] 上述命令的含义: 在dir目录下递归查找所有.cpp文件中的关键字key grep -r m ...

  9. Android零基础入门第82节:Activity数据回传

    上一节学习了将简单的数据从MainActivity传递到SecondActivity,本节一起来学习数据如何从SecondActivity回传到MainActivity. 一.简介 前面己经提到,Ac ...

  10. Microsoft .NET Framework 3.5 SP1安装错误 1603

    ghost版安装时由于系统简化引起上述错误,你按下面方法试一下1.点击电脑桌面右下角的“开始”按钮,点击“运行”按钮,在弹出的节目输入框中输入“regedit”.2.在弹出来的“注册表编辑器”界面上, ...