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

STM32的超声波测距程序

[复制链接]
STMCU 发布时间:2020-9-14 11:08
我所使用的测距模块是HC-SR04,C-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测

距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。


HC-SR04基本工作原理:
(1)采用IO口TRIG触发测距,给最少10us的高电平信呈。
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回, 通过IO口ECHO输出一个高电平, 高电平持续的时间就是超声波从发射到返回的时间。 测试距离=(高电平时间*声速(340M/S))/2。


程序编写思路是:
1、配置好使用到的GPIO以及定时器;
2、给模块TRIG端口发送大于10us的高电平信号,当收、收到ECHO回响信号是,打开定时器开始定时;
3、当回响信号消失,关闭定时器;
4、通过定时器定时时间来确定距离。


20200914110443.b83b784b010232ade30d0d46b19a0350.png


上时序图表明你只需要提供一个 10uS以上脉冲触发信号,该模块内部将发出8个 40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。 由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。 公式: uS/58=厘米或者uS/148=英寸; 或是: 距离=高电平时间*声速( 340M/S) /2; 建议测量周期为 60ms以上, 以防止发射信号对。

回响信号的影响

具体程序如下:
  1. <font style="font-size: 18px">#include "cs.h"
  2. #include "stm32f10x.h"
  3. #include "delay.h"
  4. #include "usart.h"

  5. /*记录定时器溢出次数*/
  6. uint overcount=0;</font>
  7. <font style="font-size: 18px">
  8. /*设置中断优先级*/
  9. void NVIC_Config(void)
  10. {
  11. NVIC_InitTypeDef NVIC_InitStructer;

  12. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  13. NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority=0;
  14. NVIC_InitStructer.NVIC_IRQChannelSubPriority=0;
  15. NVIC_InitStructer.NVIC_IRQChannel=TIM2_IRQn;
  16. NVIC_InitStructer.NVIC_IRQChannelCmd=ENABLE;

  17. NVIC_Init(&NVIC_InitStructer);
  18. }

  19. /*初始化模块的GPIO以及初始化定时器TIM2*/
  20. void CH_SR04_Init(void)
  21. {
  22. GPIO_InitTypeDef GPIO_InitStructer;
  23. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;

  24. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
  25. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  26. /*TRIG触发信号*/
  27. GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
  28. GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
  29. GPIO_InitStructer.GPIO_Pin=GPIO_Pin_8;
  30. GPIO_Init(GPIOB, &GPIO_InitStructer);

  31. /*ECOH回响信号*/
  32. GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  33. GPIO_InitStructer.GPIO_Pin=GPIO_Pin_9;
  34. GPIO_Init(GPIOB, & GPIO_InitStructer);

  35. /*定时器TIM2初始化*/
  36. TIM_DeInit(TIM2);
  37. TIM_TimeBaseInitStructer.TIM_Period=999;//定时周期为1000
  38. TIM_TimeBaseInitStructer.TIM_Prescaler=71; //分频系数72
  39. TIM_TimeBaseInitStructer.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
  40. TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up;
  41. TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer);

  42. TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启更新中断
  43. NVIC_Config();
  44. TIM_Cmd(TIM2,DISABLE);//关闭定时器使能

  45. }

  46. float Senor_Using(void)
  47. {
  48. float length=0,sum=0;
  49. u16 tim;
  50. uint i=0;
  51. /*测5次数据计算一次平均值*/
  52. while(i!=5)
  53. {
  54. PBout(8)=1; //拉高信号,作为触发信号
  55. delay_us(20); //高电平信号超过10us
  56. PBout(8)=0;
  57. /*等待回响信号*/
  58. while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==RESET);
  59. TIM_Cmd(TIM2,ENABLE);//回响信号到来,开启定时器计数

  60. i+=1; //每收到一次回响信号+1,收到5次就计算均值
  61. while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==SET);//回响信号消失
  62. TIM_Cmd(TIM2,DISABLE);//关闭定时器

  63. tim=TIM_GetCounter(TIM2);//获取计TIM2数寄存器中的计数值,一边计算回响信号时间

  64. length=(tim+overcount*1000)/58.0;//通过回响信号计算距离

  65. sum=length+sum;
  66. TIM2->CNT=0; //将TIM2计数寄存器的计数值清零
  67. overcount=0; //中断溢出次数清零
  68. delay_ms(100);
  69. }
  70. length=sum/5;
  71. return length;//距离作为函数返回值
  72. }

  73. void TIM2_IRQHandler(void) //中断,当回响信号很长是,计数值溢出后重复计数,用中断来保存溢出次数
  74. {
  75. if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
  76.   {
  77. TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志
  78. overcount++;
  79.   }
  80. }
  81. </font>
复制代码

上面的代码是超声波测距的代码,cs.h是头文件,内容如下:
  1. #ifndef _CS_H
  2. #define _CS_H

  3. #include "sys.h"
  4. #define uint unsigned int
  5. #define TRIG_Send  PBout(8)
  6. #define ECHO_Reci  PBin(9)

  7. void CH_SR04_Init(void);
  8. float Senor_Using(void);
  9. void NVIC_Config(void);
  10. #endif
复制代码


这些代码已经能够测距了,Senor_Using()返回值就是距离。具体如何把测得数据显示,就按照各自需求来做就行了。


收藏 评论2 发布时间:2020-9-14 11:08

举报

2个回答
乐天乐 回答时间:2020-9-14 13:33:39
长知识
w0130160 回答时间:2020-9-15 09:29:39
学习

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

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