你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】stm32Cubemx实用篇(二):定时器捕获功能实现SR04超声波测距

[复制链接]
STMCU小助手 发布时间:2022-3-9 22:00
一、SR04使用方法
SR04实物

~R@QV6@9F5SDGBINGT4.png

1、工作原理

}N$F1MY1Q`]ZLT{54HEDBI0.png

2、接口定义和使用方法

0_D~GA{7N`8DQ7Z6FV0W(`K.png

3、注意事项

1:此模块不宜带电连接,如果要带电连接,则先让模块的 Gnd 端先连接。否则会影响
模块工作。
2:测距时,被测物体的面积不少于 0.5 平方米且要尽量平整。否则会影响测试结果。

二、Cubemx参数配置
1、时钟配置

7R[G{%HOUU0IX3$G5D5~S2O.png

2、定时器输入捕获设置

设置定时器输入捕获:内部时钟、预分频为240、双边沿触发

具体设置如下图所示:

6`S1[55R731P~RH4BQR%_WO.png

三、MDK代码修改与运行
1.输入捕获函数实现

HAL库给我们提供了一个输入捕获回调函数,我们只需要重写这个函数,实现测量接受端口高电平持续时间即可。
代码如下(示例):

  1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
  2. {
  3. static uint32_t capture_buf[2]={0,0}; //计数器缓存
  4. static uint8_t capture_cnt=0;   //循环次数
  5. static uint32_t high_time;    //高电平时间,超声波来回一次的时间,us
  6. /* Prevent unused argument(s) compilation warning */
  7. UNUSED(htim);
  8. //需要发送完触发信号后先开启上升沿捕获
  9. if(TIM12== htim->Instance)
  10. {
  11. if(HAL_TIM_ACTIVE_CHANNEL_2 == htim->Channel)
  12. {
  13. switch(capture_cnt)
  14. {
  15. case 0://捕获到上升沿,记录下来当前时间
  16. capture_buf[0]= __HAL_TIM_GET_COMPARE(htim,TIM_CHANNEL_2);
  17. __HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_FALLING); //开启捕获下降沿
  18. capture_cnt++;
  19. break;
  20. case 1://捕获到下降沿,记录下此刻时间
  21. capture_buf[1]= __HAL_TIM_GET_COMPARE(htim,TIM_CHANNEL_2);
  22. capture_cnt=0;
  23. HAL_TIM_IC_Stop_IT(htim,TIM_CHANNEL_2); //停止捕获
  24. high_time = capture_buf[1]- capture_buf[0];
  25. if(capture_buf[1]>capture_buf[0])printf("ultrasonic DIST = %.1fCM\r\n",17.0*high_time/1000);
  26. break;
  27. default: break;
  28. }        
  29. }
  30. }
  31. }
复制代码

2.主函数实现
这里在主函数增加了按键扫描通过按键控制SR04测量距离。
另外还增加了串口printf函数,打印出测量到的距离。

代码如下(示例):
  1. key=KEYPRESS();    //按键
  2. if(key==1)//如果按键按下则进行一次测距
  3. {
  4. //发送>10us的超声波trig信号
  5. HAL_GPIO_WritePin(GPIOG, GPIO_PIN_11,GPIO_PIN_SET);
  6. HAL_Delay(1);
  7. HAL_GPIO_WritePin(GPIOG, GPIO_PIN_11,GPIO_PIN_RESET);
  8. __HAL_TIM_SET_CAPTUREPOLARITY(&htim12,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);  //开启上升沿捕获
  9. HAL_TIM_IC_Start_IT(&htim12,TIM_CHANNEL_2);  //开启输入捕获中断
  10. }
复制代码

可以看到按键按下后能够正确测出距离。

JWF3IQ~Z{OB_85~J4Y}J643.png
收藏 评论0 发布时间:2022-3-9 22:00

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版